2014-06-24 85 views
0

我不完全确定这是否这是我的代码或硬件问题的问题。串行通信,问题使用本地COM端口与多产usb->串行

我有一个程序,与某些设备(火灾报警控制面板是特定的)进行单向通信(只接收)。当我编写程序时,它是在没有本地串行端口的PC上完成的,所以我使用了一个多产的串口 - > USB加密狗。它的工作,大部分。我偶尔会得到一个随机3F /?在数据连接到两种类型的FACP时,我认为这只是转换器的动作,所以我只是将它们从输出中剥离出来。

然后我将它移植到一些工作笔记本电脑上,这些工作笔记本电脑是戴尔的本地通信端口。而现在我的数据乱七八糟(大多数是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形式向外发送数据

+0

在您设置的端口是零停止位?如果是这样就不标准。枚举帮助指出它不受支持。通常它是1 1.5或2 –

+1

对不起,这是我在帖子中的错误。制造商(和程序)规格为9600波特,8个数据位,1个停止位,奇偶校验无。 –

+0

即使规格说8,1,没有,我会尝试这些端口设置的变化,看看会发生什么。这是一段很长的时间......确切的说是20年,但我似乎记得在恶劣的端口设置下看到类似的结果。 (Procomm Plus for Windows的预发布版本实际上在端口设置不好时会吃掉字符。) – Markus

回答

1

感谢您的帮助球员。事实证明,这是一个奇偶校验错误。串行端口在通过用户属性分配时不接受Parity.None,即使在转换为Parity类型时也是如此。这是默认的Parity.Even(尽管MSDN说None是默认值?)。我最终做的是将属性设置为应用程序,并让用户在两个可接受的设置之间切换,而不是自由运行端口设置。这似乎解决了这个问题,并且我在本地串行端口和转换器上都是无奇偶校验错误的。正如马库斯所建议的那样,让ParityReplace成为另一个角色的原因是什么。在那一点上,很明显这是一个奇偶错误。我仍然不确定为什么我使用的SerialMon程序获得了相同的结果,即使将奇偶校验设置为无。

仅供参考,ErrorReceived在任何时候都不会引发。

再次感谢大家的帮助。