【已解决--驱动设计与使用方式差异】tuyaOS模组WBR3 SDK3.5.3串口收发严重BUG

Wi-Fi 设备、Wi-Fi 低功耗设备、Wi-Fi BLE 双模设备、Ethernet设备、Ethernet+Wi-Fi设备等
jafatek
Posts: 23

严重BUG: 测试发现 基于tuyaOS开发的 SDK是3.5.3 模组是WBR3 必现问题,发现 串口接收和发送出现严重bug,串口接收 会少接收一个 串口发送,一次性发送一个长度为20个字节的数组,第一次有可能发送的是正确的 但是后面发送的100%是不正确的,错误情况:数组的最后一位变成了第一位,,,,,,问题原因可能是你们串口发送数组清空 或逻辑出现问题 不排除我的串口配置有问题 我配置的串口如下cfg.base_cfg.baudrate = 115200;
cfg.base_cfg.databits = TUYA_UART_DATA_LEN_8BIT;
cfg.base_cfg.stopbits = TUYA_UART_STOP_LEN_1BIT;
cfg.base_cfg.flowctrl = TUYA_UART_FLOWCTRL_NONE;
cfg.base_cfg.parity = TUYA_UART_PARITY_TYPE_NONE;
cfg.open_mode = O_BLOCK;
cfg.rx_buffer_size = 1024;
ret = tal_uart_init(TUYA_UART_NUM_0,&cfg);

我的发送如下: OPERATE_RET op_ret = tal_uart_write(TUYA_UART_NUM_0, u8Arr_UartReplyFrame, UART_TRASLATE_CMD_LENGTH);
TAL_PR_DEBUG("Uart reply data:\nhead:[%02x%02x]addr:[%02x]frametype:[%d]data:[%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d]crc:[%02x]"
,u8Arr_UartReplyFrame[0], u8Arr_UartReplyFrame[1], u8Arr_UartReplyFrame[2], u8Arr_UartReplyFrame[3], u8Arr_UartReplyFrame[4]
,u8Arr_UartReplyFrame[5], u8Arr_UartReplyFrame[6], u8Arr_UartReplyFrame[7], u8Arr_UartReplyFrame[8], u8Arr_UartReplyFrame[9]
,u8Arr_UartReplyFrame[10], u8Arr_UartReplyFrame[11], u8Arr_UartReplyFrame[12], u8Arr_UartReplyFrame[13], u8Arr_UartReplyFrame[14]
,u8Arr_UartReplyFrame[15], u8Arr_UartReplyFrame[16], u8Arr_UartReplyFrame[17], u8Arr_UartReplyFrame[18], u8Arr_UartReplyFrame[19]); 在日志串口中输出的数据是我设定的 没有问题 说明我发送的数组中的数据是正确的顺序 但是串口1发出来的数据 最后一个就不对了 尝试#define CONFIG_UART_WRITE_ASYNC 编译不过
问题类型目录:产品功能模块/MCU嵌入式开发/TuyaOS多代码开发

问题原因应该是串口的缓存在发送和接收的时候没有处理好,每一次发送都会把上一次发送的最后一个数据在最前面发出来,例如我代码第一次发送:AA BB CC DD EE 第二次发送:01 02 03 04 05 串口助手监视到 我第二次的数据就是 EE 01 02 03 04 我尝试修改串口的配置,让其成为异步模式,但是代码编译不过,这部分的代码都是涂鸦提供的,接收的时候 我用串口助手发送一个长度为20个字节的数据 结构uart的read报告我收了两次 一次是1个字节 第二次是19个字节 服了...........................................................

yangjie
Posts: 209

Re: tuyaOS模组WBR3 SDK3.5.3串口收发严重BUG

你可以先使用 tkl_uart_write 进行串口数据传输, tal 这个问题我们先看下

jafatek
Posts: 23

Re: tuyaOS模组WBR3 SDK3.5.3串口收发严重BUG

tkl的接口在发送write上也存在同样的问题 , 另外我在tal的串口接收函数中加入了延时 在低频率的接收中 能做到收发同步(串口助手发送了20个数据,那边就显示收到了20个字节)但是高频率就不行 20ms一次的通讯周期 就前几个周期能正常接收 后面就收不全了 我的代码:创建了一个线程 先收串口数据,看看是不是20个字节 是20个字节 就解包 解包后在发送20个字节出去 对于串口的使用 是基于最基本的收发功能 代码执行流程是串行的不存在并发 另外使用的是阻塞模式 串口波特率是115200

Attachments
串口接收.jpg
yangjie
Posts: 209

Re: tuyaOS模组WBR3 SDK3.5.3串口收发严重BUG

jafatek 2023年 Feb 3日 16:25

tkl的接口在发送write上也存在同样的问题 , 另外我在tal的串口接收函数中加入了延时 在低频率的接收中 能做到收发同步(串口助手发送了20个数据,那边就显示收到了20个字节)但是高频率就不行 20ms一次的通讯周期 就前几个周期能正常接收 后面就收不全了 我的代码:创建了一个线程 先收串口数据,看看是不是20个字节 是20个字节 就解包 解包后在发送20个字节出去 对于串口的使用 是基于最基本的收发功能 代码执行流程是串行的不存在并发 另外使用的是阻塞模式 串口波特率是115200

你这个场景是怎么样子的?是模组发送数据,电脑上串口调试助手接收吗。

jafatek
Posts: 23

Re: tuyaOS模组WBR3 SDK3.5.3串口收发严重BUG

是的 模组和串口助手通信 模组打印日志

jafatek
Posts: 23

Re: tuyaOS模组WBR3 SDK3.5.3串口收发严重BUG

想实现ms级别的串口通信 通信一次是20个字节 通信由主机发起 模组回复 在修正BUG的时候 也请专家帮忙评估一下 WBRd3具不具备这个能力 最长100ms通信一次
是否可行

yangjie
Posts: 209

Re: tuyaOS模组WBR3 SDK3.5.3串口收发严重BUG

jafatek 2023年 Feb 4日 12:59

想实现ms级别的串口通信 通信一次是20个字节 通信由主机发起 模组回复 在修正BUG的时候 也请专家帮忙评估一下 WBRd3具不具备这个能力 最长100ms通信一次
是否可行

你使用的串口调试工具是什么?串口调试助手是否打开了时间戳的功能?在电脑上使用串口调试助手有可能会因为时间戳的原因导致显示的时候将一帧数据分成了两行显示的

jafatek
Posts: 23

Re: tuyaOS模组WBR3 SDK3.5.3串口收发严重BUG

你测试过吗?可以电话交流吗? 串口助手用的是野火的串口助手 我没开时间戳功能 现在是2个问题 问题1:串口的接收,在用串口助手发送20个字节的数据 模组日志显示 模组会大概率存在按2次来接收的BUG 如上 我在接收函数中加了一个5ms的判断延时 这个bug就可以大概率消失 但是发送周期小于1s的时候 还会有概率出现 发送的周期越快 这个问题出现的概率越多 问题2:串口的发送,在用模组发送20个字节的时候 第一次发送的数据 是大概率正确的 但是第二次到以后的所有发送的时候 都会出现第一个字节是上一帧数据的最后一个字节的bug 导致后面发送的20个字节 的数据只发出去了19个 因为开头的第一个 模组发送了上一帧的最后一个字节 (举例:利用模组发送相同的数据 HEX[20]={01,02,03,04,05,06,07,08,09,0a,0b,0c,0d,0e,0f,11,12,13,14,15} 第一次发送可能全对 但是 后面就不是了 后面接收发现发出来的就是:15,01,02,03,04,05,06,07,08,09,0a,0b,0c,0d,0e,0f,11,12,13,14 ) 希望您在百忙之中 注 意 看我全部的发言 切记 注意看整个帖子 我这些都是在帖子中描述过的 另外 串口工具 已经用了好多年了 都没有出现过问题 还有问题 希望电话联系 谢谢

jafatek
Posts: 23

Re: tuyaOS模组WBR3 SDK3.5.3串口收发严重BUG

看样子猜测应该是你们在串口buf的清空 或者串口队列的弹出出现了问题 这个问题 很好测试 很容易复现 希望后续的板子提供一下 原生的串口发送和串口接口

jafatek
Posts: 23

Re: tuyaOS模组WBR3 SDK3.5.3串口收发严重BUG

各位专家好; 想了解一下 问题解决的怎么样了? 什么时候能解决? 有没有什么替代方案? 谢谢

Post Reply