Linux系统嵌入式设备的串口通信
一. 为什么要配置串口通信
? 在嵌入式开发或者物联网开发过程中,串口输出数据是开发过程中初始过程,这一步方便我们看到设备产生的数据,可以直接通过串口调试助手帮助我们查看这些数据,那么问题来了,当我们可以让一个设备从串口使用UART的方式输出数据,这个设备和一个搭载Linux系统的嵌入式设备通信的时候怎么获取这个设备?Linux下一切皆文件,那么我们首先应该打开一个设备,一般一个UART通信的接口会设置成USB,在Linux系统下一个USB设备会被识别成一个叫ttyUSB*的设备,从标号0开始,找到了文件,我们就可以open、read、write了,接下来我们要做的就是像配置串口调试工具一样,把这个 ttyUSB *的设备配置成如下的通信方式,波特率为115200,位1停止位,8位数据位,无奇偶校验,这样就可以和其它USB转串口的设备通信了。
二. 配置的方法
2.1 配置的大致方法
- 设置termio结构体的标志位
- 设置波特率
- 使配置的termio生效
2.2 结构体 termio的内容
-
termio结构体的内容 struct termio {
unsigned short c_iflag;
unsigned short c_oflag;
unsigned short c_cflag;
unsigned short c_lflag;
unsigned char c_line;
unsigned char c_cc[NCC];
};
-
c_iflag 常用的值 -
c_oflag常用的值 -
c_cflag常用的值 -
c_lflag -
c_cc
2.3 将一个USB设备文件配置成UART通信方式的函数实现
-
配置过程 void serial_init(int fd)
{
struct termios options;
tcgetattr(fd, &options);
options.c_cflag |= ( CLOCAL | CREAD );
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_cflag &= ~CRTSCTS;
options.c_cflag &= ~CSTOPB;
options.c_iflag |= IGNPAR;
options.c_iflag &= ~(ICRNL | IXON);
options.c_oflag = 0;
options.c_lflag = 0;
cfsetispeed(&options, B115200);
cfsetospeed(&options, B115200);
tcsetattr(fd,TCSANOW,&options);
}
-
使用方法 int dev_uart_fd ;
if((dev_uart_fd =open("/dev/ttyUSB0",ORDWR)) < 0) {
perror("open ttyUSB0 error");
puts("please check your usb device\n");
return -1;
}
serial_init(dev_uart_fd);
|