读取不同长度的UART

⚠️
大家好. .感谢来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台的过程中,它将提供更好的功能,并包含在主对话网站。所有的帖子和账号已经迁移。我们现在只接受新论坛的流量-请发布任何新的帖子在//www.xmece.com/support.我们会在接下来的几天修复bug /优化搜索和标记。
4个职位/ 0个新职位
最后发表
dx3gerst
离线
最后看到:4年20小时前
加入:2017-03-29 35
读取不同长度的UART

嗨,对话框中,

从我的传感器读取不同长度的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例程。
所以你能告诉我如何处理这个问题吗?

谢谢

设备:
MT_dialog
离线
最后看到:5个月2个星期前
工作人员
加入:2015-06-08 34
嗨dx3gerst,

嗨dx3gerst,

我没有看到你粘贴的代码有任何错误,ad_uart_read()将阻塞任务,直到它从UART获得数据量,所以只要你从传感器发送6个字节,任务应该解除阻塞。如果它不工作,那么可能设备已经进入睡眠模式,无法从UART接收任何数据?您是否尝试过在不使用任何睡眠模式的情况下测试代码?您确定传感器会发送您所期望的额外的6字节数据吗?

由于MT_dialog

dx3gerst
离线
最后看到:4年20小时前
加入:2017-03-29 35
嗨,对话框中,

嗨,对话框中,

谢谢你的回答。我的代码是基于ble_multi_link演示。我不认为有任何睡眠模式实现。睡眠模式的代码分别放在注释中

/*设置所需的休眠模式。*/
/ / pm_set_wakeup_mode(真正的);
/ / pm_set_sleep_mode (pm_mode_extended_sleep);

所以设备应该一直处于主动模式,对吧?
是的,我检查了由传感器与终端工具发送的字节,它确切地发送10字节,其中包括4“标准字节”,我总是接收和6额外字节。

有没有其他方法来实现这个功能?

谢谢!

MT_dialog
离线
最后看到:5个月2个星期前
工作人员
加入:2015-06-08 34
嗨dx3gerst,

嗨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