我需要通过串行连接(RS-232 和 RS-422)发送和接收数据。
如何设置这种连接并与之通信?我如何弄清楚配置设置(例如波特率)应该是什么以及如何设置它们?
特别是,我希望在 Java、C/C++ 或主要的 Unix shell 之一中执行此操作,但我也对使用 Windows/Hyperterminal 进行串行编程感兴趣。
造一台时光机,回到1987年?嗬嗬。
好的,不再有刻薄的评论。
我如何弄清楚配置设置(例如波特率)应该是什么......
阅读数据表?好的好的。说真的,最后一个。如果您不知道您尝试与之通信的设备的波特率,您有两种选择。开始猜测,或者可能破坏一个 o-scope。如果您需要一个好的起点,我建议您使用 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/Hyperterminal 进行串行编程感兴趣。
超级终端和 minicom 基本上是同一个程序。至于 Windows 如何让您访问串行端口,我将把这个问题留给其他人。自 Win95 以来,我还没有在 Windows 中这样做过。
如果你想用 Java 编写代码,我真的推荐 SerialIOs SerialPort。它非常易于使用,可以节省您数天的工作时间。我从来没有找到像 SerialIO 这样好的开源库,真的!
我的建议:不要使用 Sun 的串行 IO 框架!它是从 1998 年开始的,充满了错误。您可以使用rxtx但 serialio 更好!
对于 Windows 上的 C/C++,您有(至少)两种选择:
.NET 选项会容易得多。
如果需要跨平台,我建议查看 Boost Asio。
不久前,我编写了一个大小合适的应用程序,将连接从调制解调器群路由到 TCP/IP 网络地址。
最初,我寻找一个不受阻碍的(免费)串行 IO 库。我尝试了 Sun、IBM 和 RxTx。它们在开发应用程序和初始测试时都很好,但在生产中它们都被证明是不稳定的。
最后我支付了 SerialIO 的 SerialPort。转换实际上是更改导入的练习,并且该库绝对坚如磐石 - 我不能推荐它。我的应用程序已经在现场 24/7 运行了几年,多个客户没有遇到任何问题。
如果您开始使用 SerialPort 进行开发,他们有更好的 API,我会使用它。
如果您需要跨平台支持,那么带有 SerialPort 的 Java 是我能找到的最佳选择。
最后,只要您没有为您的客户在设备上预安装软件,他们的许可就非常合理。
另一方面,如果你想使用 C# 来做,它将在 Windows 和 Linux 上运行——有一些限制(编辑:这可能已经过时了。我无法测试它。)。只需创建一个SerialPort对象,设置其波特率、端口和任何其他奇怪的设置,在其上调用 open,然后写出您的 byte[]s。完成所有设置后,SerialPort 对象的行为与任何网络流非常相似,因此应该很容易弄清楚。
正如 ibrandy 所说,在您开始尝试与任何串行设备通信之前,您需要了解所有这些设置,例如波特率。
在工作中,我们使用 teraterm 和 realterm 来检查串行数据的格式是否正确。此外,我们还有一个带交换机的硬件分离器,因此我们可以通过连接到另一个端口的电缆监控到我们的应用程序的流量。
Windows 允许您通过 CreateFile 访问串行端口。这为您提供了一个句柄,您可以从那里配置访问权限。
根据您尝试与之通信的设备,可能有比波特率、数据位数、奇偶校验类型和停止位数更多的参数要考虑。如果我没记错的话,调制解调器使用 9 条 RS-232C 接口。某些设备(例如收银机)可能会在 RTS/CTS 线路或 DTR/STR 线路上使用硬件握手。
一般来说,了解界面的工作原理是件好事。如果波特率不匹配,您将无法通信,但其他参数设置错误可能会起作用。例如,您可以轻松地将数据发送到需要设置 2 个停止位的 1 个停止位的设备。当您在这种情况下尝试接收数据时,问题就开始了。您还可以使用适当设置的奇偶校验位作为停止位之一等。
如果你不是被迫使用特定的编译器,我建议使用 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 库或纯编译的本机代码更容易调试。