如何配置串口并与之通信?
我需要通过串行连接(RS-232和RS-422)发送和接收数据。
如何建立这种连接并与之通信?如何确定配置设置(例如波特率)以及如何进行设置?
特别是,我希望使用Java,C / C ++或者主要的Unix Shell进行此操作,但是我也对使用Windows / Hyperterminal进行串行编程感兴趣。
解决方案
回答
建造一台时光机,回到1987年?呵呵
好的,再也不需要发表尖刻的评论了。
How do I figure out what the configuration settings (e.g. baud rate) should be...
阅读数据表?好的好的。说真的,最后一个。如果我们不知道要与之通信的设备的波特率,则有两种选择。开始猜测,或者可能破灭一个o范围。如果我们需要一个良好的起点,请允许我建议9600-8-N-1. 我的怀疑是,我们可以相对较快地用蛮力到达那里。还有第三种选择,就是让一位老式的忍者以某种标准波特率通过LOOK辨别出乱码,这是什么实际波特率。可以肯定的是令人印象深刻的聚会把戏。
希望我们可以访问此信息。在unix / linux中,我们可以使用minicom来直接使用串行端口。这样应该可以很快确定配置。
one of the major Unix shells
在Unix中,将串行端口映射到/ dev /子目录中。例如,ttyS0。如果我们使用minicom设置正确的波特率而不使用波特率,则我们甚至可以将内容添加到该文件中以将内容发送到该文件。
关于问题的实质,我们可以通过POSIX标头以编程方式访问它。 termios.h是其中的一员。
请参阅:http://www.easysw.com/~mike/serial/serial.html#3_1
(不再可用)
but I also have some interest in serial programming using Windows/Hyperterminal.
超级终端和minicom基本上是同一程序。至于Windows如何让我们访问串行端口,我将把这个问题留给其他人解决。自Win95以来,我还没有在Windows中做到这一点。
回答
从另一方面讲,如果我们想使用C#(可以在Windows和Linux上运行)进行操作,但有一些限制(编辑:可能已过时。我无法对其进行测试。)。只需创建一个SerialPort对象,设置其波特率,端口和其他任何奇数设置,对其调用open,然后写出byte [] s。完成所有设置后,SerialPort对象的行为与任何网络流都非常相似,因此应该很容易弄清楚。
正如ibrandy所说,我们甚至在开始尝试与任何串行设备进行通信之前,都需要了解所有这些设置,例如波特率。
回答
在工作中,我们使用teraterm和realterm来检查串行数据的格式是否正确。另外,我们还有一个带交换机的硬件分配器,因此我们可以通过电缆将其监视到另一个端口来监视应用程序的流量。
Windows允许我们通过CreateFile访问串行端口。这为我们提供了一个句柄,我们可以从那里配置访问权限。
回答
从Java开始,rxtx(不再提供)库非常好。它从Sun的串行IO框架中断的地方开始。
回答
对于Windows上的C / C ++,我们有(至少)两个选择:
- 使用.NET提供的SerialPort类。
- 使用Win32 API。 MSDN上有一篇广泛的文章可以追溯到1995年,并且网上有许多免费的库和示例可以入门。
.NET选项将更加容易。
回答
如果我们想用Java编写代码,我真的建议我们使用SerialIOs SerialPort。它非常易于使用,可以节省工作时间。我从来没有找到像SerialIO一样好的开源库!
我的建议:不要使用Sun的串行IO框架!它是从1998年开始的,充满了错误。我们可以使用rxtx,但serialio更好!
回答
如果需要跨平台,我建议我们看一下Boost Asio。
回答
不久前,我写了一个大小合适的应用程序,用于将调制解调器场中的连接路由到TCP / IP网络地址。
最初,我寻找一个不受限制的(免费)串行IO库。我尝试了Sun,IBM和RxTx。它们非常适合开发应用程序和进行初始测试,但在生产中它们都不稳定。
最后,我为SerialIO的SerialPort支付了费用。转换实际上是改变进口的一种做法,而且图书馆绝对是坚如磐石,我不能推荐它。我的应用程序已经在24/7领域中运行了两年,没有多个客户遇到一个单一的问题。
如果我们开始使用SerialPort进行开发,那么他们将拥有更好的API,我会使用它。
如果需要跨平台支持,带有SerialPort的Java是我能找到的最佳选择。
最后,只要我们没有为客户预先在设备上安装软件,他们的许可就相当合理了。
回答
根据要尝试与之通信的设备,参数可能比波特率,数据位数,奇偶校验类型和停止位数要多。如果我没记错的话,调制解调器使用RS-232C接口的9条线。某些设备(例如收银机)可能会在RTS / CTS线路或者DTR / STR线路上使用硬件握手。
通常,最好知道该接口的工作方式。如果波特率不匹配,我们将无法进行通信,但是其他参数的错误设置可能会起作用。例如,我们可以轻松地将数据发送到期望设置1个停止位的1个停止位的设备。在这种情况下,当我们尝试接收数据时,问题就开始了。我们还可以使用适当设置的奇偶校验位作为停止位之一,等等。