C#.Net Serial DataReceived对于高速率数据,事件响应太慢

Mat*_*hew 6 .net c# events serial-port baud-rate

我已经在VS2008 express中使用基于表单的程序设置了一个SerialDataReceivedEventHandler.我的串口设置如下:

115200,8N1

Dtr和Rts启用

ReceivedBytesThreshold = 1

我有一个设备,我通过BlueTooth,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);
    }
Run Code Online (Sandbox Code Playgroud)

小智 6

您是否尝试调整USB串行转换器的时间延迟?我遇到了与FTDI USB转串口转换器相同的问题.我使用示波器查看来自设备的IN和OUT数据,我可以看到计算机响应总是很慢.默认情况下,设备上的时间延迟设置为16毫秒.我将它改为2毫秒,这有很大的不同.在设备管理器中转到USB串行转换器,在高级设置中,将延迟时间更改为2毫秒.它应该有效.试试吧.


Hen*_*man 3

为什么要 Invoke() 调用 DisplayResults?

这会将其推送到 MessageLoop,这是不必要的延迟。

如果 DataReceived() 将数据推送到(线程安全)队列以进行解耦处理,那就更好了。

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