树莓派_Linux串口编程_实现自发自收
串口是计算机上一种很通用设备通信的协议,经常使用PC机上包括的是RS232规格的串口,具有连接线少,通讯简单,得到广泛的使用。
Linux对全部设备的訪问是通过设备文件来进行的,串口也是这样,为了訪问串口,仅仅需打开其设备文件就可以操作串口设备。在linux系统以下,每个串口设备都有设备文件与其关联,设备文件位于系统的/dev文件夹以下。如linux下的/ttyS0,/ttyS1分别表示的是串口1和串口2。树莓派UARTport的位置:见下图的GPIO14(TXD)、GPIO 15(RXD)
本文是基于树莓派的环境,树莓派中能够使用串口/dev/ttyAMA0
要使用这个串口,必须先进行设置:
1.改动/boot/cmdline.txt输入以下指令:sudo nano /boot/cmdline.txt删除红色部分:dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait终于变为dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait2.改动/etc/inittab输入以下指令:sudo nano /etc/inittab凝视掉最后一行内容:#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
OK、重新启动下raspberry pi如今就能够自己编敲代码測试串口了。我是把TXD与RXD短接,实现自发自收的。
程序例如以下:
recv.h
#ifndef _RECV_H
#define _RECV_H #include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h> #define BAUDRATE B115200 ///Baud rate : 115200
#define DEVICE "/dev/ttyAMA0"
#define SIZE 1024 #endifrecv.c
#include "Recv.h" int nFd = 0;
struct termios stNew;
struct termios stOld; //Open Port & Set Port
int SerialInit()
{
nFd = open(DEVICE, O_RDWR|O_NOCTTY|O_NDELAY);
if(-1 == nFd)
{
perror("Open Serial Port Error!\n");
return -1;
}
if( (fcntl(nFd, F_SETFL, 0)) < 0 )
{
perror("Fcntl F_SETFL Error!\n");
return -1;
}
if(tcgetattr(nFd, &stOld) != 0)
{
perror("tcgetattr error!\n");
return -1;
} stNew = stOld;
cfmakeraw(&stNew);//将终端设置为原始模式,该模式下全部的输入数据以字节为单位被处理 //set speed
cfsetispeed(&stNew, BAUDRATE);//115200
cfsetospeed(&stNew, BAUDRATE); //set databits
stNew.c_cflag |= (CLOCAL|CREAD);
stNew.c_cflag &= ~CSIZE;
stNew.c_cflag |= CS8; //set parity
stNew.c_cflag &= ~PARENB;
stNew.c_iflag &= ~INPCK; //set stopbits
stNew.c_cflag &= ~CSTOPB;
stNew.c_cc[VTIME]=0; //指定所要读取字符的最小数量
stNew.c_cc[VMIN]=1; //指定读取第一个字符的等待时间,时间的单位为n*100ms
//假设设置VTIME=0,则无字符输入时read()操作无限期的堵塞
tcflush(nFd,TCIFLUSH); //清空终端未完毕的输入/输出请求及数据。
if( tcsetattr(nFd,TCSANOW,&stNew) != 0 )
{
perror("tcsetattr Error!\n");
return -1;
} return nFd;
} int main(int argc, char **argv)
{
int nRet = 0;
char buf[SIZE]; if( SerialInit() == -1 )
{
perror("SerialInit Error!\n");
return -1;
} bzero(buf, SIZE);
while(1)
{
nRet = read(nFd, buf, SIZE);
if(-1 == nRet)
{
perror("Read Data Error!\n");
break;
}
if(0 < nRet)
{
buf[nRet] = 0;
printf("Recv Data: %s\n", buf);
}
} close(nFd);
return 0;
}上面的是接受程序,能够接受字符串信息并打印,发送程序跟上面一样,仅仅要把read改为write即可了,这里就不记录了。
程序执行结果:
參考文档:
http://blog.csdn.net/leaglave_jyan/article/details/6656389
http://www.ibm.com/developerworks/cn/linux/l-serials/index.html
树莓派_Linux串口编程_实现自发自收的更多相关文章
- 树莓派4B串口测试与开发
参考文档: https://shumeipai.nxez.com/2021/08/09/raspberry-pi-4-activating-additional-uart-ports.html 树莓派 ...
- storysnail的Linux串口编程笔记
storysnail的Linux串口编程笔记 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据Ge ...
- storysnail的Windows串口编程笔记
storysnail的Windows串口编程笔记 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据 ...
- Linux下串口编程【转】
本文转载自:http://blog.csdn.net/w282529350/article/details/7378388 /************声明:本人只是见到这篇文章对我帮助很大才转载的,但 ...
- c# 实现串口编程-操作LED屏幕
串口编程主要用到SerialPort这个类,主要实现对串口发送字节数组然后点阵屏显示相关信息,其实这个功能很简单下面给大家把整体思路用流程图展现如下:. 其实整体思路就如流程图.下面是整个流程图的一个 ...
- PB串口编程资料(转)
----MSCOMM32参数基本介绍2008年03月29日 星期六 上午 11:37MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能.MSComm控件在串口编程时非常方便,程序 ...
- Linux串口编程(转载)
在嵌入式Linux中,串口是一个字设备,访问具体的串行端口的编程与读/写文件 的操作类似,只需打开相应的设备文件即可操作.串口编程特殊在于串 口通信时相关参数与属性的设置.嵌入式Linux的串口编程时 ...
- Linux串口编程详解(转)
串口本身,标准和硬件 † 串口是计算机上的串行通讯的物理接口.计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备.虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接 ...
- linux串口编程总结
串口本身.标准和硬件 † 串口是计算机上的串行通讯的物理接口.计算机历史上,串口以前被广泛用于连接计算机和终端设备和各种外部设备.尽管以太网接口和USB接口也是以一个串行流进行数据传送的.可是串口连接 ...
随机推荐
- python3 读写excel
一直认为python3可以很快的实现很多简单的功能,今天要读excel表格数据,想来很简单,网上一搜,用xlrd即可,然后很多人给出了不同的版本,号称xlrd3,实际上官网一看,xlrd0.9.4兼容 ...
- [FindBugs分析记录]Redundant nullcheck of o,which is known to be non-null
官网解释: This method contains a redundant check of a known non-null value against the constant null. 这种 ...
- Java学习----集合框架总结
集合框架总结: Collection接口: Set接口: HashSet//对象必须实现hashCode方法,元素没有顺序呢,效率比LinkedHashSet高 LinkedHashSet//是Has ...
- for语句嵌套使用 实现9*9乘法表
这个实例主要考察对for循环语句的使用,出现递增规律的乘法表. 开发环境 开发工具:Microsoft Visual Studio2010 旗舰版 具体步骤 先是制作一个 ...
- 应用ubuntu(安装)
U盘安装Ubuntu 12.04. 工具 UltraISO 9.6.1 ubuntu-12.04.3-desktop-i386 启动U盘 安装UltralISO,启动 文件—打开,选中下载的ubunt ...
- 物联网传输协议MQTT
MQTT是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务.MQTT是专门针对物联网开发的轻量级传输协议.MQTT协议针对低 ...
- jQuery折叠风琴
这个效果用jQuery做是很方便的,根本不需要搞得很复杂. 网上有些效果DEMO不仅用了jQuery还引用一两个封装文件,真是匪夷所思. 最初想到了toggle: jQuery(document).r ...
- Tunnel Warfare
hdu1540:http://acm.hdu.edu.cn/showproblem.php?pid=1540 题意:给你一列村庄,每个村庄给一个标号,1--n,然后毁掉一些村庄,或者重建几个村庄,重建 ...
- SCVMM和SQL分别建在不同服务器上报错:Error ID 319 during database creation on remote SQL Server
问题发生了,测试过权限,帐号,服务,工具问题,均不是. 在微软网站找到解决办法. 就是MASTER.SQL的脚本在数据库服务器上单独运行. 然后,安装SCVMM时,不新建数据库,直接指现建好的库. 搞 ...
- TWinControl.SetBounds与TWinControl.UpdateBounds赏析(定义和调用)
先看它们的函数内容: procedure TControl.SetBounds(ALeft, ATop, AWidth, AHeight: Integer); begin // 虚函数,TWinCon ...