我需要通过串行连接(RS-232 和 RS-422)发送和接收数据。

我如何建立这样的连接并与之通信?我如何找出配置设置(例如波特率)应该是,我该如何设置它们?

我特别希望在 Java、C/C++ 或主要 Unix shell 之一中执行此操作,但我也对使用 Windows/超级终端进行串行编程感兴趣。

有帮助吗?

解决方案

建造时光机回到 1987 年?嗬嗬。

好了,不再发表尖酸刻薄的评论了。

我如何找出配置设置(例如波特率)应该是...

阅读数据表?好的好的。说真的,最后一张。如果您不知道要与之通信的设备的波特率,您有两种选择。开始猜测,或者可能拿出示波器。如果您需要一个好的起点,我建议您使用 9600-8-N-1。我怀疑你可以用蛮力相对较快地到达那里。还有第三种选择,即让一个老式忍者仅通过在某个标准波特率下出现的乱码就可以知道实际波特率是多少。毫无疑问,这是一个令人印象深刻的派对技巧。

希望您能够访问此信息。在unix/linux下,可以直接拿minicom来玩串口。这应该可以相当快地弄清楚配置。

主要的 Unix shell 之一

在 Unix 中,串行端口被文件映射到 /dev/ 子目录中。例如,ttyS0。如果您使用 minicom 设置了正确的波特率等,您甚至可以将内容发送到该文件以将内容发送到那里。

关于问题的实质,您可以通过 POSIX 标头以编程方式访问它。termios.h 是最大的一个。

看: http://www.easysw.com/~mike/serial/serial.html#3_1 (不再可用)

但我也对使用 Windows/超级终端进行串行编程感兴趣。

超级终端和小型计算机基本上是相同的程序。至于Windows如何让你访问串行端口,我将这个问题留给其他人。自 Win95 时代以来我就没有在 Windows 中这样做过。

其他提示

如果你想用 Java 编码,我强烈推荐 SerialIOs 串行端口. 。它非常易于使用,可以节省您数天的工作时间。我从来没有找到过像 SerialIO 一样好的开源库,真的!

我的建议:不要使用Sun的串行IO框架!它是 1998 年的,充满了错误。您可以使用 接收方 但串行更好!

对于 Windows 上的 C/C++,您(至少)有两种选择:

  1. 使用.NET 提供的SerialPort 类。
  2. 使用 Win32 API。有一个 广泛的 MSDN 文章 可以追溯到 1995 年,网上有许多免费的库和示例可以帮助您入门。

.NET 选项会容易得多。

如果需要跨平台,我建议看看Boost 阿西奥.

在工作中,我们使用 teraterm 和 realterm 来检查串行数据的格式是否正确。此外,我们还有一个带有交换机的硬件分配器,因此我们可以通过返回另一个端口的电缆监控应用程序的流量。

Windows 允许您通过 CreateFile 访问串行端口。这为您提供了一个句柄,您可以从那里配置访问权限。

不久前,我编写了一个相当大的应用程序,用于将连接从一组调制解调器路由到 TCP/IP 网络地址。

最初我寻找一个无阻碍(免费)的串行 IO 库。我尝试过 Sun、IBM 和 RxTx。它们在开发应用程序和初始测试中表现良好,但在生产中它们都被证明不稳定。

最后我支付了SerialIO的SerialPort费用。转换实际上是改变导入的练习,并且图书馆已经 绝对地 坚如磐石 - 我强烈推荐它。我的应用程序已经在现场 24/7 运行了几年,多个客户没有遇到任何问题。

如果您开始使用 SerialPort 进行开发,他们有更好的 API,我会使用它。

如果您需要跨平台支持,带有 SerialPort 的 Java 是我能找到的最佳选择。

最后,只要您没有在客户的设备上预安装软件,他们的许可就非常合理。

另一方面,如果您想使用 C# 来实现,它可以在 Windows 和 Linux 上运行——需要一些 局限性 (编辑:这可能已经过时了。我没有办法测试它。)。只需创建一个 串行端口 对象,设置其波特率、端口和任何其他奇怪的设置,对其调用 open,并写出您的 byte[]。完成所有设置后,SerialPort 对象的行为与任何网络流非常相似,因此应该很容易弄清楚。

正如 ibrandy 所说,在开始尝试与任何串行设备通信之前,您需要了解所有这些设置,例如波特率。

根据您尝试通信的设备,可能需要考虑的参数比波特率、数据位数、奇偶校验类型和停止位数更多。如果我没记错的话,调制解调器使用 9 条 RS-232C 接口线。某些设备(例如收银机)可能在 RTS/CTS 线路或 DTR/STR 线路上使用硬件握手。

一般来说,了解界面的工作原理是有好处的。如果波特率不匹配,则无法通信,但其他参数设置错误可能会起作用。例如,您可以轻松地将数据发送到需要 1 个停止位且已设置 2 个停止位的设备。在这种情况下,当您尝试接收数据时就会出现问题。您还可以使用适当设置的奇偶校验位作为停止位等之一。

如果你不被迫使用特定的编译器,我建议使用 Qt,在新的 5.3 版本中你会发现一个专用于串行端口的类:

http://qt-project.org/doc/qt-5/qserialport.html

您将编写的代码将在所有受支持的 Qt 平台上运行,至少是那些具有串行端口的平台。

我一直在使用 purejavacomm:它是纯java + JNA编写的javax.comm的实现

与 rxtx 不同,您不需要安装 dll。它是纯Java + JNA编写的,为我解决了Windows和Linux之间的移植问题。移植到 JNA 支持的其他操作系统应该很容易,例如 Solaris 和 FreeBSD,但我还没有尝试过。

您可能期望纯 Java 库在性能上落后于本机实现(例如 rxtx),但对于现代 CPU,瓶颈很可能是串行端口的比特率,而不是 CPU 周期。此外,它比混合 Java/Native 库或纯编译的本机代码更容易调试。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top