您的位置:首页 > 运维架构 > Linux

linux串口测试程序

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

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

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

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

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

奇偶校验:检验数据的一种手段
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: