读有不同长度的UART

⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
4个帖子/ 0新
最后一篇
DX3Gerst.
离线
最后一次露面:4年2天前
加入:2017-03-29 13:35
读有不同长度的UART

嗨对话框,

阅读来自传感器的不同长度的UART消息存在问题。接收UART的标准长度为4字节,但有时我将收到10个字节的消息。
输入阵列的字节3和4是DataCounter,其在输入阵列长于4字节的情况下仅在零中而不是等于零。

因此,我的方法是通过命令始终读取4个字节的长度:

UART_BUF [4];
UART_BUF_LONG [6];

......
AD_UART_READ(DEV,UART_BUF,4,OS_EVENT_FOREVER);

然后我检查datacounter-bytes:
if(uart_buf [2]!= 0 || UART_BUF [3]!= 0){
AD_UART_READ(DEV,UART_BUF_LONG,6,OS_EVENT_FOREVER);
}

所以阅读4字节的第一部分很好,但如果我得到10个字节的UART-MEMAGY,我将被困在第二个AD_uart_read例程中。
那么你能告诉我如何管理这个问题吗?

谢谢

设备:
mt_dialog.
离线
最后一次露面:5个月2周前
职员
加入:2015-06-08 11:34
嗨dx3gerst,

嗨dx3gerst,

我没有看到你粘贴的代码的任何错误,ad_uart_read()将阻止任务,直到它从UART获取数据量,因此只要从传感器发送6个字节,那么任务应该取消阻止。如果这不起作用,那么您可能在睡眠模式下掉落,无法从UART接收任何数据?您是否尝试过在不使用任何睡眠模式的情况下测试代码?您确定传感器是否发送了您期望的额外6个字节的数据?

谢谢mt_dialog.

DX3Gerst.
离线
最后一次露面:4年2天前
加入:2017-03-29 13:35
嗨对话框,

嗨对话框,

谢谢您的回答。我的代码基于ble_multi_link演示。我认为没有实现任何睡眠模式。分别睡眠模式的代码被提出评论

/ *设置所需的睡眠模式。* /
// pm_set_wakeup_mode(true);
// pm_set_sleep_mode(pm_mode_extended_sleep);

所以设备应该一直处于活动模式,右图?
是的,我检查了传感器用终端工具发送的字节,它发送了10个字节,它由4个“标准字节”组成,我始终收到和6个额外的字节。

是否可能有任何其他方法来实现这个功能?

谢谢!

mt_dialog.
离线
最后一次露面:5个月2周前
职员
加入:2015-06-08 11:34
嗨dx3gerst,

嗨dx3gerst,

是的,如果您注释出那些函数,那么设备将不会进入睡眠模式,虽然,所建议的是设置PM_SET_SLEEP_MODE(PM_MODE_ACTION);而pm_set_wakeup_mode(true)与设备的睡眠不一定,但随着醒来的过程,因此它不会影响您的代码。

我没有看到代码的任何错误,我也在我身边尝试过它,我可以通过在system_init()函数下面的代码等待UART等待10个字节来启动BLE活动:

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);
}

也许你可以尝试一个接一个地从塞诺斯尔拍摄字节并检查它是否有效,但在任何情况下,您都必须调试它才能检查为什么会发生这种情况。

谢谢mt_dialog.