如何配置串口并与串口通信?

时间:2008-08-06 03:19:19

标签: java c++ windows unix

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

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

特别是我希望用Java,C / C ++或其中一个主要的Unix shell做这个,但我也对使用Windows / Hyperterminal的串行编程感兴趣。

10 个答案:

答案 0 :(得分:27)

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

好的,没有更多讽刺的评论。

  

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

阅读数据表?好的好的。说真的,最后一个。如果您不知道要尝试与之通信的设备的波特率,则有两种选择。开始猜测,或者可能破坏o范围。如果您需要一个好的起点,请让我建议9600-8-N-1。我怀疑你可以用相对较快的蛮力到达那里。还有第三种方法可以让一个老派的忍者只能通过一些标准波特率来判断乱码中的字符是什么实际的波特率。一个令人印象深刻的派对技巧,以确保。

希望您可以访问此信息。在unix / linux中,您可以直接使用串口来获取minicom。这应该可以很快地找到配置。

  

一个主要的Unix shell

在Unix中,串口被文件映射到/ dev / subdir。例如,ttyS0。如果您使用minicom设置了正确的波特率和诸如此类的东西,您甚至可以将该文件中的内容发送到那里。

问题的关键,你可以通过POSIX标题以编程方式访问它。 termios.h是最重要的。

请参阅:http://www.easysw.com/~mike/serial/serial.html#3_1 (不可用)

  

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

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

答案 1 :(得分:11)

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

我的建议:不要使用Sun的串行IO框架!它是从1998年开始充满虫子的。您可以使用rxtx,但序列会更好!

答案 2 :(得分:9)

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

  1. 使用.NET提供的SerialPort类。
  2. 使用Win32 API。有一个extensive MSDN article可以追溯到1995年,网上有很多免费的图书馆和例子可以帮助你入门。
  3. .NET选项会更容易。

答案 3 :(得分:5)

如果它需要跨平台,我建议看看Boost Asio

答案 4 :(得分:3)

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

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

答案 5 :(得分:3)

前一段时间我写了一个相当大的应用程序,用于路由从调制解调器群到TCP / IP网络地址的连接。

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

最后我支付了SerialIO的SerialPort。转换实际上是改变进口的一种练习,而且库已经 绝对 坚如磐石 - 我不能推荐它。我的应用程序已经在现场24/7运行了几年,没有多个客户遇到任何问题。

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

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

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

答案 6 :(得分:2)

从另一方面来说,如果你想使用C#运行它,这将在Windows和Linux上运行 - 有一些limitations(编辑:可能已经过时了。我无法测试它。)。只需创建一个SerialPort对象,设置其波特率,端口和任何其他奇数设置,在其上调用open,然后写出你的byte [] s。完成所有设置后,SerialPort对象的行为与任何网络流非常相似,因此应该很容易理解。

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

答案 7 :(得分:1)

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

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

答案 8 :(得分:1)

如果您没有被迫使用特定的编译器,我建议使用Qt,在新的5.3版本中,您将找到专用于串行端口的类:

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

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

答案 9 :(得分:0)

我一直在使用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库或纯编译的本机代码更容易调试。