如何configuration串行端口并进行通信?
我需要通过串行连接(RS-232和RS-422)发送和接收数据。
我如何设置和连接这样的连接? 如何确定configuration设置(如波特率)应该如何设置?
特别是我期待在Java,C / C ++或主要Unix shell之一中做到这一点,但我也对使用Windows /超级terminal的串行编程感兴趣。
build立一个时间机器,回到1987年? 何浩
好吧,没有更多的评论。
我怎么弄清楚什么configuration设置(如波特率)应该是…
阅读数据表? 好的好的。 严重的是,最后一个。 如果您不知道您正在尝试与之通信的设备的波特率,则有两种select。 开始猜测,或者可能破坏一个范围。 如果你需要一个好的起点,让我build议9600-8-N-1。 我的怀疑是你可以用蛮力到达那里。 还有第三个select,就是有一个老派的忍者,可以通过一些标准波特率的乱码字符来看看实际的波特率是多less。 一个令人印象深刻的派对技巧是肯定
希望你可以访问这些信息。 在unix / linux下,你可以直接使用串口来连接minicom。 这应该使得相当快的configuration计算出来。
主要的Unix shell之一
在Unix中,串行端口被文件映射到/ dev / subdir中。 例如ttyS0。 如果你设置了正确的波特率,而不是使用minicom,你甚至可以把这个文件的内容发送到那里。
关于这个问题,您可以通过POSIX头以编程方式访问它。 termios.h是最大的一个。
请参阅: http : //www.easysw.com/~mike/serial/serial.html#3_1 (不提供任何)
但是我也对使用Windows /超级terminal的串行编程有兴趣。
超级terminal和minicom基本上是相同的程序。 至于Windows如何让你访问串口,我会把这个问题留给其他人。 自Win95以来,我在Windows中没有这样做。
如果你想在Java代码,我真的推荐SerialIO SerialPort 。 这是非常容易使用,并节省您的工作天。 我从来没有发现像SerialIO一样的开源库,真的!
我的build议是:不要使用Sun的串行IO框架! 从1998年开始,充满了错误。 你可以使用rxtx,但serialio更好!
对于Windows上的C / C ++,您有(至less)两个select:
- 使用.NET提供的SerialPort类。
- 使用Win32 API。 有一个可追溯到1995年的广泛的MSDN文章 ,以及在networking上的许多免费图书馆和例子,让你开始。
.NET选项将会更容易。
如果需要跨平台的话,我会build议看看Boost Asio 。
另一方面,如果你想使用C#,它可以在Windows和Linux上运行 – 有一些限制 (编辑:可能已经过时了,我没有办法testing它)。 只要创build一个SerialPort对象,设置其波特率,端口和任何其他奇怪的设置,打开它,并写出你的byte [] s。 在完成所有设置之后,SerialPort对象的行为与任何联网stream非常相似,因此应该很容易弄清楚。
按照ibrandy的说法,在开始尝试与任何串行设备通信之前,您需要知道所有这些设置,例如波特率。
在工作中,我们使用teraterm和realterm来检查串行数据的格式是否正确。 我们还有一个带有交换机的硬件分离器,所以我们可以通过电缆将stream量监控到另一个端口。
Windows允许您通过CreateFile访问串行端口。 这给你一个处理,从那里你可以configuration访问。
一段时间以来,我写了一个体面的大小的应用程序来从调制解调器场连接到TCP / IPnetworking地址。
最初我寻找一个不受限制(免费)的串行IO库。 我试过了Sun,IBM和RxTx。 他们在开发应用程序方面很好,在最初的testing中,但是在生产中他们都被certificate是不稳定的。
最后我付了SerialIO的SerialPort。 转换字面上是一个改变import的练习,图书馆已经绝对坚如磐石 – 我不能推荐它。 我的应用程序已经在现场24/7运行了几年,现在没有多个客户遇到一个单一的问题。
如果你使用SerialPort开始开发,他们有更好的API,我会使用它。
如果您需要跨平台支持,那么带有SerialPort的Java是我能find的最佳select。
最后,只要您不在客户的设备上预安装软件,他们的许可就相当合理。
从Java rxtx ( NOT AVAILABLE ANYMORE )库是相当不错的。 它提取了Sun的串行IO框架离开的地方。
根据您尝试与之通信的设备,可能会有比波特率,数据位数,奇偶校验types以及要考虑的停止位数更多的参数。 如果我没有记错,调制解调器使用九条RS-232C接口。 一些设备,例如收银机,可能会在RTS / CTS线路或DTR / STR线路上使用硬件握手。
一般来说,知道界面如何工作是很好的。 如果波特率不匹配,则不能通信,但其他参数的错误设置可能会起作用。 例如,您可以轻松地将数据发送到设备,期望1个停止位,并设置2个停止位。 当您在这种情况下尝试接收数据时,问题就开始了。 您也可以使用适当的设置校验位作为停止位之一等。
我一直在使用purejavacomm : 它是用java + JNA编写的javax.comm的一个实现
不像rxtx,你不需要安装一个dll。 它是用纯Java + JNA编写的,为我解决了Windows和Linux之间的可移植性问题。 应该很容易移植到JNA支持的其他操作系统,比如Solaris和FreeBSD,但是我还没有尝试过。
您可能会期望纯java库在性能上落后于本地实现(如rxtx),但是对于现代CPU,瓶颈很可能是串行端口的比特率,而不是CPU周期。 此外,debugging比混合Java / Native库或纯编译本机代码更容易。
如果你不是被迫使用特定的编译器,我build议使用Qt,而在新的5.3版本中,你会发现专用于串口的类:
http://qt-project.org/doc/qt-5/qserialport.html
你将编写的代码将运行在所有支持Qt的平台上,至less那些有串口的平台。