当前位置: 首页 > 编程日记 > 正文

【linux】串口编程(一)——配置串口

目前遇到的串口编程都是用于通信,很少作为终端显示。以前没有对串口编程做深入研究,本次以libmodbus源码中对串口的设置为例,详解总结串口编程时配置的属性(struct termios)

以libmodbus中_modbus_rtu_connect函数为例

【1】打开串口设备

static int _modbus_rtu_connect(modbus_t *ctx)
{struct termios tios;speed_t speed;modbus_rtu_t *ctx_rtu = ctx->backend_data;/*O_RDWR:读写O_NOCTTY:该端口不作为终端使用,如果没有设置该标志位,一些输入信号会影响到程序O_NDELAY:非阻塞模式O_EXCL:未知,待测????*/ctx->s = open(ctx_rtu->device, O_RDWR | O_NOCTTY | O_NDELAY | O_EXCL);if (ctx->s == -1) {fprintf(stderr, "ERROR Can't open the device %s (%s)\n",ctx_rtu->device, strerror(errno));return -1;}

【2】保存旧属性

    tcgetattr(ctx->s, &(ctx_rtu->old_tios));

【3】设置输出、输入波特率

    memset(&tios, 0, sizeof(struct termios));switch (ctx_rtu->baud) {case 110:speed = B110;break;case 300:speed = B300;break;case 600:speed = B600;break;case 1200:speed = B1200;break;case 2400:speed = B2400;break;case 4800:speed = B4800;break;case 9600:speed = B9600;break;case 19200:speed = B19200;break;case 38400:speed = B38400;break;case 57600:speed = B57600;break;case 115200:speed = B115200;break;default:speed = B9600;}if ((cfsetispeed(&tios, speed) < 0) ||(cfsetospeed(&tios, speed) < 0)) {close(ctx->s);ctx->s = -1;return -1;}

【4】设置控制属性

CREAD、CLOCAL这两个选项可以保证你的程序不会变成端口的所有者,而端口所有者必须去处理发散性作业控制和挂断信号,同时还保证了串行接口驱动会读取过来的数据字节
如果串口不是用来做终端显示,这两个选项就够了

    tios.c_cflag |= (CREAD | CLOCAL);

####【5】设置数据位,先清空后设置

    tios.c_cflag &= ~CSIZE;switch (ctx_rtu->data_bit) {case 5:tios.c_cflag |= CS5;break;case 6:tios.c_cflag |= CS6;break;case 7:tios.c_cflag |= CS7;break;case 8:default:tios.c_cflag |= CS8;break;}

####【6】设置停止位

    if (ctx_rtu->stop_bit == 1)tios.c_cflag &=~ CSTOPB;else /* 2 */tios.c_cflag |= CSTOPB;

####【7】设置奇偶校验位
PARENB Enable parity bit:使能校验
PARODD Use odd parity instead of even:使用奇校验
#####【7.1】不使用校验位

    if (ctx_rtu->parity == 'N') {/* None */tios.c_cflag &=~ PARENB;} 

#####【7.2】使用偶校验

	else if (ctx_rtu->parity == 'E') {/* Even */tios.c_cflag |= PARENB;tios.c_cflag &=~ PARODD;} 

#####【7.3】使用奇校验

	else {/* Odd */tios.c_cflag |= PARENB;tios.c_cflag |= PARODD;}

####【8】终端输入(行输入)的特性
ISIG Enable SIGINTR, SIGSUSP, SIGDSUSP, and SIGQUIT signals:使能信号中断
ICANON Enable canonical input (else raw);使用规范的输入流,否则是原始输入流
XCASE Map uppercase \lowercase (obsolete):大小写映射(不再推荐使用)
ECHO Enable echoing of input characters:使能回显
ECHOE Echo erase character as BS-SP-BS
ECHOK Echo NL after kill character
ECHONL Echo NL
NOFLSH Disable flushing of input buffers after interrupt or quit characters
IEXTEN Enable extended functions
ECHOCTL Echo control characters as ^char and delete as ~?
ECHOPRT Echo erased character as character erased
ECHOKE BS-SP-BS entire line on line kill
FLUSHO Output being flushed
PENDIN Retype pending input at next read or input char
TOSTOP Send SIGTTOU for background output
规范输入(或称为标准输入)是面向行的。
输入字符被放到一个缓冲区中,可以被用户交互式地编辑,直到收到一个CR(回车)或(换行)字符。
Canonical input is line-oriented. Input characters are put
into a buffer which can be edited interactively by the user
until a CR (carriage return) or LF (line feed) character is
received.

原始输入流是未经过加工的。输入字符在接收时完全按照接收到的字符进行传递。
通常,在使用原始输入时,您将取消选择ICANON、ECHO、ECHOE和ISIG选项
Raw input is unprocessed. Input characters are passed
through exactly as they are received, when they are
received. Generally you’ll deselect the ICANON, ECHO,
ECHOE, and ISIG options when using raw input

【8.1】作为原始流,屏蔽终端输入(行输入)的特性
    tios.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);

####【9】输入标志设置
INPCK Enable parity check:使能奇偶校验
IGNPAR Ignore parity errors:忽略奇偶校验错误
PARMRK Mark parity errors:标记奇偶校验错误
ISTRIP Strip parity bits:跳过奇偶校验位
IXON Enable software flow control (outgoing):使能软件流控(向外)
IXOFF Enable software flow control (incoming):使能软件流控(向内)
IXANY Allow any character to start flow again:允许任何字符重新开始流(???)
IGNBRK Ignore break condition:忽略打破条件
BRKINT Send a SIGINT when a break condition is detected:当检测到中断条件时发送一个SIGINT
INLCR Map NL to CR:将换行映射为回车
IGNCR Ignore CR:忽略回车
ICRNL Map CR to NL:将回车映射为换行
IUCLC Map uppercase to lowercase:将大写映射为小写
IMAXBEL Echo BEL on input line too long:当输入行太长时,显示为BEL
#####【9.1】设置输入奇偶校验

    if (ctx_rtu->parity == 'N') {/* None */tios.c_iflag &= ~INPCK;} else {tios.c_iflag |= INPCK;}
【9.2】禁止软件流控
/* Software flow control is disabled */
tios.c_iflag &= ~(IXON | IXOFF | IXANY);

####【10】输出标志设置
OPOST Postprocess output (not set = raw output):处理后再输出(原始流不设置)
ONLCR Map NL to CR-NL:将换行映射为回车-换行

ONCLR ant others needs OPOST to be enabled:OPOST使能后,ONCLR才有效

#####【10.1】原始流输出
tios.c_oflag &=~ OPOST;

####【11】字节流控制设置
VMIN Minimum number of characters to read:读取最少的字节数

VTIME Time to wait for data (tenths of seconds):等待数据时间(单位是十分之一秒)

UNIX串行接口驱动程序提供了指定字符和包超时的能力。
c_cc数组的两个元素用于超时:VMIN和VTIME。
在规范输入模式下、open或fcntl时使用O_NDELAY选项时,上述功能将被忽略(失效)。

UNIX serial interface drivers provide the ability to specify character and packet timeouts. Two elements of the c_cc array are used for timeouts: VMIN and VTIME. Timeouts are ignored in canonical input mode or when the NDELAY option is set on the file via open or fcntl.

VMIN指定要读取的字节的最小数量。如果设置为0,在VTIME指定的时间内等待读取任意字符。
注意,这并不意味着read N个字节将等待N个字符的出现。
相反,超时后,read调用将返回立即可用的字符或read时请求的字符数量(两者取最小的那个)。

VMIN specifies the minimum number of characters to read. Ifit is set to 0, then the VTIME value specifies the time towait for every character read. Note that this does not meanthat a read call for N bytes will wait for N characters tocome in. Rather, the timeout will apply to the firstcharacter and the read call will return the number ofcharacters immediately available (up to the number yourequest).

如果VMIN不为0,VTIME指定等待第一个字符读取的时间。如果在给定的时间内读取字符,那么任何读都会阻塞(等待),直到所有的VMIN字符被读取。也就是说,一旦第一个字符被读取,串行接口驱动程序就会期望接收整包字符(VMIN字节总数)。如果在允许的时间内没有读取字符,则读取的调用返回0。该方法允许您告诉串行驱动程序,您需要确切的N字节,任何读调用将返回0或N字节。然而,超时只适用于第一个字符读取,因此如果由于某种原因,驱动程序在N字节包中丢失了一个字符,那么read调用可能会永远阻塞,等待额外的输入字符。
(注:上述为翻译,不太理解。亲测的现象总结如下:
1、VMIN小于read指定字符个数:在超时范围内获取VMIN个字符时,返回;
2、VMIN大于read指定字符个数:在超时范围内获取read指定字符个数时,返回;
3、超时会受到新数据到达时间的影响:如果在超时范围内没有新数据到达,将因为超时返回;如果在超时范围内有新数据到达,将重新计时,直到上述两种情况之一才会返回,否则会一直等待。)

   If VMIN is non-zero, VTIME specifies the time to wait for the first character read. If a character is read within the time given, any read will block (wait) until all VMIN  characters are read. That is, once the first character is read, the serial interface driver expects to receive an  entire packet of characters (VMIN bytes total). If no  character is read within the time allowed, then the call to read returns 0. This method allows you to tell the serial  driver you need exactly N bytes and any read call will  return 0 or N bytes. However, the timeout only applies to the first character read, so if for some reason the driver   misses one character inside the N byte packet then the read  call could block forever waiting for additional input characters.

VTIME指定等待输入字符的时间。
如果VTIME设置为0(默认),则读取将无限期地阻塞(等待),除非在open或fcntl中指定O_NDELAY选项。

   VTIME specifies the amount of time to wait for incoming  characters in tenths of seconds. If VTIME is set to 0 (the default), reads will block (wait) indefinitely unless the NDELAY option is set on the port with open or fcntl.
Unused because we use open with the NDELAY option 
【11.1】因为已经在open中使用O_NDELAY选项,所以不再使用c_cc
    tios.c_cc[VMIN] = 0;tios.c_cc[VTIME] = 0;

#####【12】设置串口属性

   if (tcsetattr(ctx->s, TCSANOW, &tios) < 0) {close(ctx->s);ctx->s = -1;return -1;}
}
#if HAVE_DECL_TIOCSRS485/* The RS232 mode has been set by default */ctx_rtu->serial_mode = MODBUS_RTU_RS232;
#endifreturn 0;
}

相关文章:

Playboy封面女郎、互联网第一夫人,程序员们的“钢铁审美”

整理 | 琥珀 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 46 年前&#xff0c;《花花公子》&#xff08;Playboy&#xff09;的一期杂志封面女郎 Lenna&#xff0c;成为数万“钢铁直男”的梦中女神。然而&#xff0c;这位女性更为人所知的是她在计算机图像处理领…

开源实时日志分析ELK

开源实时日志分析ELK 2018-01-04 转自&#xff1a;开源实时日志分析ELK平台部署 日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷&#xff0c;性…

【linux】串口编程(二)——非阻塞接收

项目中很少会使用阻塞接收&#xff0c;一般都是selectread监听模式来实现非阻塞接收。 使用selece时&#xff0c;需要处理一些异常情况的返回&#xff0c;比如&#xff1a;系统中断产生EINTR错误&#xff1b;超时错误ETIMEDOUT。 使用read时&#xff0c;需要处理读取时可能出现…

使用Photoshop制作网页模板

用图层组管理网页元素首先是在Photoshop中制作好网页的框架。网页中的元素有很多&#xff0c; 像Banner条、文本框、文字、版权、Logo、广告等。尽量把这些相对独立的元素放在不同的图层中&#xff0c;这样方便以后的再编辑。不过图层一多&#xff0c;就 显得很凌乱&#xff0c…

赵本山:我的时代还没有结束 | Python告诉你

作者 | 丁彦军来源 | 恋习Python&#xff08;ID: sldata2017&#xff09;【AI科技大本营按】今年春晚的小品好看吗&#xff1f;没有了赵本山的春晚总觉得少了点什么&#xff0c;然而许久不登春晚舞台的本山大叔借着B站的东风证明了「你大爷还是你大爷」。最近很多人被“改革春…

038——VUE中组件之WEB开发中组件使用场景与定义组件的方式

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>组件之WEB开发中组件使用场景与定义组件的方式</title><script src"vue.js"></script> </head> <body> <…

IronPython系列:Composite Pattern及其实现

最近挺经常做鱼的。对于做鱼的步骤算是熟悉。以烤制为例&#xff0c;主要有三步&#xff1a;洗&#xff08;Clean&#xff09;、切&#xff08;Cut&#xff09;和烤&#xff08;Bake&#xff09;。烤鱼&#xff08;Bake&#xff09;又有两个小步&#xff1a;加热(Heat)和烤(Bak…

2019全球AI 100强,中国占独角兽半壁江山,但忧患暗存

整理 | apddd出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;日前&#xff0c;创投研究机构CB Insights发布了年度人工智能企业百强榜单——由100个最具前途的AI公司组成&#xff0c;它们从3000多个候选者中脱颖而出&#xff0c;其业务涵盖人工智能硬件、数据基础设施…

【linux】串口编程(三)——错误处理

一个程序的优劣&#xff0c;可以从多个角度来判断&#xff0c;错误处理就是其中之一。从代码中的错误处理部分&#xff0c;可以体现出一个程序员的水平和修养。 下面还是以libmodbus为例&#xff0c;总结下串口编程中的错误处理。 【1】基础 【1.1】modbus中错误处理有三种&a…

微服务实战之春云与刀客(三)—— 面向接口调用代码结构实例

2019独角兽企业重金招聘Python工程师标准>>> 概述 在上一篇中提到了spring cloud 面向接口调用的开发风格&#xff0c;这一篇会举一个简单的但完整的例子来说明整个代码结构。 代码已上传到 https://github.com/maruixiang/spring-cloud-demo/tree/master/demo1 代码…

如何创建复杂的机器学习项目?

翻译 | 光城责编 | 郭芮转载自CSDN&#xff08;CSDNnews&#xff09;scikit-learn提供最先进的机器学习算法。但是&#xff0c;这些算法不能直接用于原始数据。原始数据需要事先进行预处理。因此&#xff0c;除了机器学习算法之外&#xff0c;scikit-learn还提供了一套预处理方…

关闭vmware喇叭报警声

关闭vmware喇叭报警声 在vmware里面安装linux系统后&#xff0c;操作时经常使用tab键或使用VI时经常听到pc speaker突然叫一声&#xff0c;如果正当戴着耳机欣赏音乐&#xff0c;被这么一叫还要吓一跳。下面是解决办法&#xff1a;C:\Documents and Settings\All Users\Applica…

【ubuntu工具】Atom的简介及安装

Atom中文社区&#xff1a;https://atom-china.org/ 知乎atom&#xff1a;https://www.zhihu.com/question/22867204 Atom&#xff0c;是github用nodejs编写的一个编辑器 Atom安装步骤&#xff1a; sudo add-apt-repository ppa:webupd8team/atomsudo aptitude updatesudo a…

破解Win2008口令-ERD6.0

我们在日常使用计算机的过程中&#xff0c;大多都经历过由于忘记口令从而无法进入系统的遭遇。遇到这种问题该如何处理呢&#xff1f;很多朋友一定想到了形形的口令破解工具&#xff0c;这些工具中名气最大的就是ERD Commander Boot CD。 ERD Commander Boot CD是一张可以启动操…

【Qt】Qt5.9.0: error: GL/gl.h: 没有那个文件或目录

重新安装ubuntu&#xff0c;在编译Qt时报错&#xff1a; /home/Qt5.9.0/Examples/Qt-5.9/widgets/widgets/calculator/button.cpp:51: from …/calculator/button.cpp:51: /home/Qt5.9.0/5.9/gcc_64/include/QtGui/qopengl.h:139: error: GL/gl.h: 没有那个文件或目录 解决方…

给Chrome“捉虫”16000个,Google开源bug自检工具

整理 | 一一出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 在内部开发和使用八年之久&#xff0c;近日&#xff0c;Google 宣布开源 bug 自动化检测工具 ClusterFuzz。ClusterFuzz 是一款提供端到端的自动化模糊测试工具&#xff1a;从错误检测到分类排查&…

小巧的日志记录组件 - 开源研究系列文章

今天给大家带来一个小巧的日志记录组件LogHelper。这个组件是由Log4Net这个组件的由来而来的&#xff0c;不过只是写入.txt文本文件而已。如果能够对大家的项目有帮助那就更好了。 首先&#xff0c;打开.SLN解决方案&#xff0c;添加引用日志组件。 然后&#xff0c;先对日志组…

.NET开发人员值得关注的七个开源项目

微软近几年在.NET社区开源项目方面投入了相当多的时间和资源&#xff0c;不禁让原本对峙的开源社区阵营大吃一惊&#xff0c;从微软.NET社区中的反应来看&#xff0c;微软.NET开发阵营对开源工具的依赖正日益增强&#xff0c;本文就为所有.NET开发人员介绍7个应该关注的开源项目…

SystemTap了解

SystemTrap是监控和跟踪运行中的Linux内核操作的动态方法。 http://www.ibm.com/developerworks/cn/linux/l-systemtap/ 使用SystemTrap需要使用trap来运行一个stp脚本 如何安装&#xff1a; Centos下直接yum install systemtrap就行了 测试是否可以运行 运行&#xff1a;stap …

Windows 95被做成了App,可玩扫雷和纸牌

6 秒重温 Windows95 开机画面 作者 | 琥珀 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; “看到 Win95&#xff0c;再看到仙剑 DOS 的画面&#xff0c;突然有种想哭的感觉&#xff0c;小时候帮李逍遥实现了仗剑江湖的愿望&#xff0c;但自己却没有实现自己的愿望…

【Ubuntu】虚拟机VirtualBox安装win7完整步骤

在Ubuntu16.04中使用VirtualBox安装win7&#xff0c;亲测可以完美使用; 完整步骤参见如下链接&#xff1a; 1、VirtualBox安装步骤&#xff1a;http://www.xitongcheng.com/jiaocheng/xtazjc_article_23804.html 2、win7镜像下载&#xff1a;http://www.xitongcheng.com/jia…

全栈AI工程师指南,DIY一个识别手写数字的web应用

作者 | shadow chi本文经授权转载自 无界社区mixlab&#xff08;ID&#xff1a;mix-lab&#xff09;网上大量教程都是教如何训练模型&#xff0c;往往我们只学会了训练模型&#xff0c;而实际应用的环节是缺失的。def AIFullstack&#xff08; &#xff09;&#xff1a;本文从「…

mysql 中limit 用法!!

select * from mydb where id limit i,j; 意思就是从第i行开始&#xff0c;检索出j行&#xff0c;结束&#xff01;主要用于分页技术中&#xff0c;比如说我们一页现实10行&#xff0c;可以这样做&#xff1a;select * from mydb where id order by id desc limit $page,10($pa…

【Qt】Qt动态库和静态库的创建和使用

动态库(共享库)的创建 在Qt Creator中新建项目,选择Library 点击“Choose”进入下一步 选择创建库的类型:共享库 选择Kit套件 选择需要的模块 配置工程路径、名字等 Qt Creator自动创建的文件 我配置的动态库名字为:Share pro文件内容

23.3. Ethernet0/0 - Wan口配置

23.3.1. DHCP 动态IP地址 <Netkiller>system-view System View: return to User View with CtrlZ.interface Ethernet0/0port link-mode routenat outboundip address dhcp-allocipsec policy navigator #[Netkiller]display dhcp client Ethernet0/0 DHCP client inform…

用Python解锁“吃鸡”正确姿势

大吉大利&#xff0c;今晚吃鸡~ 今天跟朋友玩了几把吃鸡&#xff0c;经历了各种死法&#xff0c;还被嘲笑说论女生吃鸡的100种死法&#xff0c;比如被拳头抡死、跳伞落到房顶边缘摔死 、把吃鸡玩成飞车被车技秀死、被队友用燃烧瓶烧死的。这种游戏对我来说就是一个让我明白原来…

Oracle Grid Control 10.2.0.5 for Linux 安装和配置指南

一、概述&#xff1a;Grid Control的组件包括Management Agent, Management Service (OMS), Management Repository. 系统架构如下: 10g oem是一个基于web的管理架构&#xff0c;这和10g之前的笨重的java客户端有很大的区别。我们可以从2方面来研究它的架构&#xff0c;一个是管…

【Qt】Qt Plugin:Qt插件创建与使用

插件接口设计 以a+b=c的接口为例:int add(int a, int b) 在 主项目 工程中创建接口文件(一个头文件)eg:Add.h #ifndef ADD_H #define ADD_H#include <QtPlugin> class Add { public:virtual int add(int a, int b)= 0;//纯虚函数 }; Q_DECLARE_INTERFACE(Add, &qu…

9.5. SELINUX

禁用SElinux编辑/etc/selinux/config&#xff0c;修改如下内容&#xff1a; SELINUXdisabled使用命令 getenforce setenforce 0lokkit --selinuxdisabledPlease enable JavaScript to view the <a href"http://disqus.com/?ref_noscript">comments powered by…

说说我们为什么需要加班

做软件这行&#xff0c;加班就是家常便饭。做了这么多年程序员&#xff0c;我还真没听哪个说公司不加班的&#xff0c;碰见好的不时、偶尔加班&#xff0c;差的就是无尽的加。加班是那么的邪恶、令人作呕&#xff0c;但又无法抗拒&#xff0c;它仿佛就像嫖客患上梅毒——摆脱不…