C#如何将串行输入数据放入队列并使用backgroundworker查询

C#如何将串行输入数据放入队列并使用backgroundworker查询,c#,queue,serial-port,buffer,backgroundworker,C#,Queue,Serial Port,Buffer,Backgroundworker,我需要从串行端口获取传入数据,将“ReadExisting”字符串放入队列中,然后将其返回到用户界面中 在de que过程中,我将格式化传入字符串以删除不需要的字符,添加换行符(传入字符串中没有EOL字符)等,并将字符串的各个部分发布到多个控件(列表框、文本框)中以供查看 这就是我从传入数据创建字符串(RxString)的能力: private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataRece

我需要从串行端口获取传入数据,将“ReadExisting”字符串放入队列中,然后将其返回到用户界面中

在de que过程中,我将格式化传入字符串以删除不需要的字符,添加换行符(传入字符串中没有EOL字符)等,并将字符串的各个部分发布到多个控件(列表框、文本框)中以供查看

这就是我从传入数据创建字符串(RxString)的能力:

 private void serialPort1_DataReceived(object sender,
System.IO.Ports.SerialDataReceivedEventArgs e)     
 {         
 RxString = serialPort1.ReadExisting();         
 this.Invoke(new EventHandler(DisplayText));     
 } 
我能够获取传入的数据,但当我尝试格式化并显示它时,一些传入的数据会丢失或丢失,或者出现一些文本无法读取的情况。如果我不格式化文本并将其直接发送到列表框中,那么数据都在那里,但由于所有额外的代码字符而不可用


我想使用backgroundworker处理(DisplayText),这样串行数据就可以进入队列,这样在backgroundworker处理将信息放在屏幕上时就不会丢失。除非有更好的办法

我假设数据一次只有一行,因此您可以始终使用
队列
-类并使用方法
排队
添加传入数据

要从后台工作程序中获取项目,只需使用
Dequeue

这里有一个指向MSDN文章的链接,该文章关于
队列
-类

例如:

private Queue<string> data = new Queue<string>();

private void Rx_GetData(e)
{
    var rxString = e.ReadExisting();
    data.Enqueue(rxString);   
}

private void BackgroundWorker_DoWork()
{
    while(rxConn.IsConnected) // Haven't worked with serial connections, so I don't know the proper property here..
    {
        if(data.Count > 0)
        {
            var str = data.Dequeue();
            FormatString(str);
        }
        Thread.Sleep(10);
    }
}
专用队列数据=新队列();
私有无效接收数据(e)
{
var rxString=e.ReadExisting();
data.Enqueue(rxString);
}
私人空间后台工作人员
{
while(rxConn.IsConnected)//未使用串行连接,因此我不知道此处的正确属性。。
{
如果(data.Count>0)
{
var str=data.Dequeue();
格式化字符串(str);
}
睡眠(10);
}
}

无需在标题前加上“C”。这就是标记的用途。非常不清楚,您没有发布执行实际格式设置的代码,因此包含错误。通常,在调用之前首先组装整个响应是非常重要的,ReadExisting()在不调试时通常只返回一到两个字符。尽可能利用ReadLine()。串行端口的末尾是什么?它使用什么协议?JohnSaunders-谢谢,它已经是我的一个标签了,所以我不知道我必须是reundant,但添加了它。有道理。汉斯,这不是虫子。这与数据的输入速度比应用程序的格式化速度快有关,并返回以捕获新的输入数据。无论如何,我想我已经解决了。我将使用一个队列来捕获所有传入的数据,而不考虑其他事件,然后根据需要将每个数据出列并格式化为FIFO。ReadLine无法工作,因为没有发送下线字符-端口从不报告行尾记录。NoLifeKing-正常呼叫。事实上,在过去几周的搜索中,我隐晦地发现了这种方法,但做了一些测试,似乎这会起作用。thx.@NoLifeKing C#是否有效地处理了常规后台工作中的无限循环?我没有C#方面的经验,但我会避免不断使用CPU资源的无限循环。@Jeff我刚刚添加了无限循环作为占位符,为了提高性能,您应该用检查连接是否仍然打开和线程来替换
true
。睡眠(10)不要占用系统所有的资源。@NoLifeKing谢谢你继续我的教育!我想我使用while(data.Count>0)并让函数退出。然后,当更多数据排队时,再次启动该函数。这样做有什么问题吗?@Jeff,我不确定后台工作人员是如何工作的,但这种方法也可能是一种好方法。我将在本地试验后台工作人员的工作方式,然后编辑代码。