找回密码
立即注册
搜索
热搜: 活动 交友 discuz
发新帖

132

积分

0

好友

10

主题
发表于 2023-9-18 13:17:36 | 查看: 819| 回复: 4 IP:广东省 广电网

调用 rt_device_read() 只能固定接收一个字节 代码如下

if(modbus_serial)
{
    rt_device_open(modbus_serial,RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_INT_TX);
    rec_len = rt_device_read(modbus_serial, -1, USART5_RX_BUF, 8);
    if(rec_len > 6)
    {
        modebus_proc(USART5_RX_BUF, rec_len, USART5_TX_BUF);
    }
    rt_device_close(modbus_serial);
}

用串口助手发送数据 01 02 03 04 05 06 07,调试下发现rec_len永远都是1,if(rec_len > 6)也一直进不去

发表于 2023-9-18 13:53:02 IP:中国 中国广播电视网络有限公司

能的原因是您打开设备的函数参数与注册设备函数参数不一致。您需要确保两者的参数是相同的,例如:

/* register UART1 device */

rt_hw_serial_register (& serial1, “uart1”, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_DMA_RX, uart);

/* open UART1 device */

rt_device_open(modbus_serial, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_DMA_RX);

发表于 2023-9-18 13:53:54 IP:中国 中国广播电视网络有限公司
可以在调用rt_device_read前加个延时,等串口接收完6个数据到默认缓冲区,再去调用read就可以读到6个数据
个人还是不太喜欢这种用法,按时间间隔分包的协议难免会有拆包粘包的情况
发表于 2023-9-18 13:54:37 IP:中国 中国广播电视网络有限公司
串口接收的是流数据,serialX 驱动有一套标准保险做法,详细代码去看 serialX 全网公测里怎么写的吧。
发表于 2023-9-18 13:55:10 IP:中国 中国广播电视网络有限公司

问题可能出在调用rt_device_read()函数时的参数设置上。rt_device_read()函数的第三个参数是缓冲区指针,表示接收到的数据将被存储在这个缓冲区中。而第二个参数是期望接收的字节数,如果设置为-1,则表示接收任意数量的字节直到超时。所以,可以尝试修改代码如下:

rec_len = rt_device_read(modbus_serial, USART5_RX_BUF, sizeof(USART5_RX_BUF));

这样设置后,rt_device_read()函数会一直等待接收到sizeof(USART5_RX_BUF)字节的数据,或者超时。

另外,还需要确认一下上位机发送数据的方式和速率是否正确,以及串口配置是否与上位机一致。

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|国产电子社区 ( 沪ICP备2023018578号-1|

苏公网安备 32011102010465号


)|网站地图

GMT+8, 2024-5-30 00:06 , Processed in 0.070573 second(s), 25 queries , MemCached On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表