串口编程/调制解调器和AT命令
串口编程: 简介和OSI网络模型 -- RS-232布线和连接 -- 典型的RS232硬件配置 -- 8250 UART -- DOS -- MAX232驱动器/接收器系列 -- Windows中的TAPI通信 -- Linux和Unix -- Java -- Hayes兼容调制解调器和AT命令 -- 通用串行总线 (USB) -- 形成数据包 -- 纠错方法 -- 双向通信 -- 数据包恢复方法 -- 串行数据网络 -- 实际应用开发 -- IP over串行连接
简介
[edit | edit source]概况
[edit | edit source]此内容是串口编程书籍的一部分。它涵盖了Hayes和Hayes兼容电话调制解调器的编程。这种类型的调制解调器在消费者应用和许多专业应用中很常见——基本上,只要调制解调器仍在使用的地方都会使用它们。
调制解调器编程正逐渐成为一种失落的艺术,特别是在用户从拨号线路迁移到DSL的趋势中,这是出于性能上的明显原因。然而,调制解调器在许多应用中仍在使用。近年来,调制解调器出现在以前未曾出现的新领域。例如,机器中的嵌入式调制解调器用于在机器需要维修时自动“呼叫”制造商。这通常通过无线电话系统完成,无线模块仍然为拨号和数据传输提供Hayes兼容接口。
原始的Hayes调制解调器命令集在此模块中仅用作参考。本模块不涵盖供应商特定的扩展,也不属于本模块。该模块解释了术语Hayes的起源以及相关的AT命令。它还包含有关调制解调器是什么以及如何与调制解调器进行信令的一些基本信息。该模块随后继续描述调制解调器编程的基础知识,包括开发环境的设置。
此外,该模块提供了详细的(但不完整)编程信息,以及原始Hayes命令集和寄存器的不完整参考。
管理信息
[edit | edit source]本节特别针对潜在作者。请注意
- 本模块不是用于随机的调制解调器编程信息和民间传说的垃圾场。
- 本模块是操作系统无关的。串口数据通信编程书籍提供了其他模块来提供此类信息。
- 本模块处理通用Hayes调制解调器,而不是任何供应商特定的扩展。如果你真的想看到你自己的特定产品被涵盖,请提供一个包含该供应商/品牌特定信息的附录。
- 不要假设仅仅因为某些功能在你的特定调制解调器上有效,它就是标准并且其他调制解调器也是这样做的。如果你没有第一手经验表明某些功能在“几乎”所有Hayes兼容调制解调器上都是相同的,那么请将其省略,或者至少将其标记为有疑问。
本模块坚持使用原始Hayes命令集的原因是,为了有一个明确的界限。本模块并非旨在用作参考手册。一旦有人掌握了基本命令集并实现了代码,处理供应商特定的扩展就相当简单了。其他扩展,例如非常粗略和基本的传真扩展,需要深入了解所涉及的协议(例如,在传真的情况下,需要深入了解传真数据在电话线上的详细编码、压缩和定时)。这超出了本书的范围。如果你知道如何处理传真扩展,那就写你自己的书吧。
什么是Hayes?
[edit | edit source]Hayes Microcomputer Products, Inc.是一家调制解调器制造商,从1980年代初成立到1990年代末,其鼎盛时期在1990年代初。Hayes这个名字仍然作为一个品牌名称存在,属于Zoom Telephonics, Inc.(截至2004年秋季)。
1981 年,Hayes 开发了 **Hayes Smartmodem**。这在当时是一款独一无二的产品,因为这款调制解调器不再是简单地将串行数据盲目地转换为音频音调的“哑”设备,而是包含了一些“智能”。可以向调制解调器发送命令来配置它,执行某些操作(例如拨号、静音扬声器、挂断等),以及读取连接的当前状态。Hayes 开发并发布了一套命令集,用于通过串行线路控制调制解调器。这套命令集在消费级调制解调器制造商中广受欢迎,并被许多不同的制造商克隆。它被称为“Hayes 命令集”和“AT 命令集”,长期以来一直是控制消费级调制解调器和许多专业调制解调器的实际标准。支持这套命令集的调制解调器被称为 *Hayes 兼容*。
这些命令在某个时候被标准化了,然而,正如标准的典型情况一样,存在着几种标准。当然,不同的调制解调器中仍然存在供应商特定的扩展和实现方式略有不同。其中一些增强功能是在当时支持新兴功能(例如数据压缩和传真支持)所需的。因此,现代调制解调器的命令集并不完全兼容。然而,最初的 Hayes 命令应该仍然有效,并且仍然是几乎所有消费级调制解调器命令集的核心。
基本命令集在某个时候被标准化为 TIA/EIA-602,语法为 EIA/TIA-615。但正如前面提到的,调制解调器制造商添加了自己的扩展。一个更大的扩展集,特别是在手机制造商的压力下,被标准化为 ITU V.250(旧名称 V.25ter)。它通常构成专业 Hayes 兼容调制解调器和内置数据调制解调器的手机的基础。ITU V.250 进一步引用了一系列其他标准(例如 V.251、V.252、V.253),用于特定应用和扩展,并且还有一些补充。当然,还有许多标准定义了调制解调器的其他方面,例如压缩和传输。
另请参见
什么是 AT 命令?
[edit | edit source]几乎所有 Hayes 调制解调器命令都以两个字母序列 AT
开头 - 用于获取调制解调器的 *注意*。因此,调制解调器命令通常被称为 *AT 命令*。这对于许多制造商特定的命令集扩展仍然适用。大多数也以 AT
开头,也被称为 *AT 命令*。请注意,仅仅因为 AT 命令包含一个 *&* 并不意味着它是扩展。*&* 命令已经是最初的 Hayes 命令集的一部分。
术语 *AT 命令集* 的确切用法在不同的制造商之间略有不同,通常取决于营销宣传。一般来说,可以假设具有 *AT 命令集* 的调制解调器
- 使用大多数以
AT
开头的命令, - 使用最初的 Hayes 方式来区分数据和命令,以及
- 支持最初的 Hayes 命令和寄存器设置作为子集。
什么是调制解调器?
[edit | edit source]从传统意义上讲,调制解调器是用于通过模拟线路传输数字信息的 **mo**dulator/**dem**odulator,例如模拟电话系统的双线或四线线路。这个词已经成为用于连接计算机到另一台计算机或广域网 ( 维基百科:WAN ) 的许多通信设备的通用俚语。例如,Ricochet 无线数据收发器通常被称为“Ricochet 调制解调器”。
本模块讨论的是经典类型的 *智能* 调制解调器,旨在将数据从/到串行接口转换为/从模拟线路转换。本模块也适用于提供经典串行接口但通过不同物理层(例如数字线路)连接的调制解调器,以及为其他目的提供串行调制解调器式接口的设备。对于我们的目的,调制解调器是经典的 DCE (数据通信设备),通过串行线路由经典的 DTE (数据终端设备) (例如计算机) 控制。
根据调制解调器的类型,调制解调器可以使用多种不同的技术和速度来通过模拟线路传输数据。这些技术的细节在这里没有特别感兴趣,只是注意到,对于大多数调制解调器来说,可以指定这些通信参数(例如,禁用压缩或更改调制技术)。本模块处理的数据不是模拟线路上的数据,而是串行接口上 DTE 和 DCE 之间的数据。即设备(例如计算机)读写的数据。
( *智能* ) 调制解调器还提供辅助服务,例如拨打特定号码以建立连接。因此,调制解调器可以处于多种不同的状态和模式,这些状态和模式并不总是正交的。例如,调制解调器可以在命令模式下,同时保持与远程方的连接(有关详细信息,请参见 +++
序列)。
非智能调制解调器必须依赖于其他设备(例如 ACU (自动呼叫单元))来提供这些辅助服务,但它们如今实际上已经灭绝。
带内信令
[edit | edit source]最初的 RS232C/V.24 规范包含一条用于传输数据的 TX 线和一条用于接收数据的 RX 线,以及其他完全独立的线用于在 DTE 和 DCE 之间传输控制信息,其目的是将数据和控制信息分开。在电信行话中,这被称为 **带外信令**。
Hayes 兼容调制解调器几乎不使用这些 RS232C/V.24 功能。相反,与调制解调器的通信几乎完全通过用于传输数据的相同的 RX/TX 线进行。这种机制被称为 **带内信令**。
带内信令有很大的缺点。在任何时候,DTE 和 DCE 都必须知道通过 TX 和 RX 线发送或接收的信息是用于信令目的,还是数据,这些数据应该透明地处理。因此,DTE 和 DCE 必须同步运行。如果它们失去同步,数据将丢失,数据将被错误地解释为命令,或者信令信息将被解释为数据,从而有效地破坏原始数据。
带内信令的优点是 DTE 和 DCE 之间的布线更简单,并且至少乍看起来,DTE 中的通信软件也更简单。
如前所述,Hayes 兼容调制解调器几乎不使用 RS232 控制线。但只是几乎。例如,它们通常驱动 DCD (数据载波检测)。这会造成调制解调器驱动软件不仅要处理带内信令,还要处理与调制解调器的带外信令的情况。这会略微使通信软件的 状态机 变得复杂。
此外,特别是随着手机调制解调器的兴起,制造商再次开始引入更多的带外信令。这些调制解调器提供多个虚拟串行接口。其中一些接口专门用于数据传输,由另一个串行接口控制,该接口要么专门用于信令(即带外信令),要么仍然可以用于更传统的带内信令场景。在这种情况下,通信软件需要管理更复杂的状态。
命令状态/在线状态
[edit | edit source]关于控制调制解调器,Hayes 兼容调制解调器处于两种主要状态之一
- 命令状态
- 调制解调器将来自 DTE 的数据解释为调制解调器命令。调制解调器可以在命令状态下,同时保持与远程方的连接。
- 在线状态
- 调制解调器将来自 DTE 的数据解释为有效负载,并将其传输到对方。这种状态要求已建立与远程站点的连接。
在这些主要状态内存在许多子状态。此外,关于其他问题,调制解调器具有一系列通信状态,例如,是否检测到远程载波。
发起模式/应答模式
[edit | edit source]- 发起模式
- 处于发起模式的调制解调器是正在建立连接的调制解调器,例如,通过拨打远程站点的号码并启动协议协商。
- 应答模式
- 处于应答模式的调制解调器是等待被联系并准备“接听电话”的调制解调器。
命令响应
[edit | edit source]调制解调器应该为它接收的几乎所有命令发送响应。这些响应可以是 ASCII 字符串形式,也可以是数值形式。响应类型可以使用命令切换,但通常使用 ASCII 响应。
DTE 需要非常小心地跟踪响应。除了其他信息外,它们还告知 DTE 远程站点的拨号是否成功,以及调制解调器是否从命令状态切换到在线状态。
不幸的是,自原始 Hayes 调制解调器以来,响应消息集得到了很大增强,并且通常可以通过额外的AT
命令进行配置。建议不要严格解析响应消息,而应宽容地检查它们是否包含有趣的关键字,例如CONNECT
。还建议仔细研究特定调制解调器的使用手册。
所谓的 S-寄存器也是 Hayes 的传统,所有与 Hayes 兼容的调制解调器都支持。它们是调制解调器中的寄存器,包含各种设置。与 AT 命令一样,它们也已由不同的调制解调器制造商进行了广泛的增强。
它们被称为S-寄存器的确切原因尚不清楚。有些人说S代表调制解调器的设置。有些人说它们就是这么称呼的,因为它们是用ATS
…命令设置和读取的。在常用术语中,它们通常被称为存储寄存器,因为即使在断电后,它们也会永久存储值。
其他几个AT
命令也会改变特定 S-寄存器的值。通过 S-寄存器直接设置值与通过其他AT
命令设置值之间通常没有区别。哪种方法更好取决于具体情况。
为了对实际的调制解调器进行编程,最好获得该特定调制解调器的命令参考。不幸的是,无名调制解调器在没有任何可用命令参考的情况下出货已变得很常见。由于 Windows 的即插即用功能,在 Windows 上不再需要了解各个命令。相反,调制解调器在 Windows 上运行所需的只是随附必要的.inf
文件(通常隐藏在某些“安装程序”软件中,称为“驱动程序”,从技术上讲并非如此,Windows 已经包含必要的驱动程序)。
如果调制解调器没有附带命令参考,那么下一步就是搜索网络。但是,不幸的是,近年来,许多调制解调器信息已从地球表面和网络上消失。随着宽带互联网连接的兴起,调制解调器已成为过时的设备,许多资源不再可用。找到有关特定调制解调器类型基本信息的难度越来越大。即使对于像手机调制解调器这样的现代调制解调器,也可能难以找到必要的信息。
如果没有附带调制解调器,则可以通过多种方法获得命令参考
- 也许经销商在其网站上提供了一个
- 也许 OEM 制造商提供了一个。
这需要识别 OEM 制造商。一种可能的方法是使用设备的 FCC 号码,然后在 FCC 网站上查找原始制造商。 - 也许芯片组制造商提供了一个。
消费级调制解调器通常只是围绕来自大型硬件制造商的“现成”调制解调器芯片组构建的。调制解调器越便宜,调制解调器制造商在固件中不做任何更改,并使用来自芯片组制造商的原始示例软件的可能性就越大。一些芯片组供应商为其调制解调器提供命令参考。 - 通过查看相应的 Windows
.inf
文件,至少可以获得基本命令 - 通过使用本 Wiki 书模块中的通用 Hayes 命令参考。
- 如果特定调制解调器符合某个命令标准,则获取之前提到的标准文档。
- 使用某种嗅探器程序来监控调制解调器和 DTE 之间的通信,并使用获得的信息对命令进行反向工程。这要求 (a) 反向工程在您的司法管辖区是合法的,以及 (b) 有一些 DTE 通信软件可用,这些软件处理特定的调制解调器,因此有一些有效的通信可以嗅探。
强烈建议在开始为调制解调器编写驱动程序或软件之前,花一些时间来设置一个合适的开发环境。这大部分都与硬件设置有关。
建议使用“远程”计算机和第二个调制解调器在应答模式下设置一个小网络。“远程”计算机在这种情况下指的是一台紧挨着开发机器的计算机,但通过调制解调器连接。如果正在开发终端程序,“远程”计算机应该运行一些小型 BBS 软件(例如),这样总会有其他人准备好接听,或者运行协议分析/数据转储软件。如果没有这样的设置,开发调制解调器软件会非常令人沮丧。这种设置可以将开发时间缩短十倍,并降低压力。同样,使用的调制解调器应该有真正的扬声器,并且支持ATM
n命令,以至于您可以将扬声器在整个连接过程中保持开启(并且理想情况下可以选择始终保持开启)。“用耳朵调试”对于调制解调器来说是一个现实,尤其是在兼容性测试期间。
如果可能,应该获取硬件协议分析仪,或者至少获取一个RS-232 分线盒。如果需要,这些可以放置在计算机和调制解调器之间,以对串行链路进行故障排除,并确保数据实际上正在调制解调器和计算机之间传输——一项健全性检查,它比您想象的要实用得多。实际的硬件协议分析仪非常昂贵,但是老式的 Wyse 终端并不昂贵,而且几乎一样有用。如果您找到一个,请把它捡起来。支持自动波特率检测的终端特别有用。
如果还需要测试调制解调器的拨号功能,则需要一台小型家用模拟 PABX。这些 PABX 机的价格很便宜;一台用于四条内部线路和一条外部线路的模拟 PABX 不应超过 50 美元。如果不需要拨号,则调制解调器应该能够在专线模式下直接驱动两线或四线线路;否则,仍然需要 PABX。
例如,可能的设置是
a) 专线模式
+-------------+ serial +---------+ 2-wire +----------+ serial +----------+ | Development |----------| Modem A |----\/----| Modem B |----------| BBS | | Computer |----------| |----/\----| (answer) |----------| Computer | +-------------+ +---------+ +----------+ +----------+
或
b) 带 PABX
+-------------+ serial +---------+ phone wire +------+ phone wire +----------+ serial +----------+ | Development |----------| Modem A |--------------| PABX |--------------| Modem B |----------| BBS | | Computer |----------| |--------------| X |--------------| (answer) |----------| Computer | +-------------+ +---------+ +------+ +----------+ +----------+
或
c) 带协议分析仪的专线模式
+-------------+ serial +---------+ serial +---------+ 2-wire +----------+ serial +----------+ | Development |----------| Y Cable |----------| Modem A |----\/----| Modem B |----------| BBS | | Computer |----------| Breakout|----------| |----/\----| (answer) |----------| Computer | +-------------+ +---------+ +---------+ +----------+ +----------+ || || || +----------+ | Protocol | | Analyser | +----------+
当然,其他组合也是有用的。而且能够轻松地重新连接协议分析仪,例如,在调制解调器 B 和 BBS 计算机之间,也是有帮助的。
在处理调制解调器处理的细节之前,应该了解一些基本知识。首先,串行接口的通信应该到位。这包括应该了解特定操作系统提供的串行通信 API(如果有)。如果操作系统没有提供此类 API,则建议首先实现 UART 访问并将其包装成一个库,如果某些硬件中的串行 UART 应该直接进行编程。或者,可以使用提供对串行接口的便捷访问的编程语言。
无论使用什么,都应该在开始对调制解调器进行编程之前对其进行测试。没有什么比不知道特定错误行为是由与调制解调器的串行通信失败引起的还是调制解调器(通常是发送给它的命令)的问题更令人烦恼了。
除非是最简单的情况,否则建议使用调制解调器的硬件握手——尤其是对于大于 2400 bit/s 或 9600 bit/s 的速度。因此,使用的低级串行通信软件和硬件应该支持硬件握手。如果 UART 支持某种 FIFO,例如 16550 UART,则应该启用 FIFO(用于发送和接收数据)。
通过轮询或中断接收数据哪个更好还存在争议。如果每个传入字节都会触发中断,则在高速通信时会有很多中断,而且,听起来可能令人惊讶,在这种情况下,轮询 UART 可能会更有效。
调制解调器支持的通信通常是半双工的。要么是 DTE 说话,要么是 DCE 说话,另一方应该倾听。与调制解调器的通信最好使用以下方法完成
- 8 位
- 无奇偶校验
- 1 个停止位
有关速度信息,请参见下一节。
+-------------+ DTE/DCE speed +---------+ line speed | DTE / |----------------| Modem / |-------------- | Computer |----------------| DCE |-------------- +-------------+ +---------+
有用提示! | |
---|---|
一些调制解调器制造商将 DTE/DCE 速度称为DTE 速度,将线路速度称为DCE 速度。另一些人则区分DTE 速度(串行接口上的 DTE/DCE 速度)、DCE 速度(调制解调器之间的 bps)和线路速度(调制解调器之间的波特率)。仔细观察术语可以帮助正确解释制造商的文档。 |
一个可能非常令人困惑的问题是线路速度(电话线上的数据传输速度)与 DTE(计算机)和 DCE(调制解调器)之间的串行线路上的速度之间的区别。
首先,线路速度始终存在一些普遍的混淆,因为一些线路速度是在考虑压缩的情况下给出的,而其他数据是在不考虑压缩的情况下给出的。此外,由于线路使用的调制方案,bps和波特率之间存在差异。此外,营销宣传模糊了图片。我们不会在这里尝试清理长期存在的波特率与 bit/s 之间的混淆(这是无望的:-))。只是建议,无论何时调制解调器返回有关线路速度的信息,都要考虑上述差异,以避免任何误解。
其次,电话线上的速度不一定必须与串行线路上的速度相同。实际上,在现代调制解调器上,它通常不相同。建议将 DTE/DCE 速度设置为固定速度,而不是遵循线路速度。从逻辑上讲,固定 DTE/DCE 速度应该足够大,以应对预期的最高线路速度。例如,V.90 调制解调器应该通过串行接口以 115200 bit/s 或更高速度访问。
在现代调制解调器上设置 DTE/DCE 速度非常简单。它们都在串行接口上使用自动检测。也就是说,它们自己检测从 DTE 接收的数据速度,并使用相同的速度将数据返回给计算机。它们通常也会自动检测奇偶校验和 7 位/8 位数据长度。通常,调制解调器在自动检测串行接口时会假定一位停止位。因此,只需将 DTE 上的串行接口配置为所需的 DTE/DCE 通信参数,让调制解调器自行解决即可。
在极少数情况下,自动检测可能会失败,并且某些调制解调器的自动检测可能已损坏。如果调制解调器倾向于自动检测失败,则可以在 DTE 配置完毕后,通过发送一个或多个 *nop* AT 命令来启动初始通信,这有助于解决问题。
AT<CR>
重复发送,直到调制解调器开始返回
OK
用于 *nop* 命令。
当调制解调器与远程方建立连接时,它可以报告所使用的速度。事实上,它可以报告线路速度或仅报告 DTE 速度(某些调制解调器可以报告两者)。最终用户最可能对线路速度感兴趣,而不是 DTE/DCE 速度。因此,从这个角度来看,最好将调制解调器设置为报告线路速度,并将接收到的信息写入日志文件。但是,一些旧的通信软件或调制解调器驱动程序会将来自调制解调器的响应解释为更改 DTE/DCE 速度的请求。在这种情况下,必须将调制解调器设置为始终返回 DTE/DCE 速度。由于此 DTE/DCE 速度将与通过自动检测检测到的速度相同,因此不会发生速度变化。
在极少数情况下,如果 DTE/DCE 速度确实应该遵循线路速度,则来自调制解调器的响应当然应该设置为返回线路速度。然后,DTE 软件必须评估响应并相应地更改 DTE/DCE 速度。现在,这种做法并不推荐。
有关如何设置要获取的响应的详细信息,请参阅 #W: 协商进度消息选择 命令。
发送到调制解调器的命令和文本响应应为 ISO 646 字符集。ISO 646 是 7 位 ASCII 字符集的另一种名称。通常,调制解调器会截断接收到的任何命令的第 8 位。它们将结果解释为如果命令仅使用 7 位字符发送。但是,不建议依赖此功能,而应确保仅使用 7 位字符发送命令。
假设现代调制解调器,命令不区分大小写。一些早期的调制解调器坚持仅使用大写命令。尽管如此,通用驱动程序最好确保所有命令都以大写形式发送,并且所有响应都以不区分大小写的方式解释。通常,*AT* 命令前缀的两个字母必须大小写一致。因此,*AT* 和 *at* 可以接受,而 *At* 和 *aT* 则不可接受。
调制解调器编程意味着进入电信世界。对于大多数业余和专业程序员来说,这是一个未知领域。电信高度依赖于状态机。事实上,在不使用状态机的情况下,编程调制解调器相当困难甚至不可能。调制解调器始终处于特定状态,任何尝试控制和使用调制解调器的 DTE 软件都需要跟踪调制解调器的状态,即其自身的状态机。这是必要的,因为 Hayes 兼容调制解调器只能在处于特定状态时执行某些操作。例如,它只能在未连接到任何远程站点的情况下拨出。
可以使用特定的 RS-232 线路跟踪调制解调器状态的一部分。例如,DCD(数据载波检测)可用于确定调制解调器是否检测到远程调制解调器的载波信号。其他信息由流控制线路提供。但是,一些状态和相关数据需要通过解释调制解调器的 结果代码 来跟踪。
不熟悉状态机理论和实践的人往往会尝试通过“硬编码”来规避问题。这意味着,他们会将越来越多的代码添加到问题中(包装在一个堆叠的 if/then/else/otherwise/maybe/... 语句中),直到事情看起来正常工作 - 至少看起来是这样。如果他们幸运的话,他们会隐式地创建一个正常工作的状态机。如果他们不走运,他们最终会得到一个部分状态机,如果通信中发生任何异常情况,它就会崩溃。这通常会导致软件未设计为在事情崩溃时恢复,因此此类软件往往会挂起或崩溃。
更有效的方法是首先花几个小时学习简单状态机的基础知识,然后花几个小时将与调制解调器的通信描述为一个状态机。此规划的结果可作为实现 DTE 软件的良好模板。
缓慢的设备需要一种方法来告诉其对等方,目前它正忙,因此必须停止接收更多传入数据,直到该缓慢设备通知其他情况。流控制提供了此机制。流控制有两种方法:硬件流控制和软件流控制。
硬件流控制通常使用 CTS(允许发送)和 RTS(请求发送)线路来实现,这需要设备之间有单独的硬件数据线路。这已在 RS-232 电缆规范中分配。
基于 DSR(数据设备就绪)和 DTR(数据终端就绪)的硬件流控制并不常见,特别是对于调制解调器而言。它通常可以在串行打印机上找到。同样,DSR/DTR 硬件流控制需要设备之间有额外的硬件数据线路。
从编程的角度来看,编程 CTS/RTS 或 DSR/DTR 硬件流控制通常没有太大区别。硬件必须提供驱动/读取串行接口中对应信号的方法。如果硬件支持 CTS/RTS 和 DSR/DTR 流控制,则建议支持两者,并为用户提供配置选项。
需要注意的是,某些硬件或操作系统驱动程序不提供驱动/读取不太常见的 DSR/DTR 组合的方法。如果远程设备坚持使用 DTR/DSR 流控制,一个常见的解决方法是在软件中使用 CTS/RTS,但重新布线以使 CTS/RTS 线实际上连接到 DSR/DTR。
这种流控制不需要像硬件流控制那样需要额外的信号线,而是使用数据内容中的特殊控制字符。为了停止接收更多传入数据,接收设备会发送 XOFF 字符。为了允许接收更多数据,将发送 XON 字符。
但是,由于发送的数据不能包含这些字符(除非知道接收设备忽略此类信息),因此无法以这种方式传输二进制(非 ASCII)数据。软件流控制通常用于与终端和其他基于字符的设备进行通信。不应以这种方式发送二进制数据,因为它可能会随机包含这些字符。通常使用使用 RTS/CTS 的硬件流控制。
实用提示:认识到 Control 键是一个特殊的“Shift”键,它会截断第 100 位(八进制),因此很容易记住用于发送 XOFF 的 ASCII 字符是 Control-S(八进制 23),而 XON 字符是 Control-Q(八进制 21)。[考虑“S”代表停止,“Q”代表继续…你不会这样拼写吗?]
从命令状态更改为在线状态或从在线状态更改为命令状态,要么非常简单,要么就是一个巨大的谜团。本模块介绍了一些较为晦涩的方法。
当然可以,通过断开连接(用调制解调器术语来说,即挂机)从在线状态切换到命令状态。也可以在保持连接的情况下暂时切换到命令状态。
以编程方式挂机(而不是通过断开调制解调器控制线路)也需要首先在保持连接的情况下切换到命令状态。
在数据传输过程中切换到命令状态(在线状态不表示其他含义)需要在数据中发送特定的转义序列。该转义序列会被调制解调器检测到,调制解调器会改变状态。由于此字符序列也可能是正常数据的一部分,因此需要额外的机制来将转义序列与正常数据区分开。这就是带内信令的难题。
转义序列的分隔通过使用称为“保护时间”的方法来完成,该方法曾被 Hayes 获得专利。因此,一些调制解调器制造商使用了一种称为“时间无关转义序列”的备用转义序列来消除保护时间。无论如何,只有在 DTE(终端)至少在保护时间内没有其他数据,并且在转义序列之后至少在保护时间内没有其他数据时,调制解调器才会识别转义序列。
转义序列由三个相同的特定字符组成。字符和保护时间都是可配置的。默认情况下,字符为+
,保护时间为一秒。因此,使用默认配置,更改为命令状态需要
<1 sec. nothing>+++<1 sec. nothing>
如果连接应断开,则此转义序列应后跟AT
命令以挂断,即ATH0
<1 sec. nothing>+++<1 sec. nothing>ATH0<CR>
从命令状态到在线状态的常用方法是拨号到远程站点(参见D
命令)。但是,如果连接已经存在,并且调制解调器已通过转义序列切换到命令模式,则方法不同。
如果连接不应断开,而是应继续数据传输,则需要ATO0
(字母 o,数字零)命令
<1 sec. nothing>+++<1 sec. nothing> send a few more modem commands, then go back on-line ATO0<CR>
本页或本节是未完成的草稿或提纲。 您可以帮助开发工作,或者您可以在项目室寻求帮助。 |
本页或本节是未完成的草稿或提纲。 您可以帮助开发工作,或者您可以在项目室寻求帮助。 |
以下是原始 Hayes 命令的列表。不同的调制解调器使用略微不同的命令。但是,此列表应该是尽可能通用的,不应扩展到特定于调制解调器的命令。相反,建议在附录中提供此类命令列表。
本页或本节是未完成的草稿或提纲。 您可以帮助开发工作,或者您可以在项目室寻求帮助。 |
以下是 AT 命令格式和语法的总结。请注意,大多数控制字符都是可配置的,总结仅使用默认控制字符。
- 调制解调器仅在命令模式下才会接受 AT 命令。可以使用#+++: 转义序列强制调制解调器进入命令模式。
- 命令分组在命令行中。
- 每条命令行必须以#AT: 命令前缀开头,并以#<CR>: 行尾字符结尾。唯一的例外是#A/: 重复最后一条命令命令。
- 命令行主体由可见的 ASCII 字符(ASCII 码 32 到 126)组成。空格(ASCII 码 32)和 ASCII 控制字符(ASCII 码 0 到 31)被忽略,除了#<BS>: 退格字符、#<CAN>: 取消字符和#<CR>: 行尾字符。
- 所有在#AT: 命令前缀之前的字符都被忽略。
- 命令行的解释/执行从接收第一个(也是命令行终止符)#<CR>: 行尾字符开始。
- 在初始#AT: 命令前缀之后和#<CR>: 行尾字符之前的所有字符都被解释为命令。除了一些例外,一条命令行中可以有多个命令。
- 每个基本命令由一个单一的 ASCII 字母,或一个单一的 ASCII 字母加上一个
&
前缀,后面跟着一个数值组成。缺少的数值被解释为0
(零)。
- 以下命令不能在命令行中跟随更多命令。它们必须始终是命令行中的最后一个命令。如果它们后面跟着其他命令,则这些其他命令将被忽略。但是,其中一些命令接受命令修饰符,并且后面的命令可能会意外地被解释为命令修饰符。因此,应注意不要在这些命令后面再添加任何命令。相反,它们应该放在自己的命令行中。
- 如果尚未输入终止的#<CR>: 行尾字符,则可以使用#<BS>: 退格字符一次删除一个命令行字符来编辑命令行。初始#AT: 命令前缀无法编辑/删除(它已被处理,因为在接收到#AT: 命令前缀后,调制解调器立即开始命令行解析和编辑,但不会执行)。
- 当#E: 命令状态字符回显选择处于打开状态时,调制解调器会回显命令行和编辑(令人惊讶的是,:-))。
- 当回显打开时,#<BS>: 退格字符会以
<BS> <BS>
(退格、空格、退格)的序列回显,以擦除例如 DTE 上的终端程序中的最后一个字符。
- 在发送终止#<CR>: 行尾字符之前,可以通过发送#<CAN>: 取消字符随时取消命令行。在这种情况下,命令行中的任何命令都不会执行。
- #A: 应答命令和#D: 拨号命令也可以取消,只要与远程站点的握手尚未完成。取消是通过发送一个额外的字符来完成的。理论上,发送哪个字符无关紧要。但需要注意的是,不要在握手已完成时尝试取消。在这种情况下,调制解调器已切换到在线状态(#命令状态到在线状态),并且字符将发送到远程端。避免此问题的安全方法是始终使用#+++: 转义序列,然后使用#H: 挂钩命令选项挂断。如果调制解调器已处于在线状态,这将断开连接。如果调制解调器仍然处于握手阶段,#+++: 转义序列的第一个字符将取消命令(其余部分将被解释为正常的命令行,不会造成任何伤害)。
- 当命令行中的第一个命令失败或整个命令行已执行时,命令行执行停止。在失败的命令之前的所有命令都已执行。命令行中的失败命令和失败命令之后的任何命令都未执行。
- 没有特别指示命令行中哪个命令失败,只是其中一个命令失败了。最好重复整个命令行,或者在从故障中恢复之前先将调制解调器重置到已定义的状态。
- 调制解调器仅在上一条命令行已执行时才会接受新命令行(半双工通信)。因此,应注意仅在收到上一条命令行的结果代码后才发送下一条命令行。
当所有命令都已记录时,将删除此部分。
语法
<The syntax of the command, when necessary in EBNF>
描述
<命令的描述,包括有关目的和效果的信息>
结果代码
代码 | 描述 |
---|---|
OK | 参数有效<成功描述> |
ERROR | 其他情况<失败描述> |
相关命令和寄存器
- <相关命令和寄存器的链接列表>
参见 AT命令 A - M
参见 AT命令 N - Z
参见AT& 命令
参见结果代码
参见S-寄存器
现代消费类调制解调器提供了一些最初对调制解调器来说不常见的功能,但随着时间的推移,这些功能已成为标准功能。本节概述了如何编程这些功能。
本页或本节是未完成的草稿或提纲。 您可以帮助开发工作,或者您可以在项目室寻求帮助。 |
串口编程: 简介和OSI网络模型 -- RS-232布线和连接 -- 典型的RS232硬件配置 -- 8250 UART -- DOS -- MAX232驱动器/接收器系列 -- Windows中的TAPI通信 -- Linux和Unix -- Java -- Hayes兼容调制解调器和AT命令 -- 通用串行总线 (USB) -- 形成数据包 -- 纠错方法 -- 双向通信 -- 数据包恢复方法 -- 串行数据网络 -- 实际应用开发 -- IP over串行连接