天天看点

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:

针脚 名称 全名 方向(主机 外设)
3 TD Transmit Data ->
2 RD Receive Data <-
7 RTS Request To Send ->
8 CTS Clear To Send <-
6 DSR Data Set Ready <-
4 DTR Data Terminal Ready ->
1 CD Data Carrier Detect <-
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 }

其中串口设置其实就相当于串口通信的协议 

波特率:是为了两者信号流能同步, 

数据位:是指又几位数据封装成一帧 

结束位:是指以帧传输数据时,协定好结束位,便于提取有效数据 

奇偶校验:检验数据的一种手段 

继续阅读