如何写入COM端口并等待回复c#

时间:2012-09-06 21:21:36

标签: c# serial-port

我需要将命令发送到串行端口以与Enfora调制解调器通信。对于每个命令,我都会收到回复,但回复字符串的长度可能会有所不同。 我需要知道如何写,然后等待回复,直到它完成...

所以我想创建一个从串口读取的线程,程序只写...

线程功能

private void thread_Handler()
{
    while(true)
        this.read();
}
private void read()
{
    if (this.rtbMessages.InvokeRequired)
    {
        try
        {
            SetTextCallback d = new SetTextCallback(read);
            this.Invoke(d);
        }
        catch{}
    }
    else
    {
        readBuffer = serialPort.ReadExisting();
        rtbMessages.AppendText(readBuffer);
    }
}

所以这个线程总是试图从com PORT读取并以这种方式发送消息

writeBuffer = "COMMAND 1";
serialPort.Write(writeBuffer);
writeBuffer = "COMMAND 2";
serialPort.Write(writeBuffer);

但是我没有收到我用Write()发送的第二个命令的回复... 我尝试删除线程并在每次Write()之后使用ReadExisting(),但这也不起作用。

我能让它发挥作用的唯一方法是添加

System.Threading.Thread.Sleep(1000);

每次调用Write之后,我都会收到每个Write()命令的所有回复... 但是我不想使用它,我想知道另一种方法来有效地写入并从我发送的每个命令获得每个回复,而不管回复字符串的长度以及我收到回复消息需要多长时间。

有时我会一直收到消息,直到我发送另一个命令来停止生成消息。

谢谢!

2 个答案:

答案 0 :(得分:1)

.Net将为您完成所有这些。

只需创建一个SerialPort并订阅其DataReceived事件即可。 (请注意,在某些情况下,您可能需要将以这种方式接收的几个数据块拼接在一起以组装完整的数据包,但如果它是调制解调器命令的简短回复,您可能会发现/通常每次引发事件时都会获得完整的数据包。

答案 1 :(得分:0)

使用事件接收数据。

以下是DreamInCode的示例(您必须根据您的特定需求对其进行自定义):

/// <summary>
/// This method will be called when there's data waiting in the comport buffer
/// </summary>
void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    //determine the mode the user selected (binary/string)
    switch (CurrentTransmissionType)
    {
        //user chose string
        case TransmissionType.Text:
            //read data waiting in the buffer
            string msg = comPort.ReadExisting();
            //display the data to the user
            DisplayData(MessageType.Incoming, msg + "\n");
            break;
        //user chose binary
        case TransmissionType.Hex:
            //retrieve number of bytes in the buffer
            int bytes = comPort.BytesToRead;
            //create a byte array to hold the awaiting data
            byte[] comBuffer = new byte[bytes];
            //read the data and store it
            comPort.Read(comBuffer, 0, bytes);
            //display the data to the user
            DisplayData(MessageType.Incoming, ByteToHex(comBuffer) + "\n");
            break;
        default:
            //read data waiting in the buffer
            string str = comPort.ReadExisting();
            //display the data to the user
            DisplayData(MessageType.Incoming, str + "\n");
            break;
    }
}

http://www.dreamincode.net/forums/topic/35775-serial-port-communication-in-c%23/