我不完全确定这是否这是我的代码或硬件问题的问题。串行通信,问题使用本地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形式向外发送数据
在您设置的端口是零停止位?如果是这样就不标准。枚举帮助指出它不受支持。通常它是1 1.5或2 –
对不起,这是我在帖子中的错误。制造商(和程序)规格为9600波特,8个数据位,1个停止位,奇偶校验无。 –
即使规格说8,1,没有,我会尝试这些端口设置的变化,看看会发生什么。这是一段很长的时间......确切的说是20年,但我似乎记得在恶劣的端口设置下看到类似的结果。 (Procomm Plus for Windows的预发布版本实际上在端口设置不好时会吃掉字符。) – Markus