linux下串口编程简单实例.pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《linux下串口编程简单实例.pdf》由会员分享,可在线阅读,更多相关《linux下串口编程简单实例.pdf(12页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、linux 下串口编程简单实例1、linux 中的串口设备文件存放于/dev 目录下,其中串口一,串口二对应设备名依次为“/dev/ttyS0”、“/dev/ttyS1”。在 linux 下操作串口与操作文件相同。2、在使用串口之前必须设置相关配置,包括:波特率、数据位、校验位、停止位等。串口设置由下面结构体实现:destruct termiostcflag_t c_iflag;/*input flags*/tcflag_t c_oflag;/*output flags*/tcflag_t c_cflag;/*control flags*/tcflag_t c_lflag;/*local fl
2、ags*/cc_t c_ccNCCS;/*control characters*/;de该结构中 c_cflag 最为重要,可设置波特率、数据位、校验位、停止位。在设置波特率时需在数字前加上 B,如 B9600、B19200。使用其需通过“与”“或”操作方式。常用的串口控制函数:Tcgetattr取属性(termios 结构)Tcsetattr设置属性(termios 结构)cfgetispeed得到输入速度Cfgetospeed得到输出速度Cfsetispeed设置输入速度Cfsetospeed设置输出速度tcflush刷清未决输入和/或输出3、串口的配置(1)保存原先串口配置使用 tcge
3、tattr(fd,&oldtio)函数:struct termios newtio,oldtio;tcgetattr(fd,&oldtio);(2)激活选项有 CLOCAL 和 CREAD,用于本地连接和接收使能。newtio.c_cflag|=CLOCAL|CREAD;(3)设置波特率,使用函数 cfsetispeed、cfsetospeedcfsetispeed(&newtio,B115200);cfsetospeed(&newtio,B115200);(4)设置数据位,需使用掩码设置。newtio.c_cflag&=CSIZE;newtio.c_cflag|=CS8;(5)设置奇偶校验位
4、,使用 c_cflag 和 c_iflag。设置奇校验:newtio.c_cflag|=PARENB;newtio.c_cflag|=PARODD;newtio.c_iflag|=(INPCK|ISTRIP);设置偶校验:newtio.c_iflag|=(INPCK|ISTRIP);newtio.c_cflag|=PARENB;newtio.c_cflag&=PARODD;(6)设置停止位,通过激活 c_cflag 中的 CSTOPB 实现。若停止位为 1,则清除 CSTOPB,若停止位为 2,则激活 CSTOPB。newtio.c_cflag&=CSTOPB;(7)设置最少字符和等待时间,对
5、于接收字符和等待时间没有特别要求时,可设为 0。newtio.c_ccVTIME=0;newtio.c_ccVMIN=0;(8)处理要写入的引用对象tcflush 函数刷清(抛弃)输入缓存(终端驱动程序已接收到,但用户程序尚未读)或输出缓存(用户程序已经写,但尚未发送)。int tcflush(int filedes,intqueue)queue 数应当是下列三个常数之一:?TCIFLUSH 刷清输入队列。?TCOFLUSH 刷清输出队列。?TCIOFLUSH 刷清输入、输出队列。如:tcflush(fd,TCIFLUSH);(9)激活配置。在完成配置后,需激活配置使其生效。使用 tsetta
6、ttr()函数。原型:int tcgetattr(int filedes,struct termios*termptr);int tcsetattr(int filedes,int opt,const structtermios*termptr);tcsetattr 的参数 opt 使我们可以指定在什么时候新的终端属性才起作用。opt 可以指定为下列常数中的一个:?TCSANOW更改立即发生。?TCSADRAIN 发送了所有输出后更改才发生。若更改输出参数则应使用此选择项。?TCSAFLUSH 发送了所有输出后更改才发生。更进一步,在更改发生时未读的所有输入数据都被删除(刷清)使用如:tcse
7、tattr(fd,TCSANOW,&newtio)4、在配置完串口的相关属性后,就可对串口进行打开,读写操作了。其使用方式与文件操作一样,区别在于串口是一个终端设备。(1)打开串口fd=open(/dev/ttyS0,O_RDWR|O_NOCTTY|O_NDELAY);Open 函数中除普通参数外,另有两个参数 O_NOCTTY 和 O_NDELAY。O_NOCTTY:通知 linux 系统,这个程序不会成为这个端口的控制终端。O_NDELAY:通知 linux 系统不关心 DCD 信号线所处的状态(端口的另一端是否激活或者停止)。(2)恢复串口的状态为阻塞状态,用于等待串口数据的读入。用 f
8、cntl 函数:fcntl(fd,F_SETFL,0);(3)接着,测试打开的文件描述府是否引用一个终端设备,以进一步确认串口是否正确打开。isatty(STDIN_FILENO);(4)串口的读写与普通文件一样,使用 read,write 函数。read(fd,buf,8);write(fd,buf,8);以下为一简单的程序实例:de#include#include#include#include#include#include#include#include#include int set_opt(int fd,int nSpeed,int nBits,char nEvent,int nS
9、top)struct termios newtio,oldtio;if(tcgetattr(fd,&oldtio)!=0)perror(SetupSerial 1);return-1;bzero(&newtio,sizeof(newtio);newtio.c_cflag|=CLOCAL|CREAD;newtio.c_cflag&=CSIZE;switch(nBits)case 7:newtio.c_cflag|=CS7;break;case 8:newtio.c_cflag|=CS8;break;switch(nEvent)case O:newtio.c_cflag|=PARENB;newti
10、o.c_cflag|=PARODD;newtio.c_iflag|=(INPCK|ISTRIP);break;case E:newtio.c_iflag|=(INPCK|ISTRIP);newtio.c_cflag|=PARENB;newtio.c_cflag&=PARODD;break;case N:newtio.c_cflag&=PARENB;break;switch(nSpeed)case 2400:cfsetispeed(&newtio,B2400);cfsetospeed(&newtio,B2400);break;case 4800:cfsetispeed(&newtio,B4800
11、);cfsetospeed(&newtio,B4800);break;case 9600:cfsetispeed(&newtio,B9600);cfsetospeed(&newtio,B9600);break;case 115200:cfsetispeed(&newtio,B115200);cfsetospeed(&newtio,B115200);break;default:cfsetispeed(&newtio,B9600);cfsetospeed(&newtio,B9600);break;if(nStop=1)newtio.c_cflag&=CSTOPB;else if(nStop=2)n
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux 串口 编程 简单 实例
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内