java -如何配置串行端口并与之通信?

Translate

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

如何设置此类连接并与之通信?如何确定配置设置(例如波特率)以及应该如何设置?

特别是,我希望在Java,C / C ++或主要的Unix shell中进行此操作,但我也对使用Windows / Hyperterminal进行串行编程感兴趣。

This question and all comments follow the "Attribution Required."

所有的回答

Translate

建造一台时光机,回到1987年?呵呵

好的,再也不需要发表尖刻的评论了。

如何确定配置设置(例如波特率)应为...

阅读数据表?好的好的。说真的,最后一个。如果您不知道要与之通信的设备的波特率,则有两种选择。开始猜测,或者可能破灭一个o范围。如果您需要一个良好的起点,请允许我建议9600-8-N-1。我怀疑您可以用蛮力快速到达那里。还有第三种选择,那就是让一名老式忍者以某种标准波特率通过LOOK辨别出乱码,这是什么实际波特率。可以肯定的是令人印象深刻的聚会把戏。

希望您可以访问此信息。在unix / linux中,您可以使用minicom来直接使用串行端口。这样应该可以很快确定配置。

主要的Unix shell之一

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

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

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

但是我也对使用Windows / Hyperterminal进行串行编程感兴趣。

超级终端和minicom基本上是同一程序。至于Windows如何让您访问串行端口,我将把这个问题留给其他人解决。自Win95以来,我还没有在Windows中做到这一点。

来源
Translate

如果您想用Java编写代码,我真的建议您使用SerialIO串行端口。它非常易于使用,可以节省您的工作时间。我从来没有找到像SerialIO一样好的开源库!

我的建议:不要使用Sun的串行IO框架!它是从1998年开始的,充满了bug。您可以使用x但是serialio更好!

来源
smh
Translate

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

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

.NET选项将更加容易。

来源
Translate

如果需要跨平台,我建议您看一下Boost麻生.

来源
Translate

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

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

来源
Translate

不久前,我写了一个大小合适的应用程序,用于将调制解调器场中的连接路由到TCP / IP网络地址。

最初,我寻找一个不受限制的(免费)串行IO库。我尝试了Sun,IBM和RxTx。它们非常适合开发应用程序和进行初始测试,但在生产中它们都不稳定。

最后,我为SerialIO的SerialPort付款。转换实际上是改变进口的一种做法,图书馆一直在绝对坚如磐石-我不能推荐它。我的应用程序已经在24/7领域中运行了几年,没有多个客户遇到一个单一的问题。

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

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

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

来源
Translate

另一方面,如果您想使用C#进行操作,则该C#可以在Windows和Linux上运行-有些局限性(编辑:可能已过时。我无法对其进行测试。)。只需创建一个串行端口对象,设置其波特率,端口和任何其他奇数设置,对其调用open,然后写出byte [] s。完成所有设置后,SerialPort对象的行为与任何网络流都非常相似,因此应该很容易弄清楚。

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

来源
Translate

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

通常,最好知道该接口的工作方式。如果波特率不匹配,您将无法进行通信,但是其他参数的错误设置可能会起作用。例如,您可以轻松地将数据发送到期望设置1个停止位的1个停止位的设备。在这种情况下,当您尝试接收数据时,问题就开始了。您还可以使用适当设置的奇偶校验位作为停止位之一,等等。

来源
Translate

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

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

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

来源
Translate

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

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

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

来源
上一个问题:
链接两个Office文档