如何从串行端口C#接收更多消息

时间:2019-12-04 11:19:46

标签: c# serial-port

我正在使用System.IO.Ports。 我向设备发送消息,并希望等待来自设备的所有消息。

我正在尝试这样做:

message = Console.ReadLine();
_serialPort.Write(message);
Console.WriteLine(_serialPort.ReadExisting());

但是它仅返回第一行。 我尝试使用port.BytesToRead,但得到的结果相同。 当我使用ReadLine()时,它什么也不会返回。

编辑:

要查看所有行,请使用事件处理程序。

我的问题的解决方案是在最后一行使用\ r(输入)。

2 个答案:

答案 0 :(得分:2)

ReadExisting返回确切时间的可用字节,在读取缓冲区之前要延迟一下,解决方法是

message = Console.ReadLine();
_serialPort.Write(message);
Thread.Sleep(200);
Console.WriteLine(_serialPort.ReadExisting());

编辑2: 这是我在项目中的操作方式

private SerialPort port;
string DataReceived  = string.Empty;

public string OpenPort(string PortName, int BaudRate)
    {
        // if the port is already used by other window then return the same instance
        if (port != null)
            if(port.IsOpen)
                return "True";


        port = new SerialPort(PortName, BaudRate, Parity.None, 8, StopBits.One);

        // Attach a method to be called when there
        // is data waiting in the port's buffer
        port.DataReceived += new
            SerialDataReceivedEventHandler(port_DataReceived);

        // Begin communications
        try
        {
            port.Open();
        }
        catch(Exception ex)
        {
            return ex.Message;
        }
        return "True";
    }


private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
Thread.sleep(200);
            DataReceived =  port.ReadExisting();
        }

在主屏幕上

message = Console.ReadLine();
_serialPort.Write(message);
//use Stopwatch to calculate time befor you can exit from the loop
while(true)
{
if(!string.IsNullOrWhiteSpace(DataReceived))
break;
// Todo : Check stopwatch for timeout
}

答案 1 :(得分:0)

也许您的串行设备可能遇到了换行问题,请尝试:

message = Console.ReadLine();
_serialPort.WriteLine(message);
Console.WriteLine(_serialPort.ReadExisting()); # try debug here replace with string test = _serialPort.ReadLine();