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

时间:2014-06-24 01:57:25

标签: c# serial-port

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

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

然后我把它移植到一些工作笔记本电脑,这是戴尔的本机COM端口。而现在我的数据是乱码(大多是3F /?)。偶尔我会看到正确的字符,但这主要是胡说八道。通常甚至没有合适的废话。使用多产转换器,它“工作”,因为我得到了我期望的所有数据 - 增加了3F /?每个角色之间。如果我删除坏字符就显示得很好,但是当其他东西明显错误时,这是​​一个廉价的黑客。

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

//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()。我之前使用过ReadExisting()和ReadByte(),但结果是相同的,所以我回到了ReadLine,因为它最适合我收到的数据(80个字符后跟EOL)

根据制造商和个人经验,端口设置正确,9600 / 8/1 /无/ 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格式发送数据

1 个答案:

答案 0 :(得分:1)

感谢帮助人员。事实证明这是一个奇偶校验错误。串行端口在通过用户属性分配时不接受Parity.None,即使在转换为奇偶校验类型时也是如此。这是默认的Parity.Even(尽管MSDN说None是默认的?)。我最终做的是将属性设置为应用程序并让用户在两个可接受的集合之间切换,而不是自由运行端口设置。这似乎解决了这个问题,我在本机串口和转换器上都没有奇偶校验错误。

正如马库斯建议的那样,让我感到惊讶的是将ParityReplace设置为另一个角色。在那时,很明显这是一个奇偶校验错误。我仍然不确定为什么我使用的SerialMon程序获得相同的结果,即使奇偶校验设置为无。

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

再次感谢大家的帮助。