C#.Net串行数据接收到的事件响应对于高速数据来说太慢

C#.Net串行数据接收到的事件响应对于高速数据来说太慢,c#,.net,events,serial-port,baud-rate,C#,.net,Events,Serial Port,Baud Rate,我已经使用VS2008 express中基于表单的程序设置了一个SerialDataReceiveDevenHandler。我的串行端口设置如下: 115200,8N1 Dtr和Rts已启用 ReceivedBytesThreshold=1 我有一个通过蓝牙、USB到串行接口的设备。超级终端以任意数据速率接收数据。数据以22字节长的数据包定期发送。此设备具有可调整的数据发送速率。在10-20Hz的低数据速率下,下面的代码工作得很好,没有问题。但是,当我将数据速率提高到25Hz以上时,一次呼叫就开

我已经使用VS2008 express中基于表单的程序设置了一个SerialDataReceiveDevenHandler。我的串行端口设置如下:

115200,8N1

Dtr和Rts已启用

ReceivedBytesThreshold=1

我有一个通过蓝牙、USB到串行接口的设备。超级终端以任意数据速率接收数据。数据以22字节长的数据包定期发送。此设备具有可调整的数据发送速率。在10-20Hz的低数据速率下,下面的代码工作得很好,没有问题。但是,当我将数据速率提高到25Hz以上时,一次呼叫就开始接收多个数据包。我的意思是,每个传入的数据包都应该有一个事件触发器。对于更高的输出速率,我在调用事件时立即测试了缓冲区大小(BytesToRead命令),然后缓冲区中有多个数据包。我认为事件触发得很慢,当它到达代码时,更多的包已经到达缓冲区。我做的一个测试是看事件每秒触发多少次。在10Hz时,我得到10个事件触发器,太棒了。在100Hz时,我会得到40个事件触发器,这不太好。我的数据速率目标是100HZ是可接受的,200Hz是首选的,300Hz是最佳的。这应该是可行的,因为即使在300Hz下,也只有52800bps,不到设置的115200波特率的一半。我有什么要看的吗

    public Form1()
    {
        InitializeComponent();
        serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);            
    }


    private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        this.Invoke(new EventHandler(Display_Results));
    }


    private void Display_Results(object s, EventArgs e)
    {
        serialPort1.Read(IMU, 0, serial_Port1.BytesToRead);
    }
为什么要调用()调用DisplayResults

这将把它推到MessageLoop,这是一个不必要的延迟

如果DataReceived()将数据推送到(线程安全的)队列中进行解耦处理,效果会更好

我还认为您可能会遇到拆分包的问题

您可以尝试设置ReceivedBytesThreshold=22,这将导致在至少有22个字节要读取时触发事件。请注意,它将至少为22。可能还有更多

但我个人不认为我会这样做,因为如果您的数据包大小在将来发生变化,例如变为12字节,会发生什么情况?最终,缓冲区中会有12个字节,但根本不会触发事件

最好将其设置为1,这将在至少有1个字节可用时触发事件。然后将所有接收到的字节推送到列表或队列中,就像Henk已经发布的那样


注意,数据接收者对你认为的数据包当然一无所知。它只是在有可用字节时触发。由开发人员将这些字节组合成有意义的消息或数据包。

您是否尝试调整USB串行转换器的时间延迟?我的FTDI USB到串行转换器也有同样的问题。我用示波器查看来自设备的输入和输出数据,我可以看到计算机的响应总是很慢。默认情况下,设备上的时间延迟设置为16毫秒。我将其更改为2毫秒,这会产生很大的差异。转到设备管理器中的USB串行转换器,在高级设置中,将延迟时间更改为2毫秒。它应该可以工作。试试看。

问题在于接收的数据处理程序

我使用
while(true)
循环和
serial.ReadLine()
运行了一个单独的线程,所有这些都可以完美地工作

using System.Threading;

Thread readThread = new Thread(Read);
readThread.Start();
希望其他人不需要花费3个小时来修复此问题。

我尝试删除Invoke()调用,并在DataReceived()事件中直接读取数据,结果相同。很抱歉有点天真,但是你能告诉我更多关于你是如何排队的以及为什么排队更快吗。谢谢你的帮助。你知道为什么“16ms”延迟会在收到的数据束之间转换成数百毫秒吗?