从串口读取不同大小的字符串

时间:2014-08-22 15:48:10

标签: c# winforms serial-port arduino

我正在通过串口通信从arduino读取C#中的字符串。我正在使用ReadLine()为传入数据设置字符串。但是,我注意到ReadLine()减慢了我的数据接收速度,当使用控制台时,我可以看到在接收数据和输出数据之间开始出现延迟。

问题

当字符串的大小可变时,是否有快速的方法从串行读取到一个字符串?我需要能够处理字符串,重要的是我不会在读取之间丢失数据。我的数据使用格式<ID,Name,Data>,每个格式都在各自的行上。有什么方法可以在<>之间阅读吗?

当前代码

private void Form1_Shown(object sender, EventArgs e)
    {
            serialPort1 = new SerialPort(comboPorts.SelectedItem.ToString(), 115200);
            serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
            serialPort1.Open();
    }

    private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    { 
        string inData = serialPort1.ReadLine();
        Console.WriteLine(inData);

}

1 个答案:

答案 0 :(得分:2)

从串行连接读取数据时发出DataReceived事件,当您收到事件时,您应该从缓冲区中读取所有可用数据。

我的猜测是因为你调用ReadLine而发生减速,但缓冲区中有多行。在添加更多数据之前,您不会读取第二行。 (即第3,第4或第5行)你经常落后。

也许你可以重新设计一个线程来读取行,而不是从事件中读取。

private void Form1_Shown(object sender, EventArgs e)
{
    serialPort1 = new SerialPort(comboPorts.SelectedItem.ToString(), 115200);

    serialPort1.Open();
    Thread t = new Thread(ReadThread);
    t.Start(serialPort1);
}

private void ReadThread(object context)
{
    SerialPort serialPort = context as SerialPort;

    while (serialPort.IsOpen)
    {
        string inData = serialPort.ReadLine();
        Console.WriteLine(inData);
    }
}