概述
串口:是计算机上的串行通讯的物理接口。计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备。虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接通常特指那些与RS-232标准兼容的硬件或者调制解调器的接口。虽然现在在很多个人计算机上,原来用以连接外部设备的串口已经广泛的被USB和Firewire替代;而原来用以连接网络的串口则被以太网替代,还有用以连接终端的串口设备则已经被MDA或者VGA取而代之。但是,一方面因为串口本身造价便宜技术成熟,另一方面因为串口的控制台功能RS-232标准高度标准化并且非常普及,所以直到现在它仍然被广泛应用到各种设备上。
串行通信:
计算机可以每次传送一个或者多个位(bit)的数据。“串行”指的式每次只传输一位(1bit)数据。当需要通过串行通讯传输一个字(word)的数据时,只能以每次一位的方式接收或者发送。
异步通信:
计算机为了弄懂传给它的串行数据,它需要确定每个字符开始和结束的位置。这通常是用异步串行数据来完成的。
异步通信在发送字符时,所发送的字符之间的时隙可以是任意的,当然,接收端必须时刻做好接收的准备,送端可以在任意时刻开始发送字符,因此必须在每一个字符的开始和结束的地方加上标志,即加上开始位和停止位,以便使接收端能够正确地将每一个字符接收下来。
RS-232:
RS-232是EIA(Electronic Industries Association)定义的串行通信的电器接口。RS-232事实上有三种(A,B和C),它们分别采用不同的电压来表示on和off。最被广泛使用的是RS-232C
DB-9:
针脚 | 名称 | 全名 | 方向(主机 外设) |
3 | TD | Transmit Da | -> |
2 | RD | Receive Da | <- |
7 | RTS | Request To Send | -> |
8 | CTS | Clear To Send | <- |
6 | DSR | Da | <- |
4 | DTR | Da | -> |
1 | CD | Da | <- |
9 | RI | Ring Indicator | <- |
5 | - | Signal Ground |
fd = open(“/dev/ttyS0”,O_RDWR | O_NOCTTY | O_NDELAY);
参数:
O_NOCTTY:通知linux系统,这个程序不会成为这个端口的控制终端.
O_NDELAY:通知linux系统不关心DCD信号线所处的状态(端口的另一端是否激活或者停止).
然后恢复串口的状态为阻塞状态,用于等待串口数据的读入,用fcntl函数: fcntl(fd,F_SETFL,0); //F_SETFL:设置文件flag为0,即默认,即阻塞状态
读写串口:
串口的读写与普通文件一样,使用read,write函数
read(fd,buff,8);
write(fd,buff,8);
头文件
14 #include <stdio.h>
15 #include <errno.h>//错误号定义
16 #include <unistd.h>//Unix标准函数定义,使用exit()
17 #include <sys/stat.h>
18 #include <sys/types.h>
19 #include <fcntl.h>//文件控制定义
20 #include <string.h>
21 #include <stdlib.h>
22 #include <termios.h>//终端控制定义
打开串口
32 int set_opt(int fd,int nSpeed,int nBits,char nEvent,int nStop)
33 {
34 struct termios newttys1,oldttys1;
35
36 if(tcgetattr(fd,&oldttys1)!=0)//保存原先串口配置
37 {
38 perror("Setupserial 1");
39 return -1;
40 }
41
42 bzero(&newttys1,sizeof(newttys1));//将一段内存区域的内容全清为零
43 newttys1.c_cflag|=(CLOCAL|CREAD );//CREAD 开启串行数据接收,CLOCAL并打开本地连接模式
linux中的串口设备文件放于/dev目录下,串口一,串口二分别为”/dev/ttyS0”,”/dev/ttyS1”.在linux下操作串口与操作文件相同.
设置字符大小
45 newttys1.c_cflag &=~CSIZE; //设置数据位数
46 switch(nBits) //选择数据位
47 {
48 case 7:
49 newttys1.c_cflag |=CS7;break;
50 case 8:
51 newttys1.c_cflag |=CS8;break;
52
53 }
设置校验位
55 switch(nEvent)
56 {
57 case 'O': //奇校验
58 newttys1.c_cflag |=PARENB;
59 newttys1.c_iflag |=(INPCK | ISTRIP);
60 newttys1.c_cflag |=PARODD;
61 break;
62 case 'E': //偶校验
63 newttys1.c_cflag |=PARENB;
64 newttys1.c_iflag |=(INPCK | ISTRIP);
65 newttys1.c_cflag |=PARODD;
66 break;
67 case 'N': //关闭奇偶校验
68 newttys1.c_cflag &= ~PARENB;
69 break;
70 }
设置波特率
72 switch(nSpeed)
73 {
74 case 2400:
75 cfsetispeed(&newttys1,B2400);//设置输入速度
76 cfsetospeed(&newttys1,B2400);//设置输出速度
77 break;
78 case 4800:
79 cfsetispeed(&newttys1,B4800);
80 cfsetospeed(&newttys1,B4800);
81 break;
82 case 9600:
83 cfsetispeed(&newttys1,B9600);
84 cfsetospeed(&newttys1,B9600);
85 break;
86 case 115200:
87 cfsetispeed(&newttys1,B115200);
88 cfsetospeed(&newttys1,B115200);
89 break;
90 default:
91 cfsetispeed(&newttys1,B9600);
92 cfsetospeed(&newttys1,B9600);
93 break;
94
95 }
设置停止位
97 if(nStop == 1)//若停止位为1,则清除CSTOPB,若停止位为2,则激活CSTOPB
98 {
99 newttys1.c_cflag &= ~CSTOPB;//默认为送一位停止位
100 }
101 else if(nStop == 2)
102 {
103 newttys1.c_cflag |= CSTOPB;//CSTOPB表示送两位停止位
104
105 }
//设置最少字符和等待时间
108 newttys1.c_cc[VTIME] = 0;//非规范模式读取时的超时时间
109 newttys1.c_cc[VMIN] = 0;//非规范模式读取时的最小字符数
110
111 tcflush(fd,TCIFLUSH);//tcflush清空终端未完成的输入/输出请求及数据;TCIFLUSH表示清空正收到的数据,且不读取出来
112
113 // 在完成配置后,需要激活配置使其生效
114 if((tcsetattr( fd, TCSANOW,&newttys1))!=0) //TCSANOW不等数据传输完毕就立即改变属性
115 {
116 perror("com set error");
117 return -1;
118 }
119 return 0;
120 }
其中串口设置其实就相当于串口通信的协议
波特率:是为了两者信号流能同步,
数据位:是指又几位数据封装成一帧
结束位:是指以帧传输数据时,协定好结束位,便于提取有效数据
奇偶校验:检验数据的一种手段
最后
以上就是开朗酒窝为你收集整理的linux串口测试程序的全部内容,希望文章能够帮你解决linux串口测试程序所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复