我有一个运行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>
想法?
我有一个类foo,一个源自bar的食物的类,我在foo中有一个方法需要另一个foo
boolean baz(foo c)
{
return (condition)?true:false;
}
Run Code Online (Sandbox Code Playgroud)
我想为baz编写一个重载,它接受一个Vector并在所有这些上调用baz - 类似于
boolean baz(Vector<foo> v)
{
for(int i=0;i<v.size();++i)
{
if baz(v.get(i))
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
我想在矢量栏上使用调用此方法.我尝试按照我刚刚概述的方式编写这个,当我尝试在bar的向量上调用此方法时,我遇到编译器错误.
我错过了什么?