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结构的典型定义如下:
#include<termios.h>头文件下的

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 }

 

posted @ 2021-03-17 11:23  王廷胡_白嫖帝  阅读(218)  评论(0编辑  收藏  举报