串行通信,使用本地com端口与多产的usb->串口的问题

本文关键字:usb- 问题 串口 通信 com | 更新日期: 2023-09-27 18:10:11

我不完全确定这是我的代码问题,还是硬件问题。

我有一个程序,它与一些设备(具体来说是火灾报警控制面板)进行单向(仅接收)通信。当我编写程序时,它是在没有本机串行端口的PC上完成的,所以我使用了一个多产的串行->usb加密狗。这在很大程度上是有效的。我偶尔会得到一个随机的3F/?当连接到两种类型的facp之一时,在数据中显示,但我认为这只是转换器起作用,所以我只是从输出中剥离它们。

然后我把它移植到一些工作笔记本电脑上,这些笔记本电脑是戴尔的,有本地com端口。现在我的数据是乱码的废话(主要是3F/?)偶尔我会看到正确的字符,但大多数都是无稽之谈。通常连废话的长度都不合适。使用多产的转换器,它"工作",我得到所有我期望的数据-加上一个3F/?每个角色之间。如果我删除了坏字符,它的显示就会很好,但当其他地方明显出错时,这是一种廉价的hack。

期望数据和接收数据的示例:

//Expected:
FIRE ALARM                     MAGNET    ELEVATOR SHAFT       HOISTWAY    
ELEVATOR SHAFT       Z111   HEAT(fixed)  09:34:19A FRI JUN 06, 2014     L02D041
//Received (approximation, not actual copy/paste as I don't have it on this PC):
F?I?R?E?A?L?R?M??????? ????????M????T????E?LEV?T?R S?H?A?F?T??H?O??S?T?W?A?Y???    
E?E??T???S?H?A?F?T   ?Z1?1?1HEAT(fixed)  0?9?:?34?19??AF?R?I?J???N?6??2?1?4????

我当前检索数据的方法是通过DataReceivedHandler事件和ReadLine()。我以前使用了readexististing()和ReadByte(),但结果是相同的,所以我回到了ReadLine,因为它最适合我接收的数据(80个字符后面跟着EOL)

端口设置是正确的,9600/8/1/None/XonXoff,根据制造商和个人经验。多产转换器和本机串行端口在其他程序(如puTTY, procomm或制造商软件)中工作都很好。有一次,我运行了一个叫SerialMon的程序,想看看它到底在发送什么,我得到的是同样的乱码。我用它来测试各种端口设置,但无济于事。

我以前用python写过几乎相同的软件,它在笔记本电脑上的本机com端口和多产转换器上都工作得很好。python软件和其他终端程序工作的事实使我认为这是我需要在我的终端上修复的。net/c#的东西。

是的…任何见解都是非常感谢的。序列相关代码如下。

//declaring
SerialPort com = new SerialPort();       
//opening port
com.PortName = Properties.Settings.Default.com;
com.BaudRate = Properties.Settings.Default.baudrate;
com.Parity = Properties.Settings.Default.parity;
com.StopBits = Properties.Settings.Default.stopbits;
com.DataBits = Properties.Settings.Default.databits;
com.Handshake = Properties.Settings.Default.handshake;
com.Open();
//reading data
buf = com.ReadLine();

TL;DR:串行程序工作,有一些坏数据,使用多产的2303加密狗。程序不能使用本机COM端口工作。其他程序(putty, procomm等)使用两者都可以很好地工作。在同一台笔记本电脑上,类似的Python程序可以很好地使用多产和本机com端口。尝试其他端口设置,尝试端口监控程序。发送帮助。

编辑:设备以ASCII格式发送数据

串行通信,使用本地com端口与多产的usb->串口的问题

谢谢大家的帮助。结果是奇偶校验错误。串口不接受奇偶校验。当通过用户属性赋值时无,即使转换为奇偶校验类型也是如此。它默认为奇偶校验。甚至(尽管MSDN说None是默认值?)我最终做的是将属性设置为应用程序,并让用户在两个可接受的设置之间切换,而不是自由运行端口设置。这似乎已经解决了这个问题,我在本机串行端口和转换器上都没有奇偶校验错误。

提示我的是将ParityReplace设置为另一个字符,正如Markus建议的那样。在这一点上,很明显,这是一个奇偶校验错误。我仍然不确定为什么我使用的SerialMon程序得到相同的结果,即使奇偶校验设置为None。

作为参考,ErrorReceived在任何时候都没有引发。

再次感谢大家的帮助。