linux串口通讯
linux串口通讯的步骤图
1.打开串口
//打开串口 int open_port(void) { int fd; fd=open("/dev/ttyUSB0",O_RDWR | O_NOCTTY | O_NONBLOCK);//O_NONBLOCK设置为非阻塞模式,在read时不会阻塞住,在读的时候将read放在while循环中,下一节篇文档将详细讲解阻塞和非阻塞 // printf("fd=%d\n",fd); if(fd==-1) { perror("Can't Open SerialPort"); } return fd; }
2.串口初始化
讲解这片代码之前,我们要先研究一下termios的数据结构。最小的termios结构的典型定义如下:
#
struct termios { tcflag_t c_iflag; tcflag_t c_oflag; tcflag_t c_cflag; tcflag_t c_lflag; cc_t c_cc[NCCS]; };
上面五个结构成员名称分别代表:
- c_iflag:输入模式
- c_oflag:输出模式
- c_cflag:控制模式
- c_lflag:本地模式
- c_cc[NCCS]:特殊控制模式
3.原文代码
1 #include <stdio.h> 2 #include <sys/types.h> 3 #include <sys/stat.h> 4 #include <fcntl.h> 5 #include <unistd.h> 6 #include <termios.h> 7 #include <string.h> 8 #define File_open_USB "/dev/ttyUSB0" //串口的文件名 9 void serial_port_init(int fd); //串口初始化说明 10 11 int main() 12 { 13 //1.打开串口 14 char buf[1024] = ""; 15 int open_USB = open(File_open_USB, O_RDWR); 16 if (open_USB < 0) 17 { 18 return -1; 19 } 20 21 //2.串口初始化 22 serial_port_init(open_USB); 23 while (1) 24 { 25 printf("请输入:"); 26 scanf("%s", buf); 27 write(open_USB, buf, strlen(buf)); 28 memset(buf, 0, sizeof(buf)); 29 read(open_USB, buf, sizeof(buf) - 1); 30 printf("接受的数据是:%s\n", buf); 31 memset(buf, 0, sizeof(buf)); 32 } 33 34 return 0; 35 } 36 37 /************************** 38 * 函数名:serial_port_init 39 * 功能:串口初始化 40 * 参数:fd:文件描述符 41 * 返回值:无 42 * ************************/ 43 void serial_port_init(int fd) 44 { 45 struct termios serial_port; 46 tcgetattr(fd, &serial_port); 47 serial_port.c_cflag |= (CLOCAL | CREAD); /*input mode flag:ignore modem 48 control lines; Enable receiver */ 49 serial_port.c_cflag &= ~CSIZE; 50 serial_port.c_cflag &= ~CRTSCTS; 51 serial_port.c_cflag |= CS8; 52 serial_port.c_cflag &= ~CSTOPB; //停止位 53 serial_port.c_iflag |= IGNPAR; // 忽略校验错误 54 serial_port.c_oflag = 0; // 无输出模式 55 serial_port.c_lflag = 0; //本地模式禁用 56 cfsetispeed(&serial_port, B115200); 57 cfsetospeed(&serial_port, B115200); 58 tcsetattr(fd, TCSANOW, &serial_port); 59 }