linux串口编程参数配置详解

合集下载

linux标准输入输出重定向到串口设置指南

linux标准输入输出重定向到串口设置指南

Linux标准输入输出重定向到串口指南邮箱:追风哥455546798@描述:设置linux系统的标准输入输出到com0(console口),以便维护人员在无网络、无显示器的情况下对系统维护。

在各文件(/etc/grub.conf、/etc/inittab、/etc/securetty)中添加红色部分!文件修改完成后reboot系统即可在com0口看到标准输入输出信息。

1、grub.conf 文件配置[root@localhost etc]# more grub.conf# grub.conf generated by anaconda## Note that you do not have to rerun grub after making changes to this file# NOTICE: You do not have a /boot partition. This means that# all kernel and initrd paths are relative to /, eg.# root (hd0,0)# kernel /boot/vmlinuz-version ro root=/dev/sda1# initrd /boot/initrd-[generic-]version.img#boot=/dev/sdadefault=2timeout=10splashimage=(hd0,0)/boot/grub/splash.xpm.gzhiddenmenuserial --unit=0 --speed=115200 --word=8 --parity=no --stop=1terminal --timeout=10 serial consoletitle Red Hat Enterprise Linux (2.6.32-71.el6.i686)root (hd0,0)kernel /boot/vmlinuz-2.6.32-71.el6.i686 roroot=UUID=0cdc97d9-4515-461c-9691-91a03b9a41ea console=ttyS0,115200n8 rd_NO_LUKS rd_NO_LVMrd_NO_MD rd_NO_DMLANG=zh_CN.UTF-8 KEYBOARDTYPE=pc KEYTABLE=us crashkernel=auto rhgb quietconsole=tty0initrd /boot/initramfs-2.6.32-71.el6.i686.img2、inittab 文件配置[root@localhost etc]# more inittabid:3:initdefault:S0:2345:respawn:/sbin/agetty -L -f /etc/issueserial 115200 ttyS0 vt100//说明在文件末尾添加S0:2345:xxxx行3、securetty 文件配置[root@localhost etc]# more securetty vc/10tty1tty2ttyS0//说明在文件末尾添加ttyS0。

嵌入式Linux下串口应用编程

嵌入式Linux下串口应用编程
_
式标志
ns u i ne g d s h o r t c
_
I f l a g  ̄ l i n e ,
式标志
ns u i ne g d s h o r t c
_

u ns i ne g d s h o r t C
_
r e a d ( ) 函数立 即返 回。若有可读 的数据时 ,则 读 取数据并返 回被 读取的字节 数,否则读取 失 败 并返 回0 ( 2 ) M I N 大于0 ,T I M E 为0 :r e a d ( ) 函数会等 待 到有M I N 个字节可 以被读取 ,否则一直处于 阻塞状态 。 ( 3 ) M I N 为0 ,而 T I M E > O : 只要满 足 两种情 形下:a 、存在数 据可读 ;b 、阻塞T I M E 的十 分 之一秒 ,r e a d 函数 就会返 回,其中返 回值为 读 取到的字节数 。如果在有数据 可读前超 时,则 r e a d ( ) 函数返 回值为0 。 ( 4 ) M I N 和T I M E 全 都大于0 : 只有满足如 下 两种情形之一 时,r e a d 0函数才会返 回 : 缓存 区 中有 M I N 个字节 ,或 者在两个 字符 之 间超 时 T I 艇个 十分之 一秒 。 从严格意义上 来讲,原始模式是一 种特 殊 的非规范模 式。在原始模 式下,对输入数据 的 处理方式是按 字节为单位 ,并且终端是 不可回 显的 。通过 调用C f m a k e r a w ( ) 函数就 可 以将 把 终端的该工作模式设置为原始模式 。 三 、简单 的串口设置详解流程 下面 以指 纹识别系统为例介 绍下串 口的操 作流程 。 本 系统 中,对串 口的操作和使用 可 以分为 如下几个 部分 :串口的初 始化 ( 包括 串 口设备 的打开 、串 口设备属 性的设置 )、串 口数据单 字节读取 、串 口数据 的多字节读取 、串 口数据 的单字节 写入、串 口数据 的多字节写入 串 口 设备的关闭 。 I . 串口设备 的初始化过程 ( 1 ) 打开 串口 在L i n u x 系统 中,对设 备的操 作如 同普通 文件 一样,在本系统 中打开串 口设备 的代码如 下所示 :

Linux下串口通信编程

Linux下串口通信编程

Linux下串口通信编程一、什么是串口通信?串口通信是指计算机主机与外设之间以及主机系统与主机系统之间数据的串行传送。

使用串口通信时,发送和接收到的每一个字符实际上都是一次一位的传送的,每一位为1或者为0。

二、串口通信的分类串口通信可以分为同步通信和异步通信两类。

同步通信是按照软件识别同步字符来实现数据的发送和接收,异步通信是一种利用字符的再同步技术的通信方式。

2.1 同步通信同步通信是一种连续串行传送数据的通信方式,一次通信只传送一帧信息。

这里的信息帧与异步通信中的字符帧不同,通常含有若干个数据字符。

它们均由同步字符、数据字符和校验字符(CRC)组成。

其中同步字符位于帧开头,用于确认数据字符的开始。

数据字符在同步字符之后,个数没有限制,由所需传输的数据块长度来决定;校验字符有1到2个,用于接收端对接收到的字符序列进行正确性的校验。

同步通信的缺点是要求发送时钟和接收时钟保持严格的同步。

2.2 异步通信异步通信中,数据通常以字符或者字节为单位组成字符帧传送。

字符帧由发送端逐帧发送,通过传输线被接收设备逐帧接收。

发送端和接收端可以由各自的时钟来控制数据的发送和接收,这两个时钟源彼此独立,互不同步。

接收端检测到传输线上发送过来的低电平逻辑"0"(即字符帧起始位)时,确定发送端已开始发送数据,每当接收端收到字符帧中的停止位时,就知道一帧字符已经发送完毕。

在异步通行中有两个比较重要的指标:字符帧格式和波特率。

(1)字符帧,由起始位、数据位、奇偶校验位和停止位组成。

1.起始位:位于字符帧开头,占1位,始终为逻辑0电平,用于向接收设备表示发送端开始发送一帧信息。

2.数据位:紧跟在起始位之后,可以设置为5位、6位、7位、8位,低位在前高位在后。

3.奇偶校验位:位于数据位之后,仅占一位,用于表示串行通信中采用奇校验还是偶校验。

(2)波特率,波特率是每秒钟传送二进制数码的位数,单位是b/s。

异步通信的优点是不需要传送同步脉冲,字符帧长度也不受到限制。

嵌入式操作系统Linux中的串口应用编程

嵌入式操作系统Linux中的串口应用编程


嵌入式操作系统 L x 的审口应用编程 iu 中 n
■ 厦 门 大 学 唐 建 东 卢 贵 主
针 对 嵌 入 式 Linux 操 作 系统 的 特 点 , 分 析 在 该 系统 下 串行 通 信 口编 程 控 制 的 方 法 , 总 结 程 序


设 计 的 步 骤 ; 在 嵌 入 式 Linux 系 统 上 , 编 写控 制 程 序 , 成 功 地 实 现 嵌 入 式 系统 与微 机 系 统

Te s I s r m e s, U SA .TM ¥3 0C X / X / xa n t u nt 2 l C2
更详 细 的 内容 在 此 不 再 多述 , 本 人将 另 文 介 绍 。■ _
参考 文献
l 彭 启 琮 , 李 玉 柏 ,管 庆 .DS P与 实 时 数 字 信 号 处 理 .成 都 :电 子 科 技 大 学 出版 社 , l 9 5 9 2 戴 明 桢 .数 字 信 号 处理 的 硬 件 实现 . 北 京 :
根 据 不 同 条 件 控 制 不 同 的 设 备 。 基 于 美 国 电 子 工 业 协 会 E A 的 串 口通 信 标 准 一 I RS 3 , 是 目前 广 泛 使 22 用 的 设备 控 制 通 信 接 口 。在 嵌 入 式 系统 中实 现 串 口 通 信 , 可 延 伸 系 统 的 应 用 触 角 , 扩 大 系 统 的 数 据 采
# k od iln m e il tpe u b r um b r m n f e a f ey n m e n l e2
1 嵌 入式 操作 系统 L n x串 口模 块 u i
L n x操 作 系 统 的 主 要 优 点 是 稳 定 、 内 核 可 重 iu 新 编 译 、 提 供 开 放 的 内 核 源 代 码 。 Li u 内 核 采 用 n x

嵌入式linux串口应用程序编写流程

嵌入式linux串口应用程序编写流程

嵌入式linux串口应用程序编写流程嵌入式Linux系统提供了丰富的串口接口,可以通过串口与其他设备进行通信,这为开发嵌入式系统提供了很多可能性。

下面是编写嵌入式Linux串口应用程序的流程:1. 确定串口设备:首先要确定要使用的串口设备,可以使用命令`ls /dev/tty*`来查看系统中可用的串口设备列表。

根据需要选择合适的串口设备。

2. 打开串口设备:在Linux系统中,使用文件的方式来操作串口设备。

可以使用C语言中的open函数来打开串口设备文件,并返回串口设备的文件描述符。

例如:`int serial_fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);`。

其中,`O_RDWR`表示以读写模式打开串口设备,`O_NOCTTY`表示打开设备后不会成为该进程的控制终端,`O_NDELAY`表示非阻塞模式。

3. 配置串口参数:打开串口设备后,需要配置串口参数,包括波特率、数据位、停止位、校验位等。

可以使用C语言中的termios库来进行串口参数的配置。

例如:```cstruct termios serial_config;tcgetattr(serial_fd, &serial_config);cfsetispeed(&serial_config, B115200);cfsetospeed(&serial_config, B115200);serial_config.c_cflag |= CS8;serial_config.c_cflag &= ~PARENB;serial_config.c_cflag &= ~CSTOPB;tcsetattr(serial_fd, TCSANOW, &serial_config);```上述代码将波特率设置为115200,数据位设置为8位,无校验位,一个停止位。

Linux下串口通信详解(上)打开串口和串口初始化详解

Linux下串口通信详解(上)打开串口和串口初始化详解

Linux下串口通信详解(上)打开串口和串口初始化详解Linux下串口通信主要有下面几个步骤串口通信流程图下面我会一一介绍这几个步骤。

1.打开串口代码(串口为ttyUSB0)[java] view plain copy1.//打开串口2.int open_port(void)3.{4.int fd;5.6.fd=open("/dev/ttyUSB0",O_RDWR | O_NOCTTY | O_NON BLOCK);//O_NONBLOCK设置为非阻塞模式,在read时不会阻塞住,在读的时候将read放在while循环中,下一节篇文档将详细讲解阻塞和非阻塞7.// printf("fd=%d\n",fd);8.9.if(fd==-1)10.{11.perror("Can't Open SerialPort");12.}13.14.return fd;15.}打开串口时也可以多加一些内容,比如判断串口为阻塞状态、测试是否为终端设备等,这些是必要的,所以较上面的基本的打开串口的代码,更加完整健壮一些的代码流程如下所示:打开串口较完整流程图代码:[cpp] view plain copy1./**2.* open port3.* @param fd4.* @param comport 想要打开的串口号5.* @return 返回-1为打开失败6.*/7.int open_port(int fd,int comport)8.{9.char *dev[]={"/dev/ttyUSB0","/dev/ttyS1","/dev/ttyS2"};10.11.if (comport==1)//串口112.{13.fd = open( "/dev/ttyUSB0", O_RDWR|O_NOCTTY|O_N DELAY);14.if (-1 == fd)15.{16.perror("Can't Open Serial Port");17.return(-1);18.}19.}20.else if(comport==2)//串口221.{22.fd = open( "/dev/ttyS1", O_RDWR|O_NOCTTY|O_NDEL AY); //没有设置<span style="font-family: Arial, Helvetica, sans-serif;">O_NONBLOCK非阻塞模式,也可以设置为非阻塞模式,两个模式在下一篇博客中具体说明</span>23.24.if (-1 == fd)25.{26.perror("Can't Open Serial Port");27.return(-1);28.}29.}30.else if (comport==3)//串口331.{32.fd = open( "/dev/ttyS2", O_RDWR|O_NOCTTY|O_NDEL AY);33.if (-1 == fd)34.{35.perror("Can't Open Serial Port");36.return(-1);37.}38.}39./*恢复串口为阻塞状态*/40.if(fcntl(fd, F_SETFL, 0)<0)41.printf("fcntl failed!\n");42.else43.printf("fcntl=%d\n",fcntl(fd, F_SETFL,0));44./*测试是否为终端设备*/45.if(isatty(STDIN_FILENO)==0)46.printf("standard input is not a terminal device\n");47.else48.printf("isatty success!\n");49.printf("fd-open=%d\n",fd);50.return fd;51.}关键函数解释:功能描述:用于打开或创建文件,成功则返回文件描述符,否则返回-1,open返回的文件描述符一定是最小的未被使用的描述符[cpp] view plain copy1.#include<fcntl.h>2.int open(const char *pathname, int oflag, ... );参数解释:pathname:文件路径名,串口在linux中被看做是一个文件oflag:一些文件模式选择,有如下几个参数可以设置•O_RDONLY只读模式•O_WRONLY只写模式•O_RDWR读写模式上面三个参数在设置的时候必须选择其中一个下面的是可选的•O_APPEND每次写操作都写入文件的末尾•O_CREAT如果指定文件不存在,则创建这个文件•O_EXCL如果要创建的文件已存在,则返回 -1,并且修改 errno 的值•O_TRUNC如果文件存在,并且以只写/读写方式打开,则清空文件全部内容•O_NOCTTY如果路径名指向终端设备,不要把这个设备用作控制终端。

linux下的串口通信原理及编程实例

linux下的串口通信原理及编程实例

linux下的串⼝通信原理及编程实例linux下的串⼝通信原理及编程实例⼀、串⼝的基本原理1 串⼝通讯串⼝通讯(Serial Communication),是指外设和计算机间,通过数据信号线、地线等,按位进⾏传输数据的⼀种通讯⽅式。

串⼝是⼀种接⼝标准,它规定了接⼝的电⽓标准,没有规定接⼝插件电缆以及使⽤的协议。

2 串⼝通讯的数据格式 ⼀个字符⼀个字符地传输,每个字符⼀位⼀位地传输,并且传输⼀个字符时,总是以“起始位”开始,以“停⽌位”结束,字符之间没有固定的时间间隔要求。

每⼀个字符的前⾯都有⼀位起始位(低电平),字符本⾝由7位数据位组成,接着字符后⾯是⼀位校验位(检验位可以是奇校验、偶校验或⽆校验位),最后是⼀位或⼀位半或⼆位停⽌位,停⽌位后⾯是不定长的空闲位,停⽌位和空闲位都规定为⾼电平。

实际传输时每⼀位的信号宽度与波特率有关,波特率越⾼,宽度越⼩,在进⾏传输之前,双⽅⼀定要使⽤同⼀个波特率设置。

3 通讯⽅式单⼯模式(Simplex Communication)的数据传输是单向的。

通信双⽅中,⼀⽅固定为发送端,⼀⽅则固定为接收端。

信息只能沿⼀个⽅向传输,使⽤⼀根传输线。

半双⼯模式(Half Duplex)通信使⽤同⼀根传输线,既可以发送数据⼜可以接收数据,但不能同时进⾏发送和接收。

数据传输允许数据在两个⽅向上传输,但是,在任何时刻只能由其中的⼀⽅发送数据,另⼀⽅接收数据。

因此半双⼯模式既可以使⽤⼀条数据线,也可以使⽤两条数据线。

半双⼯通信中每端需有⼀个收发切换电⼦开关,通过切换来决定数据向哪个⽅向传输。

因为有切换,所以会产⽣时间延迟,信息传输效率低些。

全双⼯模式(Full Duplex)通信允许数据同时在两个⽅向上传输。

因此,全双⼯通信是两个单⼯通信⽅式的结合,它要求发送设备和接收设备都有独⽴的接收和发送能⼒。

在全双⼯模式中,每⼀端都有发送器和接收器,有两条传输线,信息传输效率⾼。

显然,在其它参数都⼀样的情况下,全双⼯⽐半双⼯传输速度要快,效率要⾼。

Linux串口通信编程

Linux串口通信编程

2) 设置属性:奇偶校验位、数据位、停止位。

主要设置<termbits.h>中的termios3) 打开、关闭和读写串口。

串口作为设备文件,可以直接用文件描述符来进行网上的一个例子:/*串口设备无论是在工控领域,还是在嵌入式设备领域,应用都非常广泛。

而串口编程也就显得必不可少。

偶然的一次机会,需要使用串口,而且操作系统还要求是Linux,因此,趁着这次机会,综合别人的代码,进行了一次整理和封装。

具体的封装格式为C代码,这样做是为了很好的移植性,使它可以在C和C++环境下,都可以编译和使用。

代码的头文件如下: *//////////////////////////////////////////////////////////////////// //////////////filename:stty.h#ifndef__STTY_H__#define__STTY_H__//包含头文件#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<termios.h>#include<errno.h>#include<pthread.h>//// 串口设备信息结构typedef struct tty_info_t{int fd;// 串口设备IDpthread_mutex_t mt;// 线程同步互斥对象char name[24];// 串口设备名称,例:"/dev/ttyS0"struct termios ntm;// 新的串口设备选项struct termios otm;// 旧的串口设备选项}TTY_INFO;//// 串口操作函数TTY_INFO *readyTTY(int id);int setTTYSpeed(TTY_INFO *ptty,int speed);int setTTYParity(TTY_INFO *ptty,int databits,int parity,int st opbits);int cleanTTY(TTY_INFO *ptty);int sendnTTY(TTY_INFO *ptty,char*pbuf,int size);int recvnTTY(TTY_INFO *ptty,char*pbuf,int size);int lockTTY(TTY_INFO *ptty);int unlockTTY(TTY_INFO *ptty);#endif/*从头文件中的函数定义不难看出,函数的功能,使用过程如下:(1)打开串口设备,调用函数setTTYSpeed();(2)设置串口读写的波特率,调用函数setTTYSpeed();(3)设置串口的属性,包括停止位、校验位、数据位等,调用函数setTTYParity ();(4)向串口写入数据,调用函数sendnTTY();(5)从串口读出数据,调用函数recvnTTY();(6)操作完成后,需要调用函数cleanTTY()来释放申请的串口信息接口;其中,lockTTY()和unlockTTY()是为了能够在多线程中使用。

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

linux串口编程参数配置详解1.linux串口编程需要的头文件#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中断控制定义#include <errno.h> //错误号定义2.打开串口串口位于/dev中,可作为标准文件的形式打开,其中:串口1 /dev/ttyS0串口2 /dev/ttyS1代码如下:int fd;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这个程序不想成为“控制终端”控制的程序,不说明这个标志的话,任何输入都会影响你的程序。

O_NDELAY:告诉Unix这个程序不关心DCD信号线状态,即其他端口是否运行,不说明这个标志的话,该程序就会在DCD信号线为低电平时停止。

3.设置波特率最基本的串口设置包括波特率、校验位和停止位设置,且串口设置主要使用termios.h头文件中定义的termios结构,如下:struct termios{tcflag_t c_iflag; //输入模式标志tcflag_t c_oflag; //输出模式标志tcflag_t c_cflag; //控制模式标志tcflag_t c_lflag; //本地模式标志cc_t c_line; //line disciplinecc_t c_cc[NCC]; //control characters}代码如下:int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300, B384 00, B19200, B9600, B4800, B2400, B1200, B300, };int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300, 38400, 19200, 9 600, 4800, 2400, 1200, 300, };void SetSpeed(int fd, int speed){int i;struct termios Opt; //定义termios结构if(tcgetattr(fd, &Opt) != 0){perror(“tcgetattr fd”);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) != 0){perror(“tcsetattr fd”);return;}tcflush(fd, TCIOFLUSH);}}}注意tcsetattr函数中使用的标志:TCSANOW:立即执行而不等待数据发送或者接受完成。

TCSADRAIN:等待所有数据传递完成后执行。

TCSAFLUSH:Flush input and output buffers and make the change 4.设置数据位、停止位和校验位以下是几个数据位、停止位和校验位的设置方法:(以下均为1位停止位)8位数据位、无校验位:Opt.c_cflag &= ~PARENB;Opt.c_cflag &= ~CSTOPB;Opt.c_cflag &= ~CSIZE;Opt.c_cflag |= CS8;7位数据位、奇校验:Opt.c_cflag |= PARENB;Opt.c_cflag |= PARODD;Opt.c_cflag &= ~CSTOPB;Opt.c_cflag &= ~CSIZE;Opt.c_cflag |= CS7;7位数据位、偶校验:Opt.c_cflag |= PARENB;Opt.c_cflag &= ~PARODD;Opt.c_cflag &= ~CSTOPB;Opt.c_cflag &= ~CSIZE;Opt.c_cflag |= CS7;7位数据位、Space校验:Opt.c_cflag &= ~PARENB;Opt.c_cflag &= ~CSTOPB;Opt.c_cflag &= ~CSIZE;Opt.c_cflag |= CS7;代码如下:int SetParity(int fd, int databits, int stopbits, int parity) {struct termios Opt;if(tcgetattr(fd, &Opt) != 0){perror("tcgetattr fd");return FALSE;}Opt.c_cflag |= (CLOCAL | CREAD); //一般必设置的标志switch(databits) //设置数据位数{case 7:Opt.c_cflag &= ~CSIZE;Opt.c_cflag |= CS7;break;case 8:Opt.c_cflag &= ~CSIZE;Opt.c_cflag |= CS8;berak;default:fprintf(stderr, "Unsupported data size.\n");return FALSE;}switch(parity) //设置校验位{case 'n':case 'N':Opt.c_cflag &= ~PARENB; //清除校验位Opt.c_iflag &= ~INPCK; //enable parity checkingbreak;case 'o':case 'O':Opt.c_cflag |= PARENB; //enable parityOpt.c_cflag |= PARODD; //奇校验Opt.c_iflag |= INPCK //disable parity checkingbreak;case 'e': case 'E': Opt.c_cflag |= PARENB; //enable parity Opt.c_cflag &= ~PARODD; //偶校验 Opt.c_iflag |= INPC K; //disable pairty checking break; case 's': case 'S': Op t.c_cflag &= ~PARENB; //清除校验位 Opt.c_cflag &= ~CSTOPB; / /?????????????? Opt.c_iflag |= INPCK; //disable pairty checking break; default: fprintf(stderr, "Unsupported parity.\n"); retu rn FALSE; } switch(stopbits) //设置停止位 { case 1: Opt. c_cflag &= ~CSTOPB; break; case 2: Opt.c_cflag |= CSTOPB; break; default: fprintf(stderr, "Unsupported stopbits.\n"); re turn FALSE; } opt.c_cflag |= (CLOCAL | CREAD); opt.c_lflag &= ~(ICAN ON | ECHO | ECHOE | ISIG); opt.c_oflag &= ~OPOST; opt.c_oflag &= ~ (ONLCR | OCRNL); //添加的 opt.c_iflag &= ~(ICRNL | INLCR); opt.c_ifla g &= ~(IXON | IXOFF | IXANY); //添加的 tcflush(fd, TCIFLUSH); Opt.c_cc [VTIME] = 0; //设置超时为15sec Opt.c_cc[VMIN] = 0; //Update the O pt and do it now if(tcsetattr(fd, TCSANOW, &Opt) != 0) { perror("tcse tattr fd"); return FALSE; } return TRUE; }5.某些设置项在第四步中我们看到一些比较特殊的设置,下面简述一下他们的作用。

c_cc数组的VSTART和VSTOP元素被设定成DC1和DC3,代表ASCII标准的XON和XOFF字符,如果在传输这两个字符的时候就传不过去,需要把软件流控制屏蔽,即:Opt.c_iflag &= ~ (IXON | IXOFF | IXANY);有时候,在用write发送数据时没有键入回车,信息就发送不出去,这主要是因为我们在输入输出时是按照规范模式接收到回车或换行才发送,而更多情况下我们是不必键入回车或换行的。

此时应转换到行方式输入,不经处理直接发送,设置如下:Opt.c_lflag &= ~ (ICANON | ECHO | ECHOE | ISIG);还存在这样的情况:发送字符0X0d的时候,往往接收端得到的字符是0X0a,原因是因为在串口设置中c_iflag和c_oflag中存在从NL-CR和CR-NL的映射,即串口能把回车和换行当成同一个字符,可以进行如下设置屏蔽之:Opt.c_iflag &= ~ (INLCR | ICRNL | IGNCR);Opt.c_oflag &= ~(ONLCR | OCRNL);注意:控制符VTIME和VMIN之间有复杂的关系。

相关文档
最新文档