我已经在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);
}
答案 0 :(得分:5)
您是否尝试调整USB串行转换器的时间延迟?我遇到了与FTDI USB转串口转换器相同的问题。我使用示波器查看来自设备的IN和OUT数据,我可以看到计算机响应总是很慢。默认情况下,设备上的时间延迟设置为16毫秒。我将它改为2毫秒,这有很大的不同。在设备管理器中转到USB串行转换器,在高级设置中,将延迟时间更改为2毫秒。它应该有效。试试吧。
答案 1 :(得分:3)
为什么要调用()调用DisplayResults?
这会将它推送到MessageLoop,这是一个不必要的延迟。
如果DataReceived()将数据推送到(线程安全的)队列以进行解耦处理,那会更好。
我也认为你可能遇到拆分包的问题。
答案 2 :(得分:2)
问题在于收到的数据处理程序。
我使用while(true)
循环和serial.ReadLine()
运行了一个单独的主题,一切都运行良好。
using System.Threading;
Thread readThread = new Thread(Read);
readThread.Start();
希望别人不需要花3个小时来解决这个问题。
答案 3 :(得分:1)
您可以尝试设置 ReceivedBytesThreshold = 22 ,这将导致在至少有22个字节要读取时触发事件。请注意,它至少是 22.可能还有更多。
我认为我不会亲自这样做,因为如果您的数据包大小将来会发生变化,例如12个字节会发生什么?您最终会在缓冲区中使用12个字节,但根本不会触发事件。
最好将其设置为1,这将在至少 1个字节可用时触发事件。然后将所有收到的字节推送到Henk已发布的列表或队列中。
请注意,DataReceivedEvent当然不知道您认为数据包的内容。它只是在有可用字节时触发。由开发人员将这些字节组装成有意义的消息或数据包。