串行编程/调制解调器和 AT 命令
串行编程: 介绍和 OSI 网络模型 -- RS-232 布线和连接 -- 典型 RS232 硬件配置 -- 8250 UART -- DOS -- MAX232 驱动/接收器系列 -- Windows 中的 TAPI 通信 -- Linux 和 Unix -- Java -- Hayes 兼容调制解调器和 AT 命令 -- 通用串行总线 (USB) -- 形成数据包 -- 错误校正方法 -- 双向通信 -- 数据包恢复方法 -- 串行数据网络 -- 实际应用开发 -- IP 通过串行连接
此内容是串行编程书籍的一部分。它涵盖了 Hayes 和 Hayes 兼容电话调制解调器的编程。这种类型的调制解调器是消费类应用的标准,也是许多专业应用的标准 - 基本上,只要调制解调器仍在使用的地方。
调制解调器编程正在慢慢成为一种失传的技艺,尤其是在用户从拨号线路迁移到 DSL 的过程中,原因显而易见。然而,调制解调器仍然用于许多应用。近年来,调制解调器出现在以前没有出现的新领域。例如,机器中的嵌入式调制解调器用于在机器需要维护时自动“呼叫”制造商。这通常通过无线电话系统完成,其中无线模块仍然为拨号和数据传输提供 Hayes 兼容的接口。
原始的 Hayes 调制解调器命令集仅在本模块中用作参考。不包括供应商特定的扩展,也不属于本模块。该模块解释了术语Hayes的起源以及相关的AT 命令。它还包含一些有关调制解调器是什么以及如何与调制解调器进行信号传输的基本信息。然后该模块继续描述调制解调器编程的基础知识,包括设置开发环境。
此外,该模块还提供了详细的(但不完整)编程信息以及不完整的原始 Hayes 命令集和寄存器的参考。
本节特别针对潜在的作者。请注意
- 本模块不是用于随机调制解调器编程信息和民间传说的垃圾场。
- 本模块是操作系统不可知的。编程串行数据通信书籍提供了其他模块以获取此类信息。
- 本模块处理通用 Hayes 调制解调器,而不是任何供应商特定的扩展。如果您确实想看到您的特定“心头爱”被涵盖,请提供一个包含该供应商/品牌特定信息的附录。
- 不要认为仅仅因为某些功能在您的特定调制解调器上有效,它就是标准,而其他调制解调器也是以相同的方式执行。如果您没有第一手经验证明某项功能在“几乎”所有 Hayes 兼容调制解调器上都以相同的方式执行,那么就不要包括它,或者至少将其标记为可疑。
这个模块坚持使用原始的 Hayes 命令集的原因是为了有一个明确的界限。此模块并非意图作为参考手册。一旦掌握了基本集并实现了代码,处理特定于供应商的扩展就相当简单。其他扩展,例如非常粗糙和基本的传真扩展,需要深入了解所涉及的协议(例如,在传真情况下,需要了解传真数据在电话线上的详细编码、压缩和时序)。这超出了本书的范围。如果您知道如何处理传真扩展,请自己编写一本关于传真扩展的书籍。
Hayes 微型计算机产品公司是一家调制解调器制造商,从 20 世纪 80 年代初到 90 年代末,其鼎盛时期是在 90 年代初。Hayes 这一名称仍然作为一个品牌名称存在,归 Zoom 电信公司所有(截至 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)以用于特定应用和扩展,并且还有一些补充。当然,还有许多标准定义了调制解调器的其他方面,例如压缩和传输。
另请参见
几乎所有 Hayes 调制解调器命令都以两位字母序列AT
开头,用于获得调制解调器的注意。因此,调制解调器命令通常被称为AT 命令。这对许多特定于制造商的命令集扩展仍然有效。它们中的大多数也以AT
开头,也被称为AT 命令。请注意,仅仅因为 AT 命令包含一个&并不意味着它是一个扩展。&命令已经是原始 Hayes 命令集的一部分。
术语AT 命令集的具体用法因制造商而异,通常取决于营销宣传。一般来说,可以假设具有AT 命令集的调制解调器
- 使用以
AT
开头的命令, - 使用原始 Hayes 的方法来分离数据和命令,以及
- 支持原始的 Hayes 命令和寄存器设置作为子集。
从经典意义上讲,调制解调器是用于通过模拟线路传输数字信息的调制/解调器,例如模拟电话系统的双线或四线线路。该术语已经成为可以接受的俚语,用于描述许多通信设备,这些设备用于将计算机连接到另一台计算机或广域网 (维基百科:WAN)。例如,Ricochet 无线数据收发器通常被称为“Ricochet 调制解调器”。
本模块处理经典类型的智能调制解调器,旨在将数据从/向串行接口转换为/从模拟线路。该模块也适用于提供经典串行接口但通过不同的物理层(例如数字线路)连接的调制解调器,以及为其他目的提供串行调制解调器式接口的设备。就我们的目的而言,调制解调器是经典的 DCE(数据通信设备),通过串行线由经典的 DTE(数据终端设备)(例如计算机)控制。
根据调制解调器的类型,调制解调器可以使用多种不同的技术和速度在模拟线路上传输数据。这些技术的细节在这里不是特别重要,除了要注意,大多数调制解调器都可以指定这些通信参数(例如,禁用压缩或更改调制技术)。本模块处理的数据不是模拟线路上的数据,而是出现在 DTE 和 DCE 之间的串行接口上的数据。也就是说,由计算机等设备读取和写入的数据。
(智能)调制解调器还提供辅助服务,例如拨号以建立连接。因此,调制解调器可以处于多种不同的状态和模式,这些状态和模式并不总是正交的。例如,调制解调器可以在命令模式下,同时保持与远程方位的连接(有关详细信息,请参见+++
序列)。
非智能调制解调器必须依赖其他设备(如 ACU(自动呼叫单元))才能提供这些辅助服务,但它们在今天实际上已经灭绝了。
原始的 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(数据载波检测)。这会造成这样的情况,即调制解调器驱动软件现在不仅要处理带内信号,还要处理与调制解调器的带外信号。这会稍微复杂化通信软件的 状态机。
此外,特别是在手机调制解调器兴起的情况下,制造商再次开始引入更多带外信号。这些调制解调器提供多个虚拟串行接口。这些接口中的一些专门用于数据传输,由另一个串行接口控制,该接口要么专门用于信号(即带外信号),要么仍然也可以用于更传统的带内信号场景。在这种情况下,通信软件需要管理更复杂的状态。
在控制调制解调器方面,Hayes 兼容调制解调器处于两种主要状态之一
- 命令状态
- 调制解调器将来自 DTE 的数据解释为调制解调器命令。调制解调器可以在命令状态下,同时保持与远程方的连接。
- 联机状态
- 调制解调器将来自 DTE 的数据解释为有效负载,并将其传输到另一方。此状态要求已建立与远程站点的连接。
在这些主要状态内部,还有许多子状态。此外,在其他问题方面,调制解调器还有许多通信状态,例如,远程载波是否被检测到。
- 发起模式
- 处于发起模式的调制解调器是指正在建立连接的调制解调器,例如通过拨打远程站点的号码并启动协议协商来建立连接。
- 应答模式
- 处于应答模式的调制解调器是指正在等待被联系,并准备“接听电话”的调制解调器。
命令响应
[edit | edit source]调制解调器应该对收到的几乎所有命令发送响应。这些响应可以是 ASCII 字符串的形式,也可以是数值形式。响应类型可以通过命令切换,但通常使用 ASCII 响应。
DTE 需要非常仔细地跟踪响应。除了其他信息外,它们还向 DTE 提供有关远程站点拨号是否成功,以及调制解调器是否从命令状态切换到在线状态的信息。
不幸的是,自原始的 Hayes 调制解调器以来,响应消息集已经得到了很大的扩展,并且通常可以通过额外的 AT
命令进行配置。建议不要严格解析响应消息,而是宽容地检查它们是否包含有趣的关键字,例如 CONNECT
。还建议仔细研究特定调制解调器的使用手册。
S-寄存器
[edit | edit source]所谓的 S-寄存器也是 Hayes 的遗产,所有与 Hayes 兼容的调制解调器都支持它。它们是调制解调器中的寄存器,包含各种设置。与 AT 命令一样,它们也被不同的调制解调器制造商广泛增强。
它们被称为S-寄存器的原因有点不清楚。有些人说S代表调制解调器的设置。有些人说它们就这样被称作,因为它们是通过ATS
... 命令设置和读取的。在通俗的说法中,它们通常被称为存储寄存器,因为它们即使在断电后也会永久存储值。
其他几个AT
命令也会改变特定 S-寄存器的值。直接通过 S-寄存器设置值或通过其他AT
命令设置值通常没有区别。哪种设置寄存器的方法更好取决于具体情况。
调制解调器编程基础
[edit | edit source]命令参考
[edit | edit source]为了对实际的调制解调器进行编程,最好获取该特定调制解调器的命令参考。不幸的是,无名调制解调器没有附带任何可用的命令参考已经变得非常普遍。由于 Windows 的即插即用功能,在 Windows 上不再需要知道单独的命令。相反,调制解调器在 Windows 上运行所需要的只是附带必要的.inf
文件(通常隐藏在一些“安装程序”软件中,被称为“驱动程序”,这在技术上是不正确的,因为 Windows 已经包含了必要的驱动程序)。
如果调制解调器没有附带命令参考,那么下一个合乎逻辑的步骤是在网上搜索。然而,不幸的是,近年来,许多调制解调器信息已经从地球表面和互联网上消失了。随着宽带互联网连接的兴起,调制解调器已经成为过时的设备,许多来源不再可用。找到有关特定调制解调器类型的基本信息变得越来越困难。即使对于现代的调制解调器,例如手机调制解调器,也可能难以找到必要的信息。
如果没有调制解调器附带命令参考,那么可以通过多种方法获取它
- 也许经销商会在其网站上提供。
- 也许 OEM 制造商会提供。
这需要识别 OEM 制造商。一种可能的方法是使用设备的 FCC 号码,然后在 FCC 网站上查找原始制造商。 - 也许芯片组制造商会提供。
消费级调制解调器通常只是围绕来自大型硬件制造商的“现成”调制解调器芯片组构建的。调制解调器越便宜,调制解调器制造商在固件中没有进行任何更改,而是使用芯片组制造商提供的原始示例软件的可能性就越大。一些芯片组供应商为其调制解调器提供命令参考。 - 通过查看相应的 Windows
.inf
文件,至少可以获取基本命令 - 通过使用本维基教科书模块中的通用 Hayes 命令参考。
- 如果存在表明特定调制解调器符合此类命令标准的指示,则获取之前提到的标准文档。
- 使用某种嗅探程序来监控调制解调器和 DTE 之间的通信,并使用获得的信息反向工程命令。这要求 (a) 反向工程在您的司法管辖区内是合法的,以及 (b) 有一些可用的 DTE 通信软件可以处理特定的调制解调器,以便有一些有效的通信可以嗅探。
设置开发环境
[edit | edit source]强烈建议在开始编写调制解调器的驱动程序或软件之前,花一些时间来设置一个合适的开发环境。大部分工作都是硬件设置。
建议使用一台“远程”计算机和一台处于应答模式的第二台调制解调器来建立一个小网络。“远程”计算机在这种情况下是指一台与开发机器相邻但通过调制解调器连接的计算机。如果正在开发终端程序,那么“远程”计算机应该运行一些小型 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 计算机之间,也很有用。
操作系统、编程语言和通信基础
[edit | edit source]在处理调制解调器处理的细节之前,应该先了解一些基础知识。首先,应该确保与串行接口的通信正常。这包括理解特定操作系统提供的用于串行通信的 API(如果有的话)。如果操作系统没有提供此类 API,那么建议首先实现 UART 访问,并将其封装到一个库中,如果某些硬件中的串行 UART 应该直接编程。或者,可以使用提供方便的串行接口访问的编程语言。
无论使用什么,都应该在开始对调制解调器进行编程之前进行测试。没有什么比不知道特定错误行为是由与调制解调器的串行通信故障引起,还是由调制解调器本身的问题(通常是由发送给它的命令引起的)更令人恼火。
除非是最简单的情况,建议使用硬件握手与调制解调器通信,特别是对于大于2400 bit/s或9600 bit/s的速度。因此,所使用的低级串行通信软件和硬件应支持硬件握手。如果UART支持某些FIFO,例如16550 UART,则应启用FIFO(用于发送和接收数据)。
尚不清楚通过轮询或中断接收数据哪种更好。如果每个传入字节都会引发一个中断,则在高速通信情况下会产生许多中断,而且令人惊讶的是,在这种情况下,轮询UART可能更有效。
调制解调器支持的通信通常是半双工的。要么是DTE要么是DCE说话,另一方应该倾听。与调制解调器的通信最好使用以下方式:
- 8位
- 无奇偶校验
- 1个停止位
有关速度信息,请参见下一节。
线路速度不是DTE/DCE速度
[edit | edit source]+-------------+ 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: 协商进度消息选择命令。
字符集和字符大小写
[edit | edit source]发送到调制解调器的命令和文本响应应该使用ISO 646字符集。ISO 646只是熟悉的7位ASCII字符集的另一个名称。通常,调制解调器会将它们接收到的任何第8位截断。它们将结果解释为如果命令仅使用7位字符发送。但是,不建议依赖于此,而是确保命令仅使用7位字符发送。
命令不区分大小写,假设是现代调制解调器。一些早期的调制解调器坚持使用全大写命令。尽管如此,一个通用的驱动程序可以做的是确保所有命令都以大写形式发送,并且所有响应都以不区分大小写的方式解释。通常,AT
命令前缀的两个字母必须具有相同的大小写。因此,AT
和at
是可以接受的,而At
和aT
则不是。
欢迎来到状态机世界
[edit | edit source]调制解调器编程意味着进入电信世界。这对大多数业余程序员以及专业程序员来说都是一个未知的领域。电信高度依赖于状态机。事实上,如果不使用状态机,就很难或不可能对调制解调器进行编程。调制解调器在任何时刻都处于特定状态,任何试图控制和使用调制解调器的DTE软件都需要在自己的状态机中跟踪调制解调器的状态。这是必要的,因为Hayes兼容的调制解调器只有在特定状态下才能执行某些操作。例如,它只有在未连接到任何远程站点时才能拨出。
调制解调器部分状态可以通过特定RS-232线路进行跟踪。例如,DCD(数据载波检测)可以用来判断调制解调器是否检测到远程调制解调器的载波信号。其他信息由流控制线路提供。但是,一些状态和相关数据需要通过解释调制解调器的结果代码来跟踪。
不熟悉状态机理论和实践的人经常试图通过“硬编码”来规避这个问题。这意味着,他们将越来越多的代码添加到问题中(包裹在if/the/else/otherwise/maybe/...语句中),直到事情看起来可以工作——有点。如果他们幸运的话,他们已经隐式地创建了一个可以工作的状态机。如果他们不走运,他们最终会得到一个部分状态机,如果通信中发生异常情况,它就会崩溃。这通常伴随着一个问题,即软件没有被设计为在发生故障时恢复。因此,此类软件往往会挂起或崩溃。
首先花几个小时学习简单状态机的基础知识,然后花几个小时将与调制解调器的通信描述为状态机,效率会高得多。这种规划的结果可以作为实现DTE软件的良好模板。
流控制
[edit | edit source]慢速设备需要一种方法来告诉其对等方,它目前很忙,因此必须停止进一步的传入数据,直到此慢速设备另行通知。这种机制由流控制提供。有两种方法可以实现流控制:通过硬件或软件。
硬件流控制
[edit | edit source]硬件流控制通常使用 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。
软件流控制
[edit | edit source]这种流控制不需要像硬件流控制那样需要额外的信号线,而是使用数据内容中的特殊控制字符。为了停止进一步的传入数据,接收设备发送 XOFF 字符。为了启用更多数据,将发送一个 XON 字符。
但是,由于正在发送的数据不能包含这些字符(除非您知道接收设备忽略此类信息),因此二进制(非 ASCII)数据无法以这种方式传输。软件流控制通常用于与终端和其他基于字符的设备的通信。不应以这种方式发送二进制数据,因为它可能随机包含这些字符。通常使用使用 RTS/CTS 的硬件流控制。
有用提示:意识到控制键是一个特殊的“移位”键,它切断了第 100 位(八进制),因此很容易记住用于发送 XOFF 的 ASCII 字符是 Control-S(八进制 23),而 XON 的字符是 Control-Q(八进制 21)。[想想“S”表示停止,“Q”表示继续……你不这样拼写吗?]
状态更改
[edit | edit source]概述
[edit | edit source]从命令状态更改为在线状态或反之亦然,要么很简单,要么就是一个巨大的谜团。本模块涵盖了更模糊的方法。
在线状态到命令状态
[edit | edit source]当然可以通过断开连接(用调制解调器术语来说是挂断电话)从在线状态切换到命令状态。也可以在保持连接的情况下临时切换到命令状态。
以编程方式挂断电话(而不是通过断开调制解调器控制线)需要首先在保持连接的情况下切换到命令状态。
切换到命令状态,实际上是在数据传输过程中(在线状态没有别的意思)需要发送一个特定的转义序列作为数据的一部分。调制解调器检测到该转义序列,调制解调器更改状态。由于此字符序列也可能是正常数据的组成部分,因此需要额外的机制来将转义序列与正常数据区分开来。这是带内信令的诅咒。
转义序列的分隔是通过使用所谓的保护时间完成的,保护时间曾经是 Hayes 的专利。结果,一些调制解调器制造商使用称为时间无关转义序列的替代转义序列消除了保护时间。无论如何,只有在来自 DTE(终端)没有其他数据至少持续保护时间,并且在转义序列后来自终端没有其他数据至少持续保护时间的情况下,调制解调器才会识别该转义序列。
转义序列由三次相同的特定字符组成。字符以及保护时间是可配置的。默认情况下,字符是+
,保护时间为一秒。因此,在默认配置下,更改为命令状态需要
<1 sec. nothing>+++<1 sec. nothing>
如果连接应该断开,则此转义序列后面应该跟着AT
命令以挂断电话,即ATH0
<1 sec. nothing>+++<1 sec. nothing>ATH0<CR>
命令状态到在线状态
[edit | edit source]从命令状态切换到在线状态的通常方法是通过拨号远程站点(参见D
命令)。但是,如果连接已经存在,并且调制解调器已通过转义序列切换到命令模式,则方法不同。
如果连接不应断开,而是应该继续数据传输,则需要使用ATO0
(字母 o,数字零)命令
<1 sec. nothing>+++<1 sec. nothing> send a few more modem commands, then go back on-line ATO0<CR>
同步与异步接口
[edit | edit source] 此页面或部分是一个未开发的草稿或大纲。 您可以帮助开发工作,或者您可以在项目室寻求帮助。 |
X.25 接口
[edit | edit source] 此页面或部分是一个未开发的草稿或大纲。 您可以帮助开发工作,或者您可以在项目室寻求帮助。 |
AT 命令
[edit | edit source]以下列表是原始 Hayes 命令的列表。不同的调制解调器使用略微不同的命令。但是,此列表应该尽可能“通用”,不应扩展到调制解调器特定的命令。建议在附录中提供此类命令列表。
此页面或部分是一个未开发的草稿或大纲。 您可以帮助开发工作,或者您可以在项目室寻求帮助。 |
AT 命令格式
[edit | edit source]以下是 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: 挂机命令选项 挂机。如果调制解调器已经处于在线状态,这将断开连接。如果调制解调器仍然处于手握阶段,则 #+++: 转义序列 的第一个字符将取消命令(其余字符将被解释为正常的命令行,不会造成任何损害)。
- 当命令行中的第一个命令失败或整个命令行已执行完毕时,命令行执行停止。在失败命令之前的每个命令都已执行。命令行中失败命令之后的每个命令以及失败命令本身都没有被执行。
- 没有特别指示哪条命令在命令行中失败,只知道有一条命令失败。最好重复整个命令行,或者在从错误中恢复之前先将调制解调器重置到已知状态。
- 调制解调器只有在先前命令行执行完毕后才会接受新的命令行(半双工通信)。因此,应注意仅在收到先前命令行的结果代码后才发送下一条命令行。
命令描述模板
[edit | edit source]所有命令都文档化后,将删除。
语法
<The syntax of the command, when necessary in EBNF>
描述
<命令描述,包括关于目的和效果的信息>
结果代码
代码 | 描述 |
---|---|
OK | 参数有效 <成功描述> |
ERROR | 其他情况 <失败描述> |
相关命令和寄存器
- <相关命令和寄存器链接列表>
特殊命令和字符序列
[edit | edit source]参见 特殊命令和字符序列参考
AT 命令 A - M
[edit | edit source]参见 AT 命令 A - M
AT 命令 N - Z
[edit | edit source]参见 AT 命令 N - Z
AT& 命令
[edit | edit source]参见 AT& 命令
结果代码
[edit | edit source]参见 结果代码
S-寄存器
[edit | edit source]参见 S-寄存器
高级功能
[edit | edit source]介绍
[edit | edit source]现代消费级调制解调器提供许多额外的功能,这些功能最初在调制解调器中并不常见,但随着时间的推移已成为标准功能。本节概述了如何对这些功能进行编程。
此页面或部分是一个未开发的草稿或大纲。 您可以帮助开发工作,或者您可以在项目室寻求帮助。 |
传真类 1
[edit | edit source]传真类 2
[edit | edit source]语音服务
[edit | edit source]串行编程: 介绍和 OSI 网络模型 -- RS-232 布线和连接 -- 典型 RS232 硬件配置 -- 8250 UART -- DOS -- MAX232 驱动/接收器系列 -- Windows 中的 TAPI 通信 -- Linux 和 Unix -- Java -- Hayes 兼容调制解调器和 AT 命令 -- 通用串行总线 (USB) -- 形成数据包 -- 错误校正方法 -- 双向通信 -- 数据包恢复方法 -- 串行数据网络 -- 实际应用开发 -- IP 通过串行连接