POSIX 串口编程指南

介绍


POSIX 串口编程指南将教会你在你的 UNIX 工作站或者 PC 上面如何成功、有效以及可移植性的对串口编程。每一章提供了使用 POSIX 终端控制函数的编程例程,可以基本不经修改地工作在 IRIX®, HP-UX, SunOS®, Solaris®, Digital UNIX®, Linux® 以及其他大多数 UNIX 操作系统。你会发现操作系统之间的最大差异是串口设备文件名和锁文件。
原文链接:Serial Programming Guide for POSIX Operating Systems
本指南分为以下章节和附录:
  • 第一章 串口通信基础
  • 第二章 串口配置
  • 第三章 MODEM 通信
  • 第四章 高级串口编程
  • 附录A 引脚分布
  • 附录B ASCII 码

第一章 串口通信基础


本章介绍了串口通信,RS-232 和 大多数计算机上使用的其他标准,以及如何通过 C 程序操作串口。

什么是串口通信


计算机一次传输信息(数据)一位或多个比特位。串行是指传输数据一次只传输一位。当进行串口通信时你发送或者接收的每个字(即字节或字符)一次发送一位。每一位都是 on 或者 off。术语用mark代表 on,用 space代表 off。
串口数据速率使用 bits-per-second ("bps") 或者 baudot rate ("baud")。这表示一秒内可以传输多少逻辑 1 和 0。当波特率超过 1000,你会经常看到用 kilo baud 表示的速率。对于超过 1000000 的速率用 megabaud,或者 Mbps 来表示。
当涉及到串口设备或者端口,它们被标识为“数据通讯设备”("DCE")或者“数据终端设备”("DTE")。两者之间的区别很简单 - 每个信号对,如发送和接收,是交叉的。

什么是 RS-232


RS-232 是由 EIA 定义的用于串口通信的标准电气接口。RS-232 实际上有三种不同的类型(A,B和C),每一种对于 on 和 off 电平定义了不同的电压范围。最常用的种类是 RS-232C,它定义mark位电压范围:-3V~-12V 和space位电压范围:+3V~+12V。RS-232C 规范上说,这些信号可以传输 25英尺(8m),通常你可以传输更远一些只要波特率足够低。
除了数据输入和输出数据线,还有其他提供时序、状态与握手的信号线。这里我们仅列举最为常见的 DB-9 接口分布图,引脚和功能描述如下所示:
  • 1 - DCD - 数据载波检测
  • 2 - RXD - 接收数据
  • 3 - TXD - 发送数据
  • 4 - DTR - 数据终端就绪
  • 5 - GND - 地
  • 6 - DSR - 数据装置就绪
  • 7 - RTS - 请求发送
  • 8 - CTS - 清除发送
  • 9 - RI - 振铃指示
你还可能遇到 RS-422 以及 RS-485 串口标准。RS-422 使用更低电压与差分信号允许线缆长达 1000英尺(300m)。在实际应用中,使用 TTL 电平逐渐成为趋势,在 MCU  与串口转接芯片提供的串口中比较常见,此时mark 电平:+5V或+3.3V等,space位:0V(逻辑地)。

信号定义


RS-232 标准针对串口通信定义了18种不同的信号。其中,在 UNIX 环境下通常只有 6 种可用。

GND - 逻辑地
从技术上讲,逻辑接地不是信号,但没有它,其他信号就不能工作。从根本上说,逻辑地充当一个参考电压,从而知道哪些电压为正或负。

TXD - 发送数据
mark 电平为逻辑 1,space 电平为逻辑 0。注意 RS232 电平与 TTL 电平反相。

RXD - 接收数据
同样的,mark 电平为逻辑 1,space 电平为逻辑 0。注意 RS232 电平与 TTL 电平反相。

DCD - 数据载波检测
DCD 信号接收自串口线缆的另一端的计算机或设备。信号线低电平表示计算机或设备当前已连接或在线。DCD 不经常使用。

DTR - 数据终端就绪
DTR 信号用于通知对端计算机或设备己方已就绪(space 电平)或未就绪(mark 电平)。DTR 通常在打开串口时自动使能。

CTS - 清除发送
CTS 信号接收自串口线缆的另一端。信号线 space 电平表示可以己方可以发送数据。CTS 通常用于串口数据流控。

RTS - 请求发送
RTS 设置为 space 电平表示己方准备好就接收数据。一般与 CTS 一起用于串口流控,通常被设置为默认有效状态。

异步通信


解析串口数据需要确定一个字符的结束与下一个字符的开始。本章专门讲述异步串口数据。
在异步模式下串口数据线保持在 mark 状态(逻辑 '1')直到有字符发送,也即串口的空闲态是 mark 态。每个字节起始位在前,字节的每一位紧随其后,一位可选校验位以及一位或者两位停止位。起始位始终是 space 电平(逻辑'0'),通知对方有新串口数据可用。数据可以同时发送和接收,因此称为“异步”。

可选校验位是数据位的简单累加和,指示数据是否包含奇数或者偶数个 1。偶校验时,如果一个字符中有偶数个 1 那么校验位是 0。奇校验时,如果一个字符中有奇数个 1 那么校验位是 0。除此之外,你还可能听过术语 space 校验,mark 校验以及无校验。Space 校验指示校验位永远是 0,而 mark 校验是指校验位一直为 1。无校验意味着没有校验位存在或被传输。
剩下的位称作停止位。在字符之间可能会有 1,1.5 或者 2 位停止位并且这些位总为 1。停止位过去用于腾出时间为硬件处理之前的数据,但现在只用于接收字符与硬件设备的同步。异步数据格式通常表达成“8N1”,“7E1”等。

什么是全双工和半双工


全双工是指设备可以同时发送和接收数据 - 有两个独立数据通道(一路输入,一路输出)。
半双工是指设备不能同时发送和接收数据。这通常意味着只有一路可以通讯。这并不代表有任何的 RS-232 信号未被使用,相反,这通常意味着使用的一些非 RS-232 标准的通讯链路不支持全双工操作。

流控


在两个串口设备间传输数据时经常有必要进行数据流控。这可能是受到中间串口通信线路、其中一个设备或者其他存储介质的限制。异步数据流控通常使用的有两种方法。
第一种方法通常称为“软件”流控,使用特殊字符开始(XON or DC1)或者停止(XOFF or DC3)数据流。这些字符定义参见 ASCII 码表。这些码值在传输文本信息时很有用,但不能在未经特殊编程时用于传输其他类型的信息。
第二种方法称作“硬件”流控,使用 CTS 和 RTS 信号线取代特殊字符。当接收方准备好接收数据时会将 RTS 置为 space 电压以请求对方发送数据,当未准备好时置为 mark 电压,因此发送方会通过检测 CTS 电平状态判断是否可以发送数据。由于硬件流控使用独立的信号集合,因此比软件流控速度要快。

Break信号


通常情况下收发数据信号线保持在 mark 电平状态直到传输一个新字节。如果信号拉低至 space 电压一段时间,通常是 1/4 到 1/2 秒,那么就说一个 break 条件满足。一个 break 信号有时用于复位通讯或者改变通讯硬件的操作模式,如 MODEM。

同步通信


不同于异步数据,同步数据以恒定比特流显示。为了读取数据,通讯方必须提供或接收一通用位作为时钟使发送和接收者同步
尽管有时钟同步,通讯方也必须以某种方式标记数据开始。实现的最常用方法是使用像“串行数据链路控制”(“SDLC”)或者“高速数据链路控制”(“HDLC”)的数据包协议。
每种协议定义了一定的位序列来表示数据包的开始和结束,也定义了没有数据时的位序列。这些位序列使得通讯方明确数据包的开始。由于同步协议不使用每字节同步位它们比异步通信有至少25%的性能提升并且在多余两个串口的情形下更适合于远程网络和配置。
尽管同步通信有速度优势,由于需要额外的软硬件大多数 RS-232 硬件不支持。

编程指南的其他章节内容我先前翻译过,但是由于内容和部分知识点较为陈旧,因此我用其他整录的博客系列 -《Linux 串口编程》中进行详细讲解,感兴趣的可以移步至:
  1. 《Linux 串口编程<一> 一些背景》
  2. 《Linux 串口编程<二> 深入了解 termios》
  3. 《Linux 串口编程<三> 使用termios与API 进行串口程序开发》
  4. 《Linux 串口编程<四> 串口设备程序开发》


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/403068.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

快速解决 Android SDK Manager 无法下载或者下载速度慢

在这里以 Windows 下的 Android SDK Manager 为例&#xff0c;其他系统下与此类似&#xff0c;只会存在部分工具栏名称不同的情况&#xff0c;不明之处可以追问。下面就进入具体配置流程&#xff1a; 1. 选择 Tools->Options 进入代理设置。 代理设置选项&#xff0c;在 H…

安卓之USB主机(Host)与配件(Accessory)模式

安卓设备与USB硬件通讯时有两种模式可以选择&#xff1a;USB Host 模式与 USB Accessory 模式。从 USB 逻辑角色来说&#xff0c;USB Host 模式是指安卓设备作为 USB 主机&#xff0c;所有活动均由安卓设备发起&#xff1b;USB Accessory 模式是指安卓设备作为 USB 设备&#x…

安卓USB开发教程 一 USB Host 与 Accessory

安卓通过两种模式&#xff1a;USB Accessory 与 USB Host 模式支持多种 USB 外设与安卓 USB 配件&#xff08;实现安卓配件协议的硬件&#xff09;。在 USB 配件模式下&#xff0c;外部 USB 硬件充当 USB 主机。配件实例可能包含机器人控制器、扩展坞、诊断和音乐设备、售货亭、…

轻松访问 Android 系统源码与下载

有时研究 Android 某个特性或者协议的时候需要参阅安卓系统源代码中代码实现或者协议文档等。通过正常的建立 repo&#xff0c;git 获取十分耗时&#xff0c;并且速度很慢&#xff0c;除非是需要重新编译系统&#xff0c;定制系统才需要这样做。因此&#xff0c;推荐一个 Andro…

Cygwin 下载极速源推荐

Cygwin 默认列表中的源下载速度太慢&#xff0c;国内使用时常用以下几个源&#xff0c;经过实际使用速度很快&#xff0c;下载时不妨几者都尝试下&#xff1a; 如上图所示&#xff0c;下载时在此栏填写 URL 地址即可&#xff0c;推荐地址&#xff1a; http://mirrors.sohu.com…

Java 结构体之 JavaStruct 使用教程二 JavaStruct 用例分析

使用环境 前一篇在介绍 JavaStruct 类时指定了使用库使用环境为 Java 5 及以上&#xff0c;也即开发我们使用的 JDK 版本为1.5及以上就可以了。以下讲解的用例可以直接将 code 直接粘贴到 java 的 main 函数中执行就可以了&#xff0c;后面会给出测试用例和结果。 使用方法 Jav…

Java 结构体之 JavaStruct 使用教程三 JavaStruct 数组进阶

经过前面两篇博客的介绍&#xff0c;相信对于 JavaStruct 的认识以及编程使用&#xff0c;读者已经有一定的基础了。只要理解和实践结合起来&#xff0c;掌握还是很容易的。下面进行一些数组使用方面的实例说明及演示。 在结构体类中使用数组有几种方式&#xff0c;可以使用静…

Android开发如何使用JNA

1. JNA&#xff08;Java Native Access&#xff09;项目已经迁移到 github&#xff0c;最新的项目链接&#xff1a;https://github.com/java-native-access/jna 。首先前往该地址下载使用 JNA 需要的两个 jar 库文件&#xff0c;jna.jar&#xff0c;jna-platform.jar 。 2. 在…

JAVA循环队列

关于自定义循环队列的实现原理和要点可以参见之前的博文系列&#xff1a;循环队列及C语言实现。这里主要对JAVA下的具体实现方式与原理进行说明。 一、JAVA 中已经自带了 Queue、DQueue、ArrayList、LinkedList 等常用的数据结构&#xff0c;为什么还要单独实现循环队列&#…

VMware 虚拟机占用磁盘空间

使用VMware创建的虚拟机尽管已经设定分配的磁盘大小&#xff0c;但仍然会发现虚拟机占用的磁盘空间会越来越大&#xff0c;而直观体现就是虚拟机系统文件 vmdk 不断增大。因此下面介绍一个简单的方法&#xff0c;使用 VMware 自带的工具对 vmdk 文件进行压缩以节省磁盘空间。拿…

frameworks/av/media/CedarX-Projects/CedarAndroidLib/LIB_KK44_/Android.mk: No such file or directory

在安卓系统编译过程中如果遇到上述或者与之类似的错误&#xff0c;可以采取相同的处理方法进行解决。直接进入到 CedarAndroidLib 目录下&#xff0c;也即此例中的 frameworks/av/media/CedarX-Projects/CedarAndroidLib。看一下当前文件&#xff1a; 注意第9行为包含标题中报错…

Windows与Linux下tftp服务的使用

tftp 协议是基于 udp 的&#xff0c;轻量小巧&#xff0c;用在局域网和嵌入式上很顺手。大部分帖子把在 linux 上配置的过程描述的过于复杂&#xff0c;其实只是个工具而已。研究协议抓下包对比协议内容也可以满足需求了&#xff0c;下面进入正文。分别讲下在 linux 以及 windo…

饥荒Mod 开发(二二):显示物品信息

饥荒Mod 开发(二一)&#xff1a;超大便携背包&#xff0c;超大物品栏&#xff0c;永久保鲜 饥荒中的物品没有详细信息&#xff0c;基本上只有一个名字&#xff0c;所以很多物品的功能都不知道&#xff0c;比如浆果吃了也不知道恢复什么&#xff0c; 采集的胡萝卜也不知道什么功…

安卓BLE开发教程(一) BLE基础

我试图以一种简单的方式去把重要的事情讲清楚。目的是希望BLE协议栈和基础概念简单化&#xff0c;让自己及类似的安卓开发者可以在较短的时间内把握住BLE的核心及使用方法。BLE本身很复杂&#xff0c;但对于安卓开发而言只要抓住一些核心点&#xff0c;便已足够。如果你想全面了…

Linux驱动如何在不同版本上快速迭代升级

As well known&#xff0c;Linux内核版本更新很快&#xff0c;有些内核版本的迭代升级可能会导致在使用的驱动版本存在编译失败或使用的兼容性问题&#xff0c;如何快速定位到内核版本间变更的地方&#xff0c;并处理掉该问题&#xff0c;列一下我常用的解决方法。&#xff08;…

苹果MacOS系统上安装第三方驱动失败/无效

近期不少用户在苹果系统上安装一些第三方驱动时反馈没有作用&#xff0c;但是驱动安装提示是完成的&#xff0c;并拷贝到了系统的驱动路径下&#xff1b;造成该问题的原因可参见如下苹果官方说明&#xff1a; User-Approved Kernel Extension Loading 引用下第一段官网说明 …

OpenWrt 之 MT7628 移植第三方SPI驱动

1、在OpenWrt系统上移植SPI驱动前&#xff0c;首先要确保SPI相关引脚未被复用为其他功能&#xff0c;比如GPIO&#xff1b;以下操作已假定该条件成立&#xff0c;否则请修改相关dts和c文件中复用配置&#xff1b; 2、打开dts配置文件进行修改&#xff0c;这里我是用的硬件为WR…

CH9102 USB转串口应用体验

近期使用CH9102 USB转串口芯片成功用在原有使用CP2102的产品板上&#xff0c;整个替换和验证过程还是很顺利的&#xff0c;顺带写个blog做个记录。 原项目上使用CP2102搭载ESP32实现Arduino物联网应用&#xff0c;采用USB转串口芯片实现串口下载&#xff0c;代码的Debug调试&am…

CH9101 USB转串口替换FT232R和FT230XQ

学生党一枚&#xff0c;前段时间跟着导师做的项目因为上面用到USB转串口芯片FT232R迟迟买不到&#xff0c;所以打算更换成国产USB转串口芯片CH340&#xff0c;对CH340的认识也很早了&#xff0c;很多年前开始直到现在各种开发板上基本都会标配一颗CH340&#xff0c;像某宝上的S…

FT230X芯片的国产化替代

之前有些项目用到FT230XQ芯片&#xff0c;无奈不好买&#xff08;价格高&#xff09;&#xff0c;想找些替代的型号。原先使用国产CH340芯片比较多&#xff0c;顺带去官网找下有没有其他小封装的芯片型号。导航比较方便&#xff0c;从官网的产品中心&#xff0c;选择“USB”分类…