如何配置串行端口并进行通信?

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

我如何设置并与这种连接进行通信?如何确定配置设置(例如波特率)应该如何设置?

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

0
额外
意见: 2

11 答案

建立一个时间机器并回到1987年?何浩。

好吧,没有更多的评论。

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

阅读数据表?好的好的。严重的是,最后一个。如果您不知道您尝试与之通信的设备的波特率,则有两种选择。开始猜测,或者可能破坏一个范围。如果你需要一个好的起点,让我建议9600-8-N-1。我的怀疑是你可以用蛮力相对迅速地到达那里。有一个老派忍者的第三个选择,他可以通过LOOK看出在一些标准波特率下乱码字符的实际波特率是多少。确保一个令人印象深刻的派对伎俩

希望尽管你可以访问这些信息。在unix / linux中,你可以直接使用minicom来连接串口。这应该使得相当快地获得配置。

主要的Unix shell之一

在Unix中,串行端口被文件映射到/ dev / subdir中。例如,ttyS0。如果你设置了正确的波特率,而不是使用minicom,你甚至可以将这些文件的内容发送到那里。

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

See: http://www.easysw.com/~mike/serial/serial.html#3_1 (NOT AVAILABLE ANYMORE)

但我也有使用Windows /超级终端串口编程的兴趣。

超级终端和minicom基本上是相同的程序。至于Windows如何让你访问串口,我会把这个问题留给其他人。自Win95以来,我在Windows中没有这样做。

0
额外

在工作中,我们使用teraterm和realterm检查串行数据的格式是否正确。此外,我们还有一台带有交换机的硬件分离器,以便我们可以通过电缆将流量传输到另一个端口。

Windows允许您通过CreateFile访问串行端口。这给你一个句柄,从那里你可以配置访问。

0
额外

一段时间以来,我写了一个体面的应用程序来将连接从调制解调器场连接到TCP / IP网络地址。

最初,我寻找一个无阻塞(免费)的串行IO库。我试过了Sun,IBM和RxTx。他们在开发应用程序方面很好,在最初的测试中,但在生产中他们都证明不稳定。

最后我付了SerialIO的SerialPort。转换完全是练习改变进口的方式,图书馆一直坚定地坚持着 - 我不能推荐它。几年来,我的应用程序一直在现场24/7运行,并没有遇到多个客户遇到的单个问题。

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

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

最后,只要您没有为您的客户预先安装设备上的软件,他们的授权就非常合理。

0
额外
@Gili:几年前,对于RxTx来说 - 我在购买SerialPort之后从未回到它,因为我们从来没有遇到SerialPort问题,也没有版税,所以没有动力投入时间在RxTx上。
额外 作者 Lawrence Dol,
@Gili:SerialPort目前正在由我们的客户使用。
额外 作者 Lawrence Dol,
IIRC,最大波特率仅受H / W限制 - 我写了我的配置允许高达1.3Mb,但是我的目标是通过RS-232调制解调器,因此115K是我需要的最大值,可能是我的最大值永远都会。
额外 作者 Lawrence Dol,
与USB转换器通信的最大波特率是多少?我看着他们的网站,它说230400,但我可能误解了一些东西。 (230Kbaud对我的应用程序不够)
额外 作者 Jason S,
你最近一次使用RxTx和SerialPort?我很好奇RxTx是否有所改善。
额外 作者 Gili,

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

按照ibrandy的说法,在开始尝试与任何串行设备通信之前,您需要知道所有这些设置,例如波特率。

0
额外

从Java rxtxNOT AVAILABLE ANYMORE )图书馆是相当不错的。它提供了Sun的串行IO框架离开的地方。

0
额外
上述链接已经死亡。请参阅 RXTX Wiki
额外 作者 George,

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

  1. 使用.NET提供的SerialPort类。
  2. 使用Win32 API。追溯到1995年的广泛的MSDN文章,以及许多免费的图书馆以及网络上的示例以帮助您入门。

.NET选项将会更容易。

0
额外

如果需要跨平台,我建议您查看Boost 短耳的。

0
额外

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

一般来说,知道界面如何工作是很好的。如果波特率不匹配,则无法通信,但其他参数的错误设置可能适用。例如,您可以轻松地将数据发送到设备,期望1个停止位并设置2个停止位。当您尝试在这种情况下接收数据时,问题就会开始。您也可以使用适当的设置校验位作为停止位之一等。

0
额外

I have been using purejavacomm: It is an implementation of javax.comm written in pure java + JNA

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

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

0
额外

如果你想用Java编码,我真的推荐SerialIOs SerialPort 。它使用起来非常简单,并且可以节省您数天的工作时间。我从来没有发现像SerialIO一样好的开源库,真的!

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

0
额外

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

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

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

0
额外