嗨,对话框中,
从我的传感器读取不同长度的uart消息有一个问题。接收到的UART的标准长度是4字节,但有时我会收到10字节的消息。
输入数组的第3字节和第4字节是数据计数器,只有当输入数组的长度大于4字节时才不等于零。
所以我的方法是总是通过命令读取长度为4字节的内容:
uart_buf [4];
uart_buf_long [6];
...
ad_uart_read(dev, uart_buf, 4, OS_EVENT_FOREVER);
然后我检查dataccounter -bytes:
If (uart_buf[2] !=0 || uart_buf[3] !=0){
ad_uart_read (dev uart_buf_long 6, OS_EVENT_FOREVER);
}
因此,第一部分读取4字节工作得很好,但万一我得到10字节的uart消息,我将陷入第二个ad_uart_read例程。
所以你能告诉我如何处理这个问题吗?
谢谢
设备:
嗨dx3gerst,
我没有看到你粘贴的代码有任何错误,ad_uart_read()将阻塞任务,直到它从UART获得数据量,所以只要你从传感器发送6个字节,任务应该解除阻塞。如果它不工作,那么可能设备已经进入睡眠模式,无法从UART接收任何数据?您是否尝试过在不使用任何睡眠模式的情况下测试代码?您确定传感器会发送您所期望的额外的6字节数据吗?
由于MT_dialog
嗨,对话框中,
谢谢你的回答。我的代码是基于ble_multi_link演示。我不认为有任何睡眠模式实现。睡眠模式的代码分别放在注释中
/*设置所需的休眠模式。*/
/ / pm_set_wakeup_mode(真正的);
/ / pm_set_sleep_mode (pm_mode_extended_sleep);
所以设备应该一直处于主动模式,对吧?
是的,我检查了由传感器与终端工具发送的字节,它确切地发送10字节,其中包括4“标准字节”,我总是接收和6额外字节。
有没有其他方法来实现这个功能?
谢谢!
嗨dx3gerst,
是的,如果你注释掉这些函数,那么设备将不会进入睡眠模式,尽管,建议是设置pm_set_sleep_mode(pm_mode_active);并且pm_set_wakeup_mode(true)与设备的睡眠无关,而是与唤醒过程有关,所以它不会影响你的代码。
我没有看到任何错误的代码,我也尝试了它在我的一边,我可以开始BLE活动通过等待10字节从UART使用下面的代码在system_init()函数:
dev = ad_uart_open (SERIAL2);
char uart_buf [4];
char uart_buf_long [6];
ad_uart_read(dev, uart_buf, 4, OS_EVENT_FOREVER);
If (uart_buf[2] !=0 || uart_buf[3] !=0){
ad_uart_read (dev uart_buf_long 6, OS_EVENT_FOREVER);
}
也许您可以尝试逐个从senosr获取字节,并检查它是否工作,但无论如何,您都必须调试它,以检查为什么会发生这种情况。
由于MT_dialog