Linux串口编程详解(4)
况下,你可能需要选择INPCK和ISTRIP将奇偶校验设置为有效同时从接收字串中脱去奇偶校验位:
options.c_iflag |= (INPCK | ISTRIP);
IGNPAR是一个比较危险选项,即便有错误发生时,它也会告诉串口驱动直接忽略奇偶校验错误给数据放行。这个选项在测试链接的通讯质量时比较有用而通常不会被用在实际程序中。
PARMRK会导致奇偶校验错误被标志成特殊字符加入到输入流之中。如果IGNPAR选项也是有效的,那么一个NUL(八进制000)字符会被加入到发生奇偶校验错误的字符前面。否则,DEL(八进制177)和NUL字符会和出错的字符一起送出。
↑
设置软件流控制 ?
软件流控制可以通过IXON,IXOFF和IXANY常量设置成有效:
options.c_iflag |= (IXON | IXOFF | IXANY);
将其设置为无效的时候,很简单,只需要对这些位取反:
options.c_iflag &= ~(IXON | IXOFF | IXANY);
XON(start data)和XOFF(stop data)字符却是在c_cc数组中定义的,下面会详细描述这个数组。
↑
输出选项 ?
成员变量c_oflag之中包括了输出过滤选项。和输入模式相似,程序可以选择使用经过加工的或者原始的数据输出。 c_oflag成员的常量
常量 OPOST OLCUC ONLCR OCRNL
描述
Postprocess output (not set = raw output) Map lowercase to uppercase Map NL to CR-NL Map CR to NL
NOCR No CR output at column 0
ONLRET NL performs CR function OFILL Use fill characters for delay OFDEL Fill character is DEL
NLDLY Mask for delay time needed between lines NL0 No delay for NLs
NL1 Delay further output after newline for 100 milliseconds CRDLY Mask for delay time needed to return carriage to left column CR0 No delay for CRs
CR1 Delay after CRs depending on current column position CR2 Delay 100 milliseconds after sending CRs CR3
Delay 150 milliseconds after sending CRs
TABDLY Mask for delay time needed after TABs TAB0 No delay for TABs
TAB1 Delay after TABs depending on current column position TAB2 Delay 100 milliseconds after sending TABs TAB3 Expand TAB characters to spaces BSDLY Mask for delay time needed after BSs BS0 No delay for BSs
BS1 Delay 50 milliseconds after sending BSs VTDLY Mask for delay time needed after VTs VT0 No delay for VTs
VT1 Delay 2 seconds after sending VTs FFDLY Mask for delay time needed after FFs FF0 No delay for FFs
FF1
Delay 2 seconds after sending FFs
选择加工过的输出 ?
↑
通过在c_oflag成员变量中设置OPOST选项的方法程序可以选择加工过的输入。
options.c_oflag |= OPOST;
在所有选项当中,你可能只需要使用ONLCR选项来将行分隔符映射到CR-LF组合对上。其他选项主要是历史遗留,仅仅与行打印机和终端跟不上串行数据的年代有关。
↑
选择原始输出 ?
原始输出方式可以通过在c_oflag中重置OPOST选项来选择:
options.c_oflag &= ~OPOST;
如果OPOST选项被设置成无效的话,其他c_oflag中的选项都会失效。
↑
控制字符 ?
字符数组c_cc里面包括了控制字符的定义和超时参数。这个数组的每个元素都是以常量定义的。
成员变量c_cc中的控制字符
常量 VINTR VQUIT
描述 Interrupt Quit
键 CTRL-C CTRL-Z
Backspace (BS) CTRL-U CTRL-D
Carriage return (CR) Line feed (LF) -
CTRL-Q (XON) CTRL-S (XOFF)
VERASE Erase VKILL VEOF VEOL VEOL2 VMIN
Kill-line End-of-file End-of-line Second end-of-line
Minimum number of characters to read
VSTART Start flow VSTOP
Stop flow
VTIME Time to wait for data (tenths of seconds) -
↑
设置软件流控制字符 ?
用来做软件流控制的字符包含在数组c_cc的VSTART和VSTOP元素里面。通常情况下,它们应该被设置成DC1(八进制021)和DC3(八进制023),它们在ASCII标准中代表着XON和XOFF字符。
↑
设置读取超时 ?
UNIX串口驱动提供了设置字符和包超时的能力。数组c_cc中有两个元素可以用来设置超时:VMIN和VTIME。在经典输入模式或者通过open(2)和fcntl(2)函数传递NDELAY选项时,超时设置会被忽略。
VMIN可以指定读取的最小字符数。如果它被设置为0,那么VTIME值则会指定每个字符读取的等待时间。
如果VMIN不为零,VTIME会指定等待第一个字符读取操作的时间。如果在这个指定时间中可以开始读取某个字符,直到VMIN个数的所有字符全部被读取,其他读取操作将会被阻塞(等待)。也就是说,一旦读取第一个字符,串口驱动的预期就是接收到整个字符包(一共VMIN字节)。如果在允许的时间内没有字符被读取,那么read(2)调用就会返回0。通过这个方法可以确切得告诉串口驱动程序需要读取N个字节,而且read(2)调用只会返回N或者0。然而,超时设置只对第一个字符的读取操作有效,所以,如果因为某些原因驱动程序在N字节的包中丢失某个字符的话,read(2)调用将会一直等下去。
VTIME可以以十分之一秒为单位指定等待字符输入的时间。如果VTIME设置为0(默认情况),除非open(2)或者fcntl(2)函数设置了NDELAY选项,否则read(2)将会永久得阻塞(等待)。
↑
调制解调器通讯 ?
说到串口通讯就不得不提一下通过调剂解调器通讯的方式。这里给出的程序例子都适用于支持“事实上的”标准AT命令集的调制解调器。
↑
什么是调制解调器 ?
调制解调器是一种可以将数字信号的串行数据转化为模拟信号频率的设备。通过这种转换,信息就可以通过像电话线或者有线电视线缆那样的模拟数据链路来传输了。口语中,经常将调制解调器称作“猫”。标准的电话调制解调器可以将串行数据转化为能够通过电话线传输的音频;因为这种转化非常之快又非常复杂,所以如果你去听一下的话,这些音频很像是大声尖叫时发出来的声音。
今天可以见到的调制解调器可以通过电话线每秒传输53000比特——5.3Kbps——的数据。还有就是,大多数调制解调器都使用数据压缩技术,这样就可以将某些类型数据的传输比特率提高到100kbps。
↑
与调制解调器通讯 ?
于调制解调器通讯的第一步就是要以原始输入模式打开和配置串口。
int fd;
struct termios options; /* open the port */
fd = open(\O_NDELAY);
fcntl(fd, F_SETFL, 0);
/* get the current options */ tcgetattr(fd, &options);
/* set raw input, 1 second timeout */ options.c_cflag |= (CLOCAL | CREAD);
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
options.c_oflag &= ~OPOST; options.c_cc[VMIN] = 0; options.c_cc[VTIME] = 10;
/* set the options */
tcsetattr(fd, TCSANOW, &options);
接下来就需要和调制解调器建立通讯连接。最好的办法就是 …… 此处隐藏:2341字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [综合文档]应答器设备技术规范(征求意见稿)A1
- [综合文档]教师 2012年高考政治试题按考点分类汇
- [综合文档]保险公司的总经理助理竞职演说
- [综合文档]卫生应急大练兵大比武活动考试--题库(
- [综合文档]徐州经济技术开发区总体规划环境影响报
- [综合文档]汉语拼音表(带声调)
- [综合文档]二年级 上 思维训练( 1~18)
- [综合文档]特色学校五年发展规划
- [综合文档]机床经常出现报警“X1轴定位监控”
- [综合文档]《电子技术基础》21.§5—2、3、4 习题
- [综合文档]浙江省深化普通高中课程改革
- [综合文档]CRISP原理 - 图文
- [综合文档]2017年电大社会调查研究与方法形考答案
- [综合文档]浅析建筑施工安全毕业论文
- [综合文档]《回忆我的母亲》名师教案
- [综合文档]装饰装修工程监理规划
- [综合文档]三下乡心得体会-文艺
- [综合文档]柱计算长度系数 - 图文
- [综合文档]全流程思考,提高燃电系统热电转换率--
- [综合文档]2018年嘉定区中考物理一模含答案
- 433M车库门滚动码遥控器
- 8、架空线路施工规范
- 大学四年声乐学习的体会
- 新北师大版五年级数学上册《轴对称再认
- 部编版五年级上册语文第六单元小结复习
- 小学六年级英语形容词用法
- 第2课 抗美援朝保家卫国 课件01(岳麓版
- 2015年天津大学运筹学基础考研真题,考
- 微机计算机控制技术课后于海生(第2版)
- 安全教育实践活动
- Delphi程序设计教程_第1章_Delphi概述
- 第八讲 工业革命与启蒙运动
- 《中华人民共和国药典》2005年版二部勘
- 科粤版九年级化学2.3构成物质的微粒(1)
- 西师大版数学三年级下册《长方形、正方
- ch6_冒泡排序演示
- 第4章 冲裁模具设计
- 浙江中小民营企业员工流失论文[终稿]
- 再议有线数字电视市场营运模式
- 昆明供水工程监理大纲




