Linux下串口编程入门-

上传人:沈*** 文档编号:192239038 上传时间:2023-03-06 格式:PDF 页数:23 大小:570.10KB
收藏 版权申诉 举报 下载
Linux下串口编程入门-_第1页
第1页 / 共23页
Linux下串口编程入门-_第2页
第2页 / 共23页
Linux下串口编程入门-_第3页
第3页 / 共23页
资源描述:

《Linux下串口编程入门-》由会员分享,可在线阅读,更多相关《Linux下串口编程入门-(23页珍藏版)》请在装配图网上搜索。

1、1/23 IA Division 2007-9-16 Linux 下串口编程入门Linux 下串口编程入门Version 1.00 2/23 IA Division 2007-9-16 Linux 下串口编程入门Revision History Version Date Originator Description 1.00 2007-09-16 YanDong 3/23 IA Division 2007-9-16 Linux 下串口编程入门目录1 串口简介.4 1.1 同步通信.4 1.2 异步通信.4 1.3 什么是 RS-232.5 1.4 计算机串口引脚说明.5 1.5 3 线接法.6

2、 1.6 全双工与半双工.6 1.7 流量控制.6 2 串口访问函数.7 2.1 串口操作需要的头文件.7 2.2 打开串口.7 2.3 设置串口属性.8 2.3.1 波特率设置.8 2.3.2 设置控制模式.9 2.3.4 需要注意的内容.13 2.4 读写串口.13 2.5 关闭串口.13 3 串口读取程序例子.14 附件:又一个串口读写的例子程序.15 4/23 IA Division 2007-9-16 Linux 下串口编程入门1 串口简介串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用。常用的串口是 RS-232-C 接口(又称 EIA RS-232-C)它是在

3、 1970 年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是 数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准 该标准规定采用一个 25 个脚的 DB25 连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定。传输距离在码元畸变小于 4%的情况下,传输电缆长度应为 50 英尺。串口通信可以分为同步通信和异步通信两类。同步通信是按照软件识别同步字符来实现数据的发送和接收,异步通信是一种利用字符的再同步技术的通信方式。1.1 同步通信同步通信是一种连续串行传送数据的通信方式,一

4、次通信只传送一帧信息。这里的信息帧与异步通信中的字符帧不同,通常含有若干个数据字符。它们均由同步字符、数据字符和校验字符(CRC)组成。其中同步字符位于帧开头,用于确认数据字符的开始。数据字符在同步字符之后,个数没有限制,由所需传输的数据块长度来决定;校验字符有1 到 2 个,用于接收端对接收到的字符序列进行正确性的校验。同步通信的缺点是要求发送时钟和接收时钟保持严格的同步。1.2 异步通信异步通信中,数据通常以字符或者字节为单位组成字符帧传送。字符帧由发送端逐帧发送,通过传输线被接收设备逐帧接收。发送端和接收端可以由各自的时钟来控制数据的发送和接收,这两个时钟源彼此独立,互不同步。接收端检测

5、到传输线上发送过来的低电平逻辑0(即字符帧起始位)时,确定发送端已开始发送数据,每当接收端收到字符帧中的停止位时,就知道一帧字符已经发送完毕。在异步通行中有两个比较重要的指标:字符帧格式和波特率。(1)字符帧,由起始位、数据位、奇偶校验位和停止位组成。5/23 IA Division 2007-9-16 Linux 下串口编程入门1.起始位:位于字符帧开头,占1 位,始终为逻辑 0 电平,用于向接收设备表示发送端开始发送一帧信息。2.数据位:紧跟在起始位之后,可以设置为 5 位、6 位、7 位、8位,低位在前高位在后。3.奇偶校验位:位于数据位之后,仅占一位,用于表示串行通信中采用奇校验还是偶

6、校验。(2)波特率,波特率是每秒钟传送二进制数码的位数,单位是b/s。异步通信的优点是不需要传送同步脉冲,字符帧长度也不受到限制。缺点是字符帧中因为包含了起始位和停止位,因此降低了有效数据的传输速率。1.3 什么是 RS-232 RS-232-C接口(又称 EIARS-232-C)它是在 1970 年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是 数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准 该标准规定采用一个25 个脚的 DB25连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号

7、的电平加以规定。传输距离在码元畸变小于4%的情况下,传输电缆长度应为50 英尺。1.4 计算机串口引脚说明引出号说明1 接地2 TXD输出3 RXD 输入4 RTS请求发送5 CTS请求接收6 DSR 数据序列就绪7 GND 逻辑地8 DCD 数据负载检测9 保留10 保留11 未定义6/23 IA Division 2007-9-16 Linux 下串口编程入门12 后备 DCD 13 后备 CTS 14 后备 TXD 15 传输时钟16 后备 RXD 17 接收时钟18 未定义19 后备 RTS 20 DTR 数据终端就绪21 信号质量检测22 闹钟检测23 数据速率选择24 传输时钟25

8、 未定义1.5 3线接法A机 B机2-3接收3-2发送5-5地线1.6 全双工与半双工1.全双工,表示机器可以同时发送数据也可以接收数据,有两个独立的数据通道(一个用于发送,一个用于接收)2.半双工,表示机器不能在发送数据的同时也接收数据。1.7 流量控制1)使用软件方法使用特殊的字符来标记数据流的开始和结束,比如XON,DC1,八进制 021 来标志开始,用X0FF,DC3,八进制 023 来标志结束。2)使用硬件方法使用 RS232的 CTS和 RTS信号来代替特殊字符控制。当接收方准备接收更多数据时,设置CTS为 0,反之设置成 1。对应的发送端准备发送数据时,设置RTS为 0。7/23

9、 IA Division 2007-9-16 Linux 下串口编程入门2 串口访问函数2.1 串口操作需要的头文件#include /*标准输入输出定义*/#include /*标准函数库定义*/#include /*Unix 标准函数定义*/#include#include#include /*文件控制定义*/#include /*PPSIX 终端控制定义*/#include /*错误号定义*/2.2 打开串口int fd;/*以读写方式打开串口*/fd=open(/dev/ttyS0,O_RDWR);if(-1=fd)/*不能打开串口一*/perror(提示错误!);ttyS0 是串口

10、1,ttyS1是串口 2,O_RDWR|NOCTTY|O_NDELAY分别表示可读写,非控制终端(防止任意的中断信号(如键盘)影响程序的执行),不关注 DCD 信号线的状态.详细设置如下:O_RDONLY以只读方式打开文件O_WRONLY以只写方式打开文件O_RDWR以读写方式打开文件O_APPEND写入数据时添加到文件末尾O_CREATE 如果文件不存在则产生该文件,使用该标志需要设置访问权限位mode_t O_EXCL 指定该标志,并且指定了O_CREATE 标志,如果打开的文件存在则会产生一个错误O_TRUNC 如果文件存在并且成功以写或者只写方式打开,则清除文件所有内容,使得文8/23

11、 IA Division 2007-9-16 Linux 下串口编程入门件长度变为 0 O_NOCTTY如果打开的是一个终端设备,这个程序不会成为对应这个端口的控制终端,如果没有该标志,任何一个输入,例如键盘中止信号等,都将影响进程。O_NONBLOCK该标志与早期使用的 O_NDELAY 标志作用差不多。程序不关心 DCD 信号线的状态,如果指定该标志,进程将一直在休眠状态,直到DCD 信号线为 0。O_SYNC 对 I/O 进行写等待返回值:成功返回文件描述符,如果失败返回-1 2.3 设置串口属性控制结构为:POSIX终端接口,大多数系统都支持POSIX终端接口,POSIX终端通过一个t

12、ermios 结构来进行控制,该结构定义在termios.h文件中。串口的设置主要是设置 struct termios 结构体的各成员值。struct termio unsigned short c_iflag;/*输入模式标志 */unsigned short c_oflag;/*输出模式标志 */unsigned short c_cflag;/*控制模式标志*/unsigned short c_lflag;/*本地选项标志*/unsigned char c_line;/*line discipline*/unsigned char c_ccNCC;/*控制特性 */;设置这个结构体很复杂,

13、我这里就只说说常见的一些设置:2.3.1 波特率设置下面是修改波特率的代码:struct termios Opt;tcgetattr(fd,&Opt);/*得到当前的串口属性*/cfsetispeed(&Opt,B19200);/*设置为 19200Bps*/cfsetospeed(&Opt,B19200);tcsetattr(fd,TCANOW,&Opt);/*设置新的串口属性*/设置波特率的例子函数:9/23 IA Division 2007-9-16 Linux 下串口编程入门/*brief 设置串口通信速率*param fd 类型 int 打开串口的文件句柄*param speed 类

14、型 int 串口速度*return void*/int speed_arr=B38400,B19200,B9600,B4800,B2400,B1200,B300,B38400,B19200,B9600,B4800,B2400,B1200,B300,;int name_arr=38400,19200,9600,4800,2400,1200,300,38400,19200,9600,4800,2400,1200,300,;void set_speed(int fd,int speed)int i;int status;struct termios Opt;tcgetattr(fd,&Opt);fo

15、r(i=0;i 0)printf(nLen%dn,nread);buffnread+1=0;printf(n%s,buff);close(fd);exit(0);15/23 IA Division 2007-9-16 Linux 下串口编程入门附件:又一个串口读写的例子程序Sample2.h/*串口结构*/typedefstruct charprompt;/*promptafterrecivingdata*/intbaudrate;/*baudrate*/chardatabit;/*databits,5,6,7,8*/chardebug;/*debugmode,0:none,1:debug*/

16、charecho;/*echomode,0:none,1:echo*/charfctl;/*flowcontrol,0:none,1:hardware,2:software*/chartty;/*tty:0,1,2,3,4,5,6,7*/charparity;/*parity0:none,1:odd,2:even*/charstopbit;/*stopbits,1,2*/constintreserved;/*reserved,mustbezero*/portinfo_t;typedefportinfo_t*pportinfo_t;/*打开串口,返回文件描述符*pportinfo:待设置的串口信

17、息*/intPortOpen(pportinfo_tpportinfo);/*设置串口*fdcom:串口文件描述符,pportinfo:待设置的串口信息*/intPortSet(intfdcom,constpportinfo_tpportinfo);/*关闭串口*fdcom:串口文件描述符*/voidPortClose(intfdcom);/*发送数据*fdcom:串口描述符,data:待发送数据,datalen:数据长度16/23 IA Division 2007-9-16 Linux 下串口编程入门*返回实际发送长度*/intPortSend(intfdcom,char*data,intd

18、atalen);/*接收数据*fdcom:串口描述符,data:接收缓冲区,datalen.:接收长度,baudrate:波特率*返回实际读入的长度*/intPortRecv(intfdcom,char*data,intdatalen,intbaudrate);Sample2.c#include/*printf*/#include/*open*/#include/*bzero*/#include/*exit*/#include/*times*/#include/*pid_t*/#include/*termios,tcgetattr(),tcsetattr()*/#include#include

19、/*ioctl*/#includesample2.h#define TTY_DEV/dev/ttyS/*端口路径*/#define TIMEOUT_SEC(buflen,baud)(buflen*20/baud+2)/*接收超时*/#define TIMEOUT_USEC 0/*获得端口名称*/char*get_ptty(pportinfo_tpportinfo)char*ptty;switch(pportinfo-tty)case0:ptty=TTY_DEV0;break;case1:ptty=TTY_DEV1;break;case2:17/23 IA Division 2007-9-16

20、Linux 下串口编程入门ptty=TTY_DEV2;break;return(ptty);/*波特率转换函数(请确认是否正确)*/int convbaud(unsignedlongintbaudrate)switch(baudrate)case 2400:returnB2400;case 4800:returnB4800;case 9600:returnB9600;case 19200:returnB19200;case 38400:returnB38400;case 57600:returnB57600;case 115200:returnB115200;default:returnB96

21、00;/*Setupcommattr*fdcom:串口文件描述符,pportinfo:待设置的端口信息(请确认)*/int PortSet(intfdcom,constpportinfo_tpportinfo)structtermiostermios_old,termios_new;intbaudrate,tmp;chardatabit,stopbit,parity,fctl;18/23 IA Division 2007-9-16 Linux 下串口编程入门bzero(&termios_old,sizeof(termios_old);bzero(&termios_new,sizeof(term

22、ios_new);cfmakeraw(&termios_new);tcgetattr(fdcom,&termios_old);/*gettheserialportattributions*/*-设置端口属性-*/*baudrates*/baudrate=convbaud(pportinfo-baudrate);cfsetispeed(&termios_new,baudrate);/*填入串口输入端的波特率*/cfsetospeed(&termios_new,baudrate);/*填入串口输出端的波特率*/termios_new.c_cflag|=CLOCAL;/*控制模式,保证程序不会成为端

23、口的占有者*/termios_new.c_cflag|=CREAD;/*控制模式,使能端口读取输入的数据*/*控制模式,flowcontrol*/fctl=pportinfo-fctl;switch(fctl)case0:termios_new.c_cflag&=CRTSCTS;/*noflowcontrol*/break;case1:termios_new.c_cflag|=CRTSCTS;/*hardwareflowcontrol*/break;case2:termios_new.c_iflag|=IXON|IXOFF|IXANY;/*softwareflowcontrol*/break;

24、/*控制模式,databits*/termios_new.c_cflag&=CSIZE;/*控制模式,屏蔽字符大小位*/databit=pportinfo-databit;switch(databit)case5:19/23 IA Division 2007-9-16 Linux 下串口编程入门termios_new.c_cflag|=CS5;case6:termios_new.c_cflag|=CS6;case7:termios_new.c_cflag|=CS7;default:termios_new.c_cflag|=CS8;/*控制模式 paritycheck*/parity=pport

25、info-parity;switch(parity)case0:termios_new.c_cflag&=PARENB;/*noparitycheck*/break;case1:termios_new.c_cflag|=PARENB;/*oddcheck*/termios_new.c_cflag&=PARODD;break;case2:termios_new.c_cflag|=PARENB;/*evencheck*/termios_new.c_cflag|=PARODD;break;/*控制模式,stopbits*/stopbit=pportinfo-stopbit;if(stopbit=2)

26、termios_new.c_cflag|=CSTOPB;/*2stopbits*/Else termios_new.c_cflag&=CSTOPB;/*1stopbits*/*otherattributionsdefault*/20/23 IA Division 2007-9-16 Linux 下串口编程入门termios_new.c_oflag&=OPOST;/*输出模式,原始数据输出*/termios_new.c_ccVMIN=1;/*控制字符,所要读取字符的最小数量*/termios_new.c_ccVTIME=1;/*控制字符,读取第一个字符的等待时间unit:(1/10)second

27、*/tcflush(fdcom,TCIFLUSH);/*溢出的数据可以接收,但不读*/tmp=tcsetattr(fdcom,TCSANOW,&termios_new);/*设置新属性,TCSANOW:所有改变立即生效*/tcgetattr(fdcom,&termios_old);return(tmp);/*Openserialport*tty:端口号 ttyS0,ttyS1,.*返回值为串口文件描述符*/intPortOpen(pportinfo_tpportinfo)intfdcom;/*串口文件描述符*/char*ptty;ptty=get_ptty(pportinfo);/*fdcom

28、=open(ptty,O_RDWR|O_NOCTTY|O_NONBLOCK|O_NDELAY);*/fdcom=open(ptty,O_RDWR|O_NOCTTY|O_NONBLOCK);return(fdcom);/*Closeserialport*/voidPortClose(intfdcom)close(fdcom);/*senddata*fdcom:串口描述符,data:待发送数据,datalen:数据长度*返回实际发送长度*/intPortSend(intfdcom,char*data,intdatalen)21/23 IA Division 2007-9-16 Linux 下串口编

29、程入门 intlen=0;len=write(fdcom,data,datalen);/*实际写入的长度*/if(len=datalen)return(len);else tcflush(fdcom,TCOFLUSH);return-1;/*receivedata*返回实际读入的字节数*/intPortRecv(intfdcom,char*data,intdatalen,intbaudrate)intreadlen,fs_sel;fd_setfs_read;structtimevaltv_timeout;FD_ZERO(&fs_read);FD_SET(fdcom,&fs_read);tv_t

30、imeout.tv_sec=TIMEOUT_SEC(datalen,baudrate);tv_timeout.tv_usec=TIMEOUT_USEC;fs_sel=select(fdcom+1,&fs_read,NULL,NULL,&tv_timeout);if(fs_sel)readlen=read(fdcom,data,datalen);return(readlen);else return(-1);22/23 IA Division 2007-9-16 Linux 下串口编程入门return(readlen);/*Test*/intmain(intargc,char*argv)intf

31、dcom,i,SendLen,RecvLen;structtermiostermios_cur;charRecvBuf10;portinfo_tportinfo=0,/*printpromptafterreceiving*/115200,/*baudrate:9600*/8,/*databit:8*/0,/*debug:off*/0,/*echo:off*/2,/*flowcontrol:software*/0,/*defaulttty:COM1*/0,/*parity:none*/1,/*stopbit:1*/0/*reserved*/;if(argc!=2)printf(Usage:n);

32、printf(eg:);printf(MyPort0);exit(-1);fdcom=PortOpen(&portinfo);if(fdcom0)printf(Error:openserialporterror.n);exit(1);PortSet(fdcom,&portinfo);if(atoi(argv1)=0)/*senddata*/for(i=0;i0)printf(No%dsend%ddata1234567890.n,i,SendLen);else printf(Error:sendfailed.n);sleep(1);PortClose(fdcom);else for(;)RecvLen=PortRecv(fdcom,RecvBuf,10,portinfo.baudrate);if(RecvLen0)for(i=0;iRecvLen;i+)printf(ReceivedataNo%dis%x.n,i,RecvBufi);printf(Totalframelengthis%d.n,RecvLen);else printf(Error:receiveerror.n);sleep(2);return 0;

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!