读取串行端口的事件处理程序永远不会触发

时间:2018-06-25 06:56:48

标签: c# console-application

目标:

尝试将字符串写入串行端口,读取它,然后将其打印到控制台

代码:

// for waiting until event is detected
private static ManualResetEvent waitHandle = new ManualResetEvent(false);

public Driver()
{
    // create new serial port
    comPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
    // add event handler
    comPort.DataReceived += new SerialDataReceivedEventHandler(comPort_DataReceived);  
    // configure port
    comPort.DtrEnable = true;
    comPort.RtsEnable = true;
    comPort.ReadTimeout = 3000;
    // open port          
    comPort.Open();

    // send string through port
    string command = "test \n";
    byte[] MyMessage = System.Text.Encoding.UTF8.GetBytes(command);
    comPort.Write(MyMessage, 0, MyMessage.Length);

    // wait until event is detected
    waitHandle.WaitOne();
}

private void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    // Write data to buffer and stop wait
    Console.WriteLine(comPort.ReadExisting());
    waitHandle.Set();
}

问题:

写入串行似乎可以正常工作(confirmed by using Serial Port Monitor),但从未调用过“ comPort_DataReceived”

如果我更改代码并添加

while(true)
{
    Console.WriteLine(comPort.ReadExisting());
}

“ comPort.Write(MyMessage,0,MyMessage.Length);”之后行,以便我进行轮询而不是等待事件处理程序,然后没有编写任何内容

如果我尝试通过这种方式进行轮询

while (true)
{
    Byte[] buf = new Byte[2048];
    comPort.Read(buf, 0, 2048);
    Console.WriteLine(buf.ToString());
}

它只是超时(System.TimeoutException:“该操作已超时。” )。

我不确定我要去哪里/为什么不能从串行端口读取

2 个答案:

答案 0 :(得分:1)

好的,从我看来,好像没有设备在串行端口上监听。然后,如果您将某些内容写入串行端口,并不意味着将出现与接收到的数据相同的数据。该数据为outgoing data。如果要接收数据,则必须将另一个设备连接到该串行端口并发送数据,以作为对写入数据的响应。

答案 1 :(得分:0)

原来是硬件问题(没有设备正在向串行端口写入数据),加上误解(认为我可以写入串行端口,然后再读取同一程序中写入的内容)