GD32E230F如何实现接受一帧数据并判定帧数据的准确性?

[复制链接]
2594|15
 楼主| 提刀剁骨头 发表于 2021-12-11 16:48 | 显示全部楼层 |阅读模式
没有找到帧终端的判定标志位,貌似没有这个功能,怎么样实现检测到一帧数据接受完成了呢?

中断函数如下:
void USART0_IRQHandler(void)
{
                uint8_t i;
       
    if (RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE))   //接收中断
    {
        RxBuffer[i++] = (uint8_t)usart_data_receive(USART0);
//                                usart0_send_byte(RxBuffer[i++]);
    }
                else if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_TBE))//发送中断
    {
                                usart_interrupt_flag_clear(USART0,USART_INT_FLAG_IDLE);   
    }
}
fanwei326 发表于 2021-12-11 23:05 | 显示全部楼层
用一个定时器,定时周期几个mS, 串口每收到一个字节就重置定时。这样若发生了定时中断,就表示有几mS没收到数据了,就表示一帧数据接收完成。

评论

@fanwei326 :我看GD32E230官方手册里有这个USART_INT_FLAG_IDLE,但是调用时候没反应  发表于 2021-12-17 09:11
@提刀剁骨头 :如果有IDLE中断当然更好。但是大多数芯片串口没有IDLE中断。  发表于 2021-12-15 09:03
判断IDLE中断是不是不可以?貌似stm32F030可以直接判断idle的帧中断标志位来用  发表于 2021-12-13 10:19
aple0807 发表于 2021-12-15 10:35 | 显示全部楼层
直接modbus不就解决这个问题了吗?
fanwei326 发表于 2021-12-21 09:06 | 显示全部楼层
aple0807 发表于 2021-12-15 10:35
直接modbus不就解决这个问题了吗?

modbus只是一种通信协议,也需要MCU能判断一帧数据是否完成。
aple0807 发表于 2021-12-21 10:52 | 显示全部楼层
fanwei326 发表于 2021-12-21 09:06
modbus只是一种通信协议,也需要MCU能判断一帧数据是否完成。

modbus已经提供了解决方案,ascii模式\r\n,rtu模式3.5T。
chenjinyu 发表于 2021-12-22 10:32 | 显示全部楼层
接受一帧数据 空闲中断+DMA
判定帧数据的准确性 自己解析协议
fanwei326 发表于 2021-12-22 14:41 | 显示全部楼层
aple0807 发表于 2021-12-21 10:52
modbus已经提供了解决方案,ascii模式\r\n,rtu模式3.5T。

对啊,这里的3.5T就是定时时间,超过3.5T没有新的数据就表示一帧结束,发生定时中断,然后进行数据处理。这种方法适用于没有串口空闲中断的单片机。
tpgf 发表于 2022-1-6 12:11 | 显示全部楼层
是什么通讯方式呢
wowu 发表于 2022-1-6 12:14 | 显示全部楼层
完全可以自己定义一个协议内容
xiaoqizi 发表于 2022-1-6 12:15 | 显示全部楼层
硬件后台就会自己判定吧
木木guainv 发表于 2022-1-6 12:32 | 显示全部楼层
需要在哪里进行判断呢
磨砂 发表于 2022-1-6 12:36 | 显示全部楼层
可以启用内部的crc校验吗
晓伍 发表于 2022-1-6 12:38 | 显示全部楼层
还是需要软件进行判定
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

21

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部