如何解决有没有办法线性同步监听USB端口?
我正在一个项目中,试图在我的计算机和Arduino之间建立通信。 Ardunio从电子组件接收数据,并通过USB以自定义协议将其发送到计算机。该协议很简单,消息的开始/结束字符,固定的数据包长度和实际的消息长度存储在第一个字节中。驱动程序仅接受正确格式的字节数组,如果存在格式异常,则由程序处理(详细信息不在此问题的范围之内)。
当接收到数据包时,它们会排队进入队列。有两个线程使用此队列。因此,为了防止异常,必须在(en / de)排队时将其锁定。如果在锁定队列的同时收到多个数据包,据我所知,这些数据包可能未按正确的顺序排队。
这种设计的原因是我需要线性(同步)处理数据包;例如在处理第一个数据包之前不会开始处理第二个数据包。
所以我在想,这种设计可能很糟糕,并且有更好的方法。你能给我一些提示吗?
-代码
class Serial
{
public SerialPort serialPort;
public AdvQueue<byte> Buffer = new AdvQueue<byte>();
private void SerialDataReceived(object s,object e)
{
for (int i = 0; i < serialPort.BytesToRead; i++)
{
Buffer.Enqueue((byte)serialPort.ReadByte());
}
}
public Serial(SerialPort serialPort)
{
this.serialPort = serialPort;
this.serialPort.DataReceived += SerialDataReceived;
AppDomain.CurrentDomain.ProcessExit += ((s,e) => { this.serialPort.Close(); });
this.serialPort.Open();
}
}
这里AdvQueue基本上等同于并发队列的手动实现(由snus74提到)。
public Task HandleIncomingData()
{
return Task.Run(() =>
{
while (true) // I know,it's a quick and dirty while loop isn't it :D
{
Thread.Sleep(1);
if (serial.Buffer.AvailableCount() >= Packet.PacketLength)
{
Packet packet = TryParseToPacket(serial);
if (packet != null)
{
// Handle the packet...
}
else
{
serial.Buffer.GetNext(); // Dequeues an element.
}
}
}
});
}
这是一个在后台运行的任务,它试图解析缓冲的数据。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。