资源描述:
《Linux下串口编程遇到的接收数据错误及原因.docx》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Linux下串口编程遇到的接收数据错误及原因————————————————————————————————作者:————————————————————————————————日期:Linux下串口编程遇到的接收数据错误及原因Linux下串口編程遇到的接收數据錯誤及原因近日在调试串口的时候发现,另一设备向我ARM板的串口发送0x0d,我接收之后变成了0x0a,这是问题一;另外当对方向我发送一串数据,如果其中有0x11,那么我总是漏收此数,这是问题二。由于问题莫名其妙,以为是笔记本的USB转232线缆的问题,换,问题依旧。以为是对方设备的问题,采用串口调试
2、助手模拟通讯设备与ARM板通讯,问题依旧。无奈才去查看资料,最终得以解决,现总结如下:1.串口操作需要的头文件#include<stdio.h>//标准输入输出定义#include<stdlib.h>//标准函数库定义#include<unistd.h>//Unix标准函数定义#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>//文件控制定义#include<termios.h>//POSIX中断控制定义#i
3、nclude<errno.h>//错误号定义2.打开串口串口位于/dev中,可作为标准文件的形式打开,其中:串口1/dev/ttyS0串口2/dev/ttyS1代码如下:intfd;fd=open(“/dev/ttyS0”,O_RDWR);if(fd==-1){Perror(“串口1打开失败!”);}//else//fcntl(fd,F_SETFL,FNDELAY);除了使用O_RDWR标志之外,通常还会使用O_NOCTTY和O_NDELAY这两个标志。O_NOCTTY:告诉Unix这个程序不想成为“控制终端”控制的程序,不说明这个标志的话,任
4、何输入都会影响你的程序。O_NDELAY:告诉Unix这个程序不关心DCD信号线状态,即其他端口是否运行,不说明这个标志的话,该程序就会在DCD信号线为低电平时停止。3.设置波特率最基本的串口设置包括波特率、校验位和停止位设置,且串口设置主要使用termios.h头文件中定义的termios结构,如下:structtermios{tcflag_tc_iflag;//输入模式标志tcflag_tc_oflag;//输出模式标志tcflag_tc_cflag;//控制模式标志tcflag_tc_lflag;//本地模式标志cc_tc_line;//linedi
5、sciplinecc_tc_cc[NCC];//controlcharacters}代码如下:intspeed_arr[]={B38400,B19200,B9600,B4800,B2400,B1200,B300,B38400,B19200,B9600,B4800,B2400,B1200,B300,};intname_arr[]={38400,19200,9600,4800,2400,1200,300,38400,19200,9600,4800,2400,1200,300,};voidSetSpeed(intfd,intspeed){inti;structt
6、ermiosOpt;//定义termios结构if(tcgetattr(fd,&Opt)!=0){perror(“tcgetattrfd”);return;}for(i=0;i<sizeof(speed_arr)/sizeof(int);i++){if(speed==name_arr[i]){tcflush(fd,TCIOFLUSH);cfsetispeed(&Opt,speed_arr[i]);cfsetospeed(&Opt,speed_arr[i]);if(tcsetattr(fd,TCSANOW,&Opt)!=
7、0){perror(“tcsetattrfd”);return;}tcflush(fd,TCIOFLUSH);}}}注意tcsetattr函数中使用的标志:TCSANOW:立即执行而不等待数据发送或者接受完成。TCSADRAIN:等待所有数据传递完成后执行。TCSAFLUSH:Flushinputandoutputbuffersandmakethechange4.设置数据位、停止位和校验位以下是几个数据位、停止位和校验位的设置方法:(以下均为1位停止位)8位数据位、无校验位:Opt.c_cflag&=~PARENB;Opt.c_cflag&
8、=~CSTOPB;Opt.c_cflag&=~CSIZE;