




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
TOC\o"1-2"\h\z\uLinux下串口编程入门教 Linux操作系统下的串口通信学习笔 一、什么是串口通 二、串口通信的分 三、什么是RS- 五、全双工与半双 六、流量控 七、串口的访 打开串 关闭串 写串 读串 Linux/pub/article/c302a87895Linux操作系统从一开始就对串行口提供了很好的支持,本文就Linux下的串行口通讯编是RS-232-C接口(又称EIARS-232-C)它是在1970年由美国电子工业协会(EIA)联术标准"25DB25连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定。传输距离在码元畸变小于4%的情况下,传输电50Linux操作系统从一开始就对串行口提供了很好的支持,本文就Linux下的串行口通讯编程进行简单的介绍,如果要非常深入了解,建议看看本文所参考的《SerialProgrammingGuideforPOSIXOperatingSystems》#include<stdio.h>/*标准输入输出定义*/#include<stdlib.h>/*标准函数库定义*/#includeunistd.h>*Unix标准函数定义*/#include<sys/types.h>#include#include<fcntl.h>*文件控制定义#include<termios.h>/*PPSIX终端控制定义*/#include<errno.h>/*错误号定义*/在Linux下串口文件是位于/dev下的。串口一为/dev/ttyS0,串口二为/dev/ttyS1。打intfd=open("/dev/ttyS0",O_RDWR);if(-1==fd){/*不能打开串口一*/perror(提示错误!");}最基本的设置串口包括波特率设置,效验位和停止位设置。串口的设置主要是设置structtermios结构体的各成员值。structunsignedshortc_iflag**/unsignedshortc_oflag;/*输出模式标志*/unsignedshortc_cflag;/*控制模式标志*/unsignedshortc_lflag;/*localmodeflags*/unsignedcharc_line;/*linediscipline*/unsignedcharc_cc[NCC];/*controlcharacters*/波特率设置下面是修改波特率的代码:structtermiosOpt;*@brief*@paramfdint*@paramspeedint*@returnintspeed_arr[]={B38400,B19200,B9600,B4800,B2400,B1200,B300,B38400,B19200,B9600,B4800,B2400,B1200,B300,};intname_arr[]={38400,19200,9600,4800,2400,1200,300,19200,9600,4800,2400,1200,300,voidset_speed(intfd,intspeed){inti;intstructtermiosOpt;tcgetattr(fd,&Opt);for(i=0;i<sizeof(speed_arr)/sizeof(int);{if(speed==name_arr[i]){tcflush(fd,TCIOFLUSH);cfsetispeed(&Opt,speed_arr[i]);if(status!=0){}}}}*@brief*@paramfdint*@paramdatabitsint7*@paramstopbitsint1*@paramparityintintset_Parity(intfd,intdatabits,intstopbits,int{structtermiosif(tcgetattr(fd,&options)!={perror("SetupSerial1");}options.c_cflag&=~CSIZE;{casecasefprintf(stderr,"Unsupporteddatasizen");return}switch{casecaseoptions.c_cflag&=~PARENB;/*Clearparityenable*/options.c_iflag&=~INPCK;/*Enableparitychecking*/casecaseoptions.c_cflag|=(PARODD|PARENB);/*设置为奇效验*/options.c_iflag|INPCK*Disnableparitychecking*break;case'e':caseoptions.c_cflag|=PARENB;/*Enableparity*/options.c_cflag&=~PARODD;/*转换为偶效验*/options.c_iflag|=INPCK*Disnableparitychecking*/casecase's':/*asnoparity*/options.c_cflag&=~PARENB;options.c_cflag&=~CSTOPB;break;fprintf(stderr,"Unsupportedparityn");return(FALSE);}/*设置停止位*/switch(stopbits){casecasefprintf(stderr,"Unsupportedstopbitsn");return(FALSE);}/*Setinputparityoption*/if(parity!='n')options.c_iflag|=INPCK;options.c_cc[VTIME]=150;/*设置超时15seconds*/options.c_cc[VMIN0;*UpdatetheoptionsanddoitNOW*/if(tcsetattr(fd,TCSANOW,&options)!=0){perror("SetupSerial3");return(FALSE);}return}使用原始模式(RawMode)方式来通讯,设置方式如下:options.c_lflag&=~(ICANON|ECHO|ECHOE|ISIG);/*Input*/options.c_oflag&=~OPOST;/*Output*/charbuffer[1024];intLength;intnByte;nByte=write(fd,bufferread函数读取,如果设置为原始模式(RawMode)read函数返或者select等来操作。charbuff[1024];intLen;intreadByte=#defineFALSE-1#defineTRUEintOpenDev(char*Dev){intfd=open(Dev,O_RDWRif(-1==fd){perror("Can'tOpenSerialPort");return-1;}}intmain(intargc,**argv){intfd;intnread;charchar*devdev/ttyS1";串口二fd=OpenDev(dev);if(set_Parity(fd,8,1,'N')=={printf("SetParityErrorn");exit(0);}while1){while((nread=read(fd,buff,{buff[nread+1]='';printf("n%s",}}//exit}或者为0。 |同步||||| |||||| 12个,用于接收端对接收到的字符序列进行正确性的|D7|0/1|1|0|D0|D1|D2|D3|D4|D5|D6|D7|0/1|1|0位位位位|1|0|D0|D1|D2|D3|D4|D5|D6|D7|0/1|1|1|1|1|0闲始校验止始RS-232-C接口(EIARS-232-C)1970HPZe2202AP2USB接口、11394接口,PCMCIA扩展插槽。除此之外,这款机型同样配备扩展端口,扩展性无疑用X0FF,DC3,八进制023来标志结束。CTS0,1。对应的发送端准备发送数据时,设置RTS0。LINUXopen函数来打开的,不过需要注意的是,一般用户是intopen(constchar*pathname,intoflag,.../*,mode_t-intoflag文件打开方式,可用标志如下:O_RDONLY以只读方式打开文件O_WRONLY以只写方式打开文件O_RDWR以读写方式打开文件O_APPEND写入数据时添加到文件末尾O_EXCLO_CREATE标志,如果打开的文件存在则会产生O_TRUNC如果文件存在并且成功以写或者只写方式打开,则清除文件所有内容,使得文件长度变为0O_NOCTTY如果打开的是一个终端设备,这个程序不会成为对应这个端口的控制终信号线的状态,如果指定该标志,进程将一直在休眠状态,直到DCD0。O_SYNC对I/O进行写等待intfd;*fd=open("/dev/ttyS0",O_RDWR|0_NOCTTY|intfiledes文件描述符intret**/ret=close(fd);intfiledesconstvoid*buffsize_tnbytes写入数据字节数-intn0;/**/n=write(fd,"ATZ\r",4);if(n==-1){}intfiledessize_tnbytes需要读取的字节数则可以使用fcntl函数来设置文件访问属性。例如:通过fcntl(fd,F_SETFL,0)可以设置回一般状态。5个字节的应答数据intnRead**/charbuffer[256];/*接收缓冲区*/nRead=read(fd,buffer,5);if(nRead==-1){}该结构定义在termios.h文件中。{tcflag_tc_iflag;/**/tcflag_tc_oflag;/**/tcflag_tc_cflag;/**/tcflag_tc_lflag;/**/cc_tc_cc[NCCS];/*控制特性*/FlagBREAK将使得输入和输出队列被刷新,如果终端是一个前台进程组的控制终端,这个进程组中所有进程将收到SIGINT信号。如果既未设置IGNBRK也未设置BRKINT,BREAKNULPARMRK,这种情况下被视为INLCRNLCR。IGNCR忽略输入中的回车。ICRNL将输入中的回车翻译为新行字符(IGNCR)。IUCLC(POSIX)将输入中的大写字母映射为小写字母。IXON启用输出的XON/XOFF流控制IXOFF启用输入的XON/XOFF流控制FlagONLCR(XSI)将输出中的新行符映射为回车-换行OCRNL将输出中的回车映射为新行符。ONOCR不在第0列输出回车。ONLRET不输出回车。则是ASCIINUL。为TAB3,即XTABS,将扩展跳格为空格(每个跳格符填充8个空格)。VTDLY竖直跳格掩码。取值为VT0或VT1。c_cflag成员FlagCSTOPB设置两个停止位。CREAD左移了IBSHIFT位。FlagISIG当接收到字符INTR,QUIT,SUSPDSUSP时,产生相应的信号。ECHOCTL(POSIX)ECHOTAB,NL,START和码。例如字符0x08(BS)被回显为^H。每个字符,如同指定了ECHOE和ECHORPT一样。符DISCARD来打开和关闭。符被重新输出。(bash用他来处理typeahead)。特殊字符EOL2,LNEXT,REPRINT和WERASE,IUCLC标志才有效。FlagVERASE0177,DEL,rubout,or010,BS,Ctrl-H,oralso#)删除字符。删除上VKILL025,NAK,Ctrl-U,orCtrl-Xoralso@)EOF或行首以来的输入。当设置ICANON时可被识别,不再作为输入传递。VEOF004,EOT,Ctrl-D)tty缓冲中的内容被送到等待输入的用户程序中,而不必等到EOL。如果它是一行的第一个字符,那read()0EOFICANON时可被识别,VMINcanonicalVEOL0NUL)附加的行尾字符。当设ICANONVTIMEcanonical模式读时的延时,以十分之一秒为单位。VEOL2(notinPOSIX;0,NUL)另一个行尾字符。当设置ICANON时可VEOL0NUL)ICANONVEOL2(notinPOSIX;0,NUL)ICANON时可被识别。VSWTCH(notinPOSIX;notsupportedunderLinux;0,NUL)开关字符。(只为shl所用。)VSTART021DC1Ctrl-Q)Stop字符中止的输出。当设置IXON时可被识别,不再作为输入传递。VSTOP023,DC3,Ctrl-S)StartVSUSP032SUBCtrl-ZSIGTSTPISIG时可被VDSUSPnotinPOSIX;notsupportedunderLinux;031,EM,Ctrl-Y)延时挂起信号。当用户程序读到这个字符时,发送SIGTSTP信号。当设置IEXTEN和取消它的任何特殊含义。当设置IEXTEN时可被识别,不再作为输入传递。VWERASE(notinPOSIX;027,ETB,Ctrl-W)删除词。当设置ICANON和IEXTEN时可被识别,不再作为输入传递。)ICANONIEXTENVDISCARD(notinPOSIXnotsupportedunderLinux017SICtrl-O开关:开始/结束丢弃未完成的输出。当设置IEXTEN时可被识别,不再作为输入传递。VSTATUS(notinPOSIX;notsupportedunderLinux;statusrequest:024,DC4,Ctrl-T).息是通过cfgetispeed和cfgetospeed函数来完成的。speed_tspeed需要设置的输出波特率cfsetispeed函数intcfsetispeed(structtermios*termptr,speed_tspeed_tspeed需要设置的输入波特率cfgetospeed函数conststructtermiostermios结构的指针conststructtermios*termptrtermios结构的指针CBAUD掩码option.c_cflag&=~CSIZE;option.c_cflag|=CS7;Noparity(8N1):options.c_cflag&=~PARENBoptions.c_cflag&=~CSIZE;options.c_cflag|=CS8;Evenparity(7E1):options.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新疆师范大学《实验室安全与法规》2023-2024学年第二学期期末试卷
- 重庆市主城区七校联考2025年高三教学质量检测试题试卷(二)物理试题含解析
- 公共交通运营服务收费标准制度
- 第18课 清朝的边疆治理 教案2024-2025学年七年级历史下册新课标
- 内圆形吊顶施工方案
- 护坡植草施工方案
- 路基修复夜间施工方案
- 工程资料与施工方案
- 汽车隔音施工方案范本
- 2025年搞笑考试面试试题及答案
- 2025年合肥共达职业技术学院单招职业技能测试题库附答案
- 2025美国急性冠脉综合征(ACS)患者管理指南解读课件
- 足球迷互动活动策划与执行策略
- 2025年宁夏工商职业技术学院单招职业适应性测试题库带答案
- ESC+2024+心房颤动(房颤)管理指南解读
- 三级机动车驾驶教练员职业资格理论题库(汇总版)
- 南方医科大学研究生培养点评价简况表
- 玉米杂交制种基地档案丰垦种业(样本)
- EXCEL函数公式培训PPT(共39张)
- A4标签打印模板
- 矛盾纠纷排查调处记录表
评论
0/150
提交评论