gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:46:44 26 4
gpt4 key购买 nike

我有一个运行 Linux 的嵌入式设备,我可以通过 RS232 与之通信。我试图从现有的 .NET 应用程序中以编程方式控制它,所以我一直在玩弄 System.IO.Ports.SerialPort类(class)。我现在正在使用 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);
}
}
}

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

我正在寻找的是一种简单、高效、多线程的方式来处理行片段 byte[]string根据行整齐地组织的 s。我的一个想法是让另一个线程无限循环,这将出列 byte[] s 从队列中,将它们变成 string s,将它们附加到 StringBuilder , 然后拆分 stringStringBuilder.ToString() 返回沿着newlines , 获取最后一个字符串并用它来构造一个新的 StringBuilder下一次,然后将所有其他字符串排入 Queue<string> -- 这样,片段会重新组合在一起...但这在所有最重要的情况下都行不通,也就是当我等待找到 shell 提示符时,因为该字符串永远不会被放置进入第二个队列。

想法?

最佳答案

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

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

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

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

关于c# - 在 C# 中处理来自串行线路的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7080371/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com