1.串口通信
串口------是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用。将CPU的并行数据(一般是8位)转换成比特
串口通讯------指的是计算机依次以位(bit)为单位来传送数据,串行通讯使用的范围很广,在嵌入式系统开发过程中串口通讯也经常用到通讯方式之一。
在Linux系统中,“一切皆文件”。所以在Linux下串口就是一个文件,使用它就和使用文件一样。为了访问串口,只需打开其设备文件即可操作串口设备。在linux系统下面,每一个串口设备都有设备文件与其关联,设备文件位于系统的/dev目录下面。如linux下的/ttyS0,/ttyS1分别表示的是串口1和串口2。下面来详细介绍linux下是如何使用串口的:
大概流程为:打开串口(文件)–>设置串口参数–>读串口–>关闭串口
就和文件操作一模一样
这里的串口将接受和发送的接口接在一起,重硬件上保证了连通在一起
2.打开串口
在本程序中,使用ttyUSB0作为通信串口。在打开ttyUSB0的时候,基本选项O_RDWR表示可读写,选项 O_NOCTTY 表示不能把本串口当成控制终端,否则用户的键盘输入信息将影响程序的执行; O_NDELAY表示打开串口的时候,程序并不关心另一端 的串口是否在使用中。 O_NDELAY 函数使read函数在端口没有字符存在的情况下,立刻返回0,与 fcntl(fd,F_SETFL,FNDELAY);一样,也与O_NONBLOCK(程序不关心DCD信号线的状态,如果指定该标志,进程将一直在休眠状态,直到DCD信号线为0)一样。得到串口的文件描述符后面就可以通过fd来操作它。B要想解析出A发的比特流是什么意思,就需要有一个参考(时间同步)这就是波特率。同时为了检查出数据的正确与否,又加入了奇偶校验。
char *serialport_path = "/dev/ttyUSB0";
int serial_fd = -1;
serial_fd = open(serialport_path,O_RDWR | O_NOCTTY | O_NDELAY)
3.设置串口
串口通信基本参数参考链接
termios结构体每个标志表示的意思参考链接
实现串口通信并不是说通信就通信的,有很多问题需要解决。假如我发送一个数据,A发到B,那么B怎么知道数据到没到和数据有没有结束要不要继续等待,这样它的数据报就要有标志起始和停止的。串口的属性定义在struct termios中,结构体定义在termios.h头文件中。该结构体通过控制驱动程序控制字符的输入输出到用户进程。
结构体中flag的赋值通过位运算,置某位用 | ,设某位为0用 & 和 ~。
在设置终端属性之前需要用冲洗函数,冲洗掉相应的队列
/*struct termios
* {unsigned short c_iflag; 输入模式标志
* unsigned short c_oflag; 输出模式标志
* uns