我是靠谱客的博主 开朗酒窝,最近开发中收集的这篇文章主要介绍linux串口测试程序,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

串口:是计算机上的串行通讯的物理接口。计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备。虽然以太网接口和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:

针脚名称全名方向(主机 外设)
3TDTransmit Data->
2RDReceive Data<-
7RTSRequest To Send->
8CTSClear To Send<-
6DSRData Set Ready<-
4DTRData Terminal Ready->
1CDData Carrier Detect<-
9RIRing 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串口测试程序所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部