我有一个非常奇怪的问题,即在 Windows 8 上的 C# VS2010 中的某些情况下 DataReceived 事件没有触发,尽管目标机器是 win 7 或 XP。
我正在编写一个应用程序来替换一个非常旧的 DOS 应用程序,该应用程序与一个非常旧但仍然是当前使用串行端口报告的监控设备通信。我没有现成的设备访问权限,所以我编写了一个模拟器,让它在另一台 PC 上运行。一切正常,直到我尝试使用真正的设备。
所以串行设置是
1200 波特 7 位奇校验 1 个停止位 无握手
代码基本上如下
namespace ProjectNamspace
{
class SerialCom
{
static SerialPort ComPort;
public SerialCom(SerialCallback callBack, string portName)
{
_comPort = new SerialPort();
_comPort.PortName = portName;
_comPort.BaudRate = 1200;
_comPort.Parity = Parity.Odd;
_comPort.StopBits = StopBits.One;
_comPort.DataBits = 7;
_comPort.Handshake = Handshake.None;
// _comPort.ReadBufferSize = 1;
_comPort.ReadTimeout = 500;
_comPort.WriteTimeout = 500;
_comPort.NewLine = "\r";
_comPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
CallBack = new SerialCallback(callBack);
}
private void DataReceivedHandler(
object sender,
SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
byte data;
while (_comPort.BytesToRead > 0)
{
data = (byte)_comPort.ReadByte();
CallBack(data);
}
}
}
}
如果数据来自另一台 PC,我的应用程序可以完美运行。
如果数据来自硬件并以 teraterm 显示,则它可以完美运行。
如果数据来自硬件到我的应用程序,则不会发生任何事情。
如果我在事件处理程序中设置断点,它永远不会被调用,但如果数据来自另一台 PC,它仍然有效。
此后我再次尝试,这一次我的电脑运行缓慢,由于某种原因它工作正常,除了每个其他字符都是问号 0x3F。
现在数据协议非常简单。连续重复一个 7 个字符的数据包,直到收到一个确认字符。数据包以每秒 1 个数据包的速率重复,因此永远不会丢失流量,因此不需要握手。
数据包采用ascii 代码 0x1412348A<DC4>
的形式。<DC4>
我在串行数据线上放了一个示波器,所见即所得。
在这一点上,我唯一的结论是 .NET 串行驱动程序可能不喜欢 1200 波特或 7 位。或者它不喜欢这个<DC4>
角色。有谁知道在这些古老的历史端口设置中 .NET 串行驱动程序存在问题。
我想通过使用旧的 MsComm active x 控件来证明一点,但找不到任何不是 .NET 的文档,所以如果有人能指出我正确的方向或回答上述问题,我将不胜感激