介绍

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 串口编程<四> 串口设备程序开发》

POSIX 串口编程指南相关推荐

  1. Posix线程编程指南(4) 线程终止

    线程终止方式 一般来说,Posix的线程终止有两种情况:正常终止和非正常终止.线程主动调用pthread_exit()或者从线程函数中return都将使线程正常退出,这是可预见的退出方式:非正常终止是 ...

  2. 【Linux】Linux 下串口编程入门

    目录 串口简介 串口操作 打开串口 设置串口 读写串口 关闭串口 例子 相关主题 串口简介 串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用.常用的串口是 RS-232-C 接口( ...

  3. Serial Programming HOWTO——Linux 串口编程HOWTO

    转自:http://bbs.loveunix.net/viewthread.php?tid=35896 1. Introduction 简介 This is the Linux Serial Prog ...

  4. C——Linux下的串口编程

    原 C--Linux下的串口编程 2017年06月06日 19:30:50 C_Aya 阅读数:11537 <span class="tags-box artic-tag-box&qu ...

  5. linux实验串行端口程序设计,Linux下串口编程心得(转)

    最近一段时间,需要完成项目中关于Linux下使用串口的一个部分,现在开帖记录过程点滴. 项目的要求是这样的,Qt应用程序主要完成数据采集和发送功能,一开始在google中海搜关键字"Qt串口 ...

  6. Linux串口编程_termios

    1.1 Linux串口编程主要是设置structtermios结构体的个成员值.Termios是在POSIX规范中定义的标准接口,表示终端设备(包括虚拟终端丶串口等),串口是一种终端设备,一般通过终端 ...

  7. Linux 串口编程二 深入了解 termios

    前言 这一系列串口编程重点在应用层编程,但是在讲解原理与相关概念时需要对驱动框架有个基础的认识.如果只是浅尝辄止,以后在遇到串口驱动与应用层程序调试难免遇到瓶颈.关于 tty驱动架构参见我的其他博客: ...

  8. 树莓派UART串口编程--使用wiringPi库-C开发【2-修改驱动】

    一.前言 上一篇博文记录了使用wiringPi提供的串口驱动wiringSerial.c wiringSerial.h,并基于该驱动对串口进行简单的通信,测试中发现该串口的驱动比较简单,接收数据会存在 ...

  9. 多线程编程指南 part 2

    多线程编程指南 Sun Microsystems, Inc. 4150 Network Circle Santa Clara, CA95054 U.S.A. 文件号码819–7051–10 2006 ...

最新文章

  1. iOS中UISearchBar(搜索框)使用总结
  2. [数据结构] 希尔排序
  3. java.lang.VerifyError解决方案 Android
  4. 关于私有云与存储风向的深度解读
  5. java百度地图添加标注_调取百度地图接口,实现取自己的实时位置,然后可以在百度地图上添加信息标注...
  6. 可工作的软件胜过面面俱到的文档
  7. 前端:background背景图
  8. 径向基神经网络_谷歌开源Neural Tangents:5行代码打造无限宽神经网络模型,帮助“打开ML黑匣子”...
  9. This iPhone is running iOS 12.2(16E227),which may be supported by this version of Xcode
  10. 大一java期末考笔试_JAVA考试试题及答案
  11. 580解锁bl工具_小米解锁卡刷教程
  12. 如果浏览器大战的格局改变会怎样?
  13. 什么是生物特征识别?有哪些生物特征?
  14. android 5.1 壁纸路径,Android5.1 壁纸来源选项中有两个“壁纸”选项
  15. QT线程之 moveToThread() 只能用信号槽方式触发
  16. 蓝牙 aptx android,蓝牙aptx干嘛用的
  17. _EPROCESS结构简单了解!
  18. 在滴滴云 DC2 云服务器上部署 Ghost
  19. CA6140车床拨叉工艺及铣30X80面夹具设计
  20. 操作系统(一)什么是操作系统

热门文章

  1. Eclipse常用插件下载地址
  2. python dash_Dash是Databricks Spark后端的理想基于Python的前端
  3. 基于PyTorch搭建CNN实现视频动作分类任务代码详解
  4. 海量数据寻找最频繁的数据_寻找数据科学家的“原因”
  5. 在maven中开发Spring需要的jar依赖
  6. Struts2学习笔记《二》
  7. C语言编程对缓冲区的理解
  8. 表单提交中get 和post方式的区别
  9. 【原】unity shader(3)反射贴图
  10. biztalk在用户代码中构造多部分消息