LINUX C C++串口读写串口读写

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Linux C/C++串口读写

串口简介

串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用。常用的串口是RS-232-C 接口(又称EIA RS-232-C )它是在1970年由美国电子工业协会(EIA )联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是"数据终端设备(DTE )和数据通讯设备(DCE )之间串行二进制数据交换接口技术标准"该标准规定采用一个25个脚的DB25连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定。传输距离在码元畸变小于4%的情况下,传输电缆长度应为50英尺。

Linux 操作系统从一开始就对串行口提供了很好的支持计算机串口的引脚说明

序号信号名称符号流向功能

2发送数据TXD DTE →DCE DTE 发送串行数据3接收数据RXD DTE ←DCE DTE 接收串行数据4请求发送RTS DTE →DCE DTE 请求DCE 将线路切换到发送方式

5允许发送CTS DTE ←DCE DCE 告诉DTE 线路已接通可以发送数据

6数据设备准备好DSR DTE ←DCE DCE 准备好7信号地信号公共地8载波检测DCD DTE ←DCE 表示DCE 接收到远程载波20数据终端准备好DTR DTE →DCE DTE 准备好22振铃指示RI DTE ←DCE 表示DCE 与线路接通,出现振铃

串口操作

打开串口

在Linux下串口文件是位于/dev下的

串口一为/dev/ttyS0

串口二为/dev/ttyS1

设置串口

最基本的设置串口包括波特率设置,效验位和停止位设置。

设置这个结构体很复杂,我这里就只说说常见的一些设置:波特率设置

效验位和停止位的设置:

无效验8位Option.c_cflag&=~PARENB; Option.c_cflag&=~CSTOPB; Option.c_cflag&=~CSIZE; Option.c_cflag|=~CS8;

奇效验(Odd)7位Option.c_cflag|=~PARENB;

Option.c_cflag &=~PARODD;Option.c_cflag &=~CSTOPB;Option.c_cflag &=~CSIZE;Option.c_cflag |=~CS7;偶效验(Even)7位

Option.c_cflag &=~PARENB;Option.c_cflag |=~PARODD;Option.c_cflag &=~CSTOPB;Option.c_cflag &=~CSIZE;Option.c_cflag |=~CS7;Space 效验

7位Option.c_cflag &=~PARENB;Option.c_cflag &=~CSTOPB;Option.c_cflag &=&~CSIZE;Option.c_cflag |=CS8;

需要注意的是:

如果不是开发终端之类的,只是串口传输数据,而不需要串口来处理,那么使用

读写串口

设置好串口之后,读写串口就很容易了,把串口当作文件读写就是。

∙读取串口数据

使用文件操作read函数读取,如果设置为原始模式(Raw Mode)传输

数据,那么read函数返回的字符数是实际串口收到的字符数。

可以使用操作文件的函数来实现异步读取,如fcntl,或者select等来

关闭串口

1、虚拟机下使用串口的方法

使用vmwave,默认串口设备是没有添加的,通过vmwave将设备加入即可正常使用串口。虚拟机串口打开后,可能会占用windows下的串口。另外,虚拟机的串口收发比正常的速度的确要慢许多。

2、消除Linux串口收发的一些规则

Linux串口收发有许多模式,如:

(1)接收返回模式:如果串口没有接收到数据,read()函数不返回。

(2)数据接收\n才返回接收的数据,否则read()函数返回0

(3)特殊字符解析问题,部分特殊字符接收/发送时,会被屏蔽或者转义。如发送0x0A接收变为0x0A0x0A,0x0D被屏蔽等。

(4)接收反馈:如串口接收到数据,立即将该数据发送出去。

(上面是我遇到的一些问题,可能表述不很清楚,呵呵。如果用于收发txt文件,一般不大注意。)

3、解决问题的方法是,消除这些默认规则,关键是struct termios的参数影响。struct termios{

tcflag_t c_iflag;/**//*输入模式旗标*/

tcflag_t c_oflag;/**//*输出模式旗标*/

tcflag_t c_cflag;/**//*控制模式旗标*/

tcflag_t c_lflag;/**//*区域模式旗标*/

cc_t c_line;/**//*行控制(line discipline)*/

cc_t c_cc[NCCS];/**//*控制特性*/

};

由于研究不深,如果要消除所有上面的规则,我是如下处理的

struct termios options;

串口打开方式:

open("dev/ttyS0",O_RDWR|O_NOCTTY|O_NDELAY);

消除收发模式规则:

options.c_lflag=0;

options.c_oflag=0;

options.c_iflag=0;

消除字符屏蔽规则:

options.c_cc[VINTR]=0;/**//*Ctrl-c*/

options.c_cc[VQUIT]=0;/**//*Ctrl-*/

options.c_cc[VERASE]=0;/**//*del*/

options.c_cc[VKILL]=0;/**//*@*/

options.c_cc[VEOF]=0;/**//*Ctrl-d*/

options.c_cc[VTIME]=1;/**//**/

options.c_cc[VMIN]=0;/**//**/

options.c_cc[VSWTC]=0;/**//*''*/

options.c_cc[VSTART]=0;/**//*Ctrl-q*/

options.c_cc[VSTOP]=0;/**//*Ctrl-s*/

options.c_cc[VSUSP]=0;/**//*Ctrl-z*/

options.c_cc[VEOL]=0;/**//*''*/

options.c_cc[VREPRINT]=0;/**//*Ctrl-r*/

options.c_cc[VDISCARD]=0;/**//*Ctrl-u*/

options.c_cc[VWERASE]=0;/**//*Ctrl-w*/

options.c_cc[VLNEXT]=0;/**//*Ctrl-v*/

options.c_cc[VEOL2]=0;/**//*''*/

以上设置,在其它参数串口设置前执行,如果你需要保留部分参数,请参阅/article.php?articleId=15964&blogId=60

在RedHat Feroda4下编译通过

===========非阻塞read===========

Q:在调用串口read(fd,buff,len);时,如果串口没有数据,会停在read处,请问

相关文档
最新文档