我有一个非常奇怪的问题,在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个数据包的速率重复,因此不会丢失流量,因此不需要握手。
数据包的格式为12348A<DC4>
其中<DC4>
是ascii代码0x14。
我已将示波器放在串行数据线上,我所看到的就是我所期望的。
此时我唯一的结论是.NET串行驱动程序可能不喜欢1200波特或7位。
或者它可能不喜欢<DC4>
字符。
有没有人知道在这些古老的历史端口设置中.NET串行驱动程序的问题。
我想通过使用旧的MsComm活动x控件证明一点,但找不到任何非.NET的文档,所以如果有人能指出我正确的方向或回答上述我会很感激