这样使用UART接收一帧数据的方法是否可行

发布于 2020-11-15 10:07:37

我希望该线程在通知其他线程处理数据时,其他线程获取的数据是一帧数据而非一个字节。UART是字符设备,每次只能读取一字节数据

while (rt_device_read(UART, 0, &data, 1) == 0)
{
    //基本上就是阻塞等待waitting forever
    rt_xxxx(&rx_xx, RT_WAITING_FOREVER);
    处理(data);
    ...
}

如果用阻塞的方式获取数据,就变成了一个字节一个字节的接收。我希望该线程在通知其他线程处理数据时,其他线程获取的数据是一帧数据而非一个字节,我延用了我之前单片机的思维:在接收数据后将永久等待转为超时等待,超时后,即发完一帧数据,通知其他线程处理

static rt_uint8_t buf[MAX];
while (rt_device_read(UART, 0, &data, 1) == 0)
{
    if(UART空闲)
    {
        rt_xxxx(&rx_xx, RT_WAITING_FOREVER);//永久等待,直到串口发数据
        UART繁忙;
    }
    else if(UART繁忙)
    {
        rt_xxxx(&rx_xx, 1);//超时等待1ms,
        //若串口不发送数据,则表明一帧数据结束
        通知其他线程处理数据;
        UART空闲;
        continue;
    }
    buf[] = data;//收到的数据存起来
    ...
}

但实验结果虽然是正确,但内心告诉我,这似乎不是RTOS该有的方法。
不知道该方式是否合理,如果有更好的方法,还请求各位大佬指点一下

刚学rt_thread,开发板是公司给的,没拿到芯片手册,似乎不具备stm32中uart的空闲中断

查看更多

关注者
0
被浏览
216
3 个回答
whj467467222
whj467467222 2020-11-15

你太厉害了,你的这种设计思想其实就是工业通讯协议Modbus实现的方式,既每次收到一个字节,并不去处理,等待发生 T3.5 的定时器超时,认为这一帧数据接收完毕,然后交由协议栈处理

HWM13
HWM13 2020-11-16

如果是支持RTOS,基本会有1个接收线程,这个接收线程主要是解析1个完整的数据帧(根据协议解析得到),如果得到数据帧则进行邮件发送。如果没有解析到完整的数据帧,接收线程周期性进行解析。

我后续的工作中得知,实际项目中并未采用该方法实现串口,而使用轮询的方式,例如监测串口数据,若未收到数据,就超时,去查看发送队列中是否由数据,有就工作;没有就跳过。但个人认为该方法自始至终都没人让出cpu而是等一个时间片用完,而我的方法在1ms发送间隔的压力测试下会出现大量丢包。

个人认为这两种法均可,我的方法别人也认可。

自己方法还是有点问题,继续看看

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览