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>
想法?
您可以做一个小型状态机。对于接收到的每个字节,如果它不是换行符,则将其添加到“当前字符串”数据中。
如果是换行符,则触发“new-data”;事件。
如果您检测到“当前字符串”等于预期的“shell 提示符”,则触发“new-data”事件。
依次对接收到的每个字节执行该处理。当然,这并不能阻止您立即从端口读取所有可用字节。
| 归档时间: |
|
| 查看次数: |
720 次 |
| 最近记录: |