在C#中处理来自串行线的文本

Ale*_*see 6 c# regex string serial-port

我有一个运行Linux的嵌入式设备,我可以通过RS232与之通信.我正在尝试以编程方式从现有的.NET应用程序中控制它,所以我一直在搞乱这个System.IO.Ports.SerialPort类.我现在通过使用SerialPortDataRecieved事件处理程序并检查要读取的字节数来读取端口上的数据,然后传入一个byte[]大小,然后将其推byte[]送到Queue<byte[]>进一步处理中,如下所示:

public class SerialTalk{
SerialPort s;    
Queue<byte[]> RecQueue=new Queue<byte[]>;
//...bunch of irrelevant stuff here (ctors etc)
   private void DataReceivedHandler(Object sender, SerialDataReceivedEventArgs e)
   {
        byte[] recv;
        lock (s_lock)
        {
            int bytes = s.BytesToRead;
            recv = new byte[bytes];
            s.Read(recv, 0, bytes);
        }

        Console.Write(recv);
        lock (RecQueue)
        {
            RecQueue.Enqueue(recv);
        }
   }
}
Run Code Online (Sandbox Code Playgroud)

然后另一个线程从该队列中读取以执行处理,打印到终端等.这一直非常适合打印,但我希望能够正则表达我正在检索的数据.问题是,返回的字节数SerialPort是不可预测的,完全不知道它发送的是什么信息,所以我得到的数据块通常是行的片段.

我正在寻找的是一种简单,高效,多线程的方式,从线段byte[]strings,根据线条整齐地组织.我的一个想法就是让另一个线程无限循环,将byte[]队列中的队列从队列中取出,将它们转换为strings,将它们附加到a StringBuilder,然后沿着它string返回分离,取LAST字符串并使用它来构造一个新的for下一次,然后将所有其他字符串排成一个- 这样,片段就会被重新组合在一起......但这在最重要的情况下是行不通的,就在我等待的时候shell提示符,因为该字符串不会被放入第二个队列.StringBuilder.ToString()newlinesStringBuilderQueue<string>

想法?

Kie*_*one 4

您可以做一个小型状态机。对于接收到的每个字节,如果它不是换行符,则将其添加到“当前字符串”数据中。

如果是换行符,则触发“new-data”;事件。

如果您检测到“当前字符串”等于预期的“shell 提示符”,则触发“new-data”事件。

依次对接收到的每个字节执行该处理。当然,这并不能阻止您立即从端口读取所有可用字节。