跳转到内容

串行编程/简介和OSI模型

来自维基教科书,开放的书籍,开放的世界

欢迎来到串行数据通信的奇妙世界。这是本系列文章的一部分,将涵盖串行数据通信的许多方面。我们将从基本原理开始,并采用分层方法。在阅读完本书后,读者将能够在计算机之间通过线缆传输几乎所有数据。我们也会讨论一些无线通信形式。

这个主题有很多方面,有时它是一个非常难以破解的难题。我将深入探讨,尝试从基础开始,并介绍RS-232串行数据通信标准。

为什么选择串行通信?

[编辑 | 编辑源代码]

首先,从计算机技术的角度来看,这里将要描述的基本标准非常古老。你们中的一些人可能发现你们的祖父母甚至曾祖父母在大学期间使用过这种协议。同时,它的概念非常可靠,因此,放弃它的理由应该始终受到质疑。事实上,自从RS-232串行数据协议建立以来,已经开发出几种其他数据传输方法,但这种“工作马”仍然被广泛使用,而且似乎每隔一段时间就会重新流行起来。

串行通信意味着一次传输一位。它可以与并行通信进行比较,在并行通信中,多位数据同时传输。并行通信比串行通信速度更快,但它需要的信号线比串行通信更多,串行通信只需要一根信号线。

在其他方法都失败的情况下,可以依赖RS-232串行通信。当您尝试将两台计算机设备连接在一起时,有时更新的通信方法会存在一些难以解决的限制,比如连接数量、射频干扰、距离限制、物理障碍、敏感区域(比如医疗设备,在那里,杂散电压可能是个问题),或者您绝对需要依靠数据传输的可靠性。作为RS-232的姊妹协议,RS-422协议甚至允许传输数英里的电缆。

串行数据通信被广泛应用。虽然通常人们认为PC可以处理您想让它处理的任何问题,但仍然存在许多电子设备包含需要记录的大量数据。部分原因是该协议的年代久远,有许多传统设备使用RS-232串行数据作为连接外界的唯一方式。但即使许多最新的网络设备也具有RS-232“控制台”端口,以方便初始配置并提供网络本身发生故障时的故障排除手段。由于硬件被广泛应用和提供,加上许多软件工具,使用该系统开发设备和软件相对便宜。特别是在传输速度并不重要的情况下,但数据需要定期发送。RS-232串行数据是一种非常合理的解决方案,而不是更昂贵的10BASE-T TCP/IP解决方案或高速光纤。

串行数据通信也很灵活。虽然通常的传输方式是通过两点之间的铜线,但最近有一些转换器可以将串行数据通过光纤线路、无线发射器、USB设备甚至通过TCP/IP网络传输。真正令人惊讶的是,所有这些传输方法对于接收或传输串行数据的设备来说都是完全透明的。它也可以作为TCP/IP的载体,并用于私有网络。

OSI分层网络通信模型

[编辑 | 编辑源代码]

虽然串行数据通信并非严格意义上的网络通信协议,但了解分层通信模型在处理任何类型的通信协议时仍然很重要。通常,实现串行数据软件的人必须构建该模型的多个层,即使他们在当时并不完全意识到这一点。

网络层

  1. 应用层
  2. 表示层
  3. 会话层
  4. 传输层
  5. 网络层
  6. 数据链路层
  7. 物理层

串行数据通信通常并不实现所有这些不同的层,而且更常见的是,这些不同的层被组合在同一个模块中,甚至被组合在同一个函数中。这个模型最初是由国际标准化组织(ISO)于1984年开发的,以帮助人们了解不同的网络结构可以在哪里分离和混合。这里的要点是,您知道可以分离通信子系统的不同部分,以帮助进行调试过程,并将结构从一个子系统移动到另一个子系统。

如果您的软件使用类似的模型编写,那么在更改特定层的模块时,不需要重新编写上层和下层的软件子例程。为了实现这一点,您需要为层之间的接口建立严格的标准,这些标准将在本文档的其他部分中介绍。例如,Web浏览器不需要知道HTML是通过光纤电缆、无线传输还是串行数据电缆发送的。

串行通信层

[编辑 | 编辑源代码]

对于串行数据通信,我看到这种层模型更常见

  1. 串行数据应用
  2. 串行网络
  3. 数据包挑战/验证
  4. 基本串行数据包
  5. UART处理
  6. 原始RS-232信号

在许多串行数据应用程序中,并不实现所有这些层。通常只是一些原始数据包被单向传输,但有时即使只是任何类型的信号也可以指示计算机上发生了一些动作,无论内容如何。可以简单地将原始RS-232信号的逻辑电平包含在您的软件中,但在某些时候,数据确实需要被转换,并且RS-232中涉及的电压可能会损坏硬件,因此这种情况很少见。

软件示例

[编辑 | 编辑源代码]

本系列文章并非旨在引发编程语言的圣战。目前,我将使用 Turbo Pascal 和 Delphi 作为编程语言,主要是因为我对这个开发环境最为熟悉。如果优秀的 C/C++ 大师愿意将这些例程“翻译”成其他语言,我将表示欢迎,也欢迎将例程移植到其他适用的编程语言中。串行通信本身就相当复杂,所以请避免使用像 Intercal 或 Malbolge 这样的深奥语言。一个好的 BASIC 实现将受到欢迎,LISP 也一样。我将尽量避免使用特定语言的特性,而是以通用方式处理函数,这样优秀的程序员就可以将其翻译成他们选择的语言。

这些文章旨在教您串行数据通信的基础知识,而不是创建一个可用的串行数据驱动程序。尽管如此,所有的代码示例都将在列出之前经过实际编译器的检查和验证,并尽可能进行完全调试。完成这些步骤和任务没有唯一的方案,因此我将鼓励您动手实践软件和网络设置。

虽然我在处理多种串行数据协议方面(在数据包级别)拥有相当丰富的经验,但我绝不是这方面的顶级专家。正如我之前所说,我在处理多个层级的通信方面拥有相当丰富的经验,我愿意分享一些我辛苦得来的知识。

教育应用

[编辑 | 编辑源代码]

虽然我仅仅是一名软件工程师,并不具备编写教育教科书的“正式”资格,但我相信,学生通过实验串行数据通信,可以学到很多关于计算机网络的知识。这些文章的目标受众是高中黑客/计算机极客和本科计算机科学专业学生。高中教师可以利用这些文章来教授相关主题,大学教师也可以在特殊主题课程中使用这些文章,让学生能够获得关于通信协议的实际经验。OSI 模型的每一层都可以通过实践的方式进行演示,让学生们从第一手经验中学习为什么互联网上实施了某些规则/系统,标准文档的含义,甚至可以参与标准文档的创建。

如果您是教授或高中教师,有兴趣使用本文,我特别愿意根据您的需求调整本文,或者与您合作涵盖该主题。

从专业的角度来看,这个主题很少在大学里教授,通常只是在快速介绍其他协议套件的时候一带而过。软件开发人员通常通过主管将一堆规格文档、带有 API 文档的驱动程序磁盘以及通常很短的截止日期放到他们的办公桌上,来接触这个主题,要求他们在去年应该完成的任务上取得进展。真正了解串行数据通信的软件开发人员价值连城,而且即使是这些开发人员,通常也只是学到足以完成眼前任务的知识。

我还发现,从开发串行数据通信中学到的技能可以应用到其他项目中,并能更深入地理解几乎所有数据传输系统。除了我提到的其他群体之外,我还针对那些不幸的软件工程师,他们试图学习关于这个非常困难的主题的任何知识,却不知道从哪里开始。关于串行通信的文档很少,而且有时自相矛盾。

这个主题并不一定很复杂,即使是普通人也能理解所有工作原理。

[编辑 | 编辑源代码]

其他串行编程文章

[编辑 | 编辑源代码]
华夏公益教科书