硬汉嵌入式论坛

 找回密码
 立即注册
查看: 840|回复: 11
收起左侧

[UART] 串口FIFO的接收问题

[复制链接]

20

主题

38

回帖

98

积分

初级会员

积分
98
发表于 2025-3-13 16:20:36 | 显示全部楼层 |阅读模式
485通信,波特率为2M, stm32h723,主频  550Mhz,   1s 中接收接近20K字节,当前情况是有概率丢掉一个字节,用串口+dma的方式?
还有一个问题,硬汉哥的串口fifo例程 为什么没开硬件fifo
江湖救急!谢谢大哥们
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-3-13 16:23:55 | 显示全部楼层
我们的开了软件FIFO了,硬件FIFO的缓冲有点小。

建议把终端电阻加上会好不少,这个是我们早期的测试。

H7-TOOL的485总线接口做2M/2.5M/3Mbps通信速度注意事项(2023-11-12)
https://forum.anfulai.cn/forum.p ... 1818&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

20

主题

38

回帖

98

积分

初级会员

积分
98
 楼主| 发表于 2025-3-13 16:25:25 | 显示全部楼层
while(1)
        {       
               
                if ((read = comGetRxcount(COM3)) > 8)
                {
                       
                                if (comGetChar(COM3,&_byte))
                                {
                                        switch(step)
                                        {       
                                               
                                                /*接收数据包包头的状态*/
                                                case 0:
                                                        if(_byte == 0xFC)
                                                        {       
                                                                step++;
                                                                cnt = 0;
                               
                                                        }
                                                        else
                                                        {
                                                                step = 0;
                                                        }
                                                        break;
                                                case 1:
                                                        if(_byte == 0xFD)
                                                        {
                                                                step++;
                                                        }
                                                        else
                                                        {
                                                                step = 0;
                                                        }
                                                        break;
                                               
                                                case 2:
                                                        if(_byte == 0xCF)
                                                        {
                                                                step++;       
                                                        }
                                                        else
                                                        {
                                                                step = 0;
                                                        }
                                                        break;
                                               
                                                case 3:
                                                        if(_byte == 0xDC)
                                                        {
                                                                step++;
                                                               
                                                        }
                                                        else
                                                        {
                                                                step = 0;
                                                        }
                                                        break;
                                                case 4:
                                                        if(_byte == 0x00)
                                                        {
                                                                k++;
                                                                if (k == 8)
                                                                {       
                                                                        k = 0;
                                                                        step++;
                                                                }
                                                        }
                                                        else
                                                        {
                                                                step = 0;
                                                        }
                                                       
                                                        break;
                                                case 5:
                                                        if(_byte == 0x34)
                                                        {
                                                                cnt = 0;
                                                                step++;
                                                                len = 4;
                                                        }
                                                        else
                                                        {       
                                                                count = 0;
                                                                step = 0;
                //                                                memset(net_buf,0,sizeof(net_buf));
                                                        }
                                                        break;
                                                /*接收数据  接收4字节并进行处理 */
                                                case 6:
                                                        len--;
                                                        _buf[cnt] = _byte;
                                                        cnt++;
                                                        if(len == 0)
                                                        {       
                //                                                if (_buf[0] == 0x34)
                //                                                {
                //                                                        step = 0;
                //                                                        count = 0;
                //                                                }
                                                                net_buf[count] = (((uint32_t)_buf[0] << 24) | ((uint32_t)_buf[1] << 16) | ((uint32_t)_buf[2] << 8) | _buf[3]);
                                                                count++;
                                                                step = 5;
                                                                if (count == 237)
                                                                {       
                                                                       
                                                                        count = 0;
                                                                        step = 0;
                                                                        com3_buf.read_id = (com3_buf.read_id == 1) ? 0 : 1;
                                                                        com3_buf.reading[com3_buf.read_id] = 1;
                                                                        if (com3_buf.sending[com3_buf.read_id] == 1)
                                                                        {
                                                                                tx_thread_sleep(1);
                                                                        }
                                                                        for (int j = 0; j < 237; j++)
                                                                        {
                                                                                com3_buf.buf[com3_buf.read_id][j] = net_buf[j];
                                                                        }
                                                                        memset(net_buf,0,sizeof(net_buf));
                                                                        com3_buf.reading[com3_buf.read_id] = 0;
                //                                                        const char cmd[2] = {0x00, 0x8F};
                //                                                                        /* 发送485数据命令 */
                //                                                        comSendBuf(COM3, (uint8_t *)cmd, 2);
                                                                        tx_event_flags_set(&EventGroup, BIT_4, TX_OR);
                                                                }
                                                        }
                                                        break;
                                                default:
                                                        step = 0;
                                                        break;
                                                       
                                        }
                       
                               
                               
                       
                                }
                                else
                                {
                                        Error_Handler(__FILE__, __LINE__);
                                }       
                }
               
               
                else
                {
                        tx_thread_sleep(10);
                }                       
丢数据   使用的安富莱的串口fifo的模式
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-3-13 16:30:04 | 显示全部楼层
marin0vv0 发表于 2025-3-13 16:25
丢数据   使用的安富莱的串口fifo的模式

不做解析,纯接收测试,正常了,再看看是那里的问题。
回复

使用道具 举报

20

主题

38

回帖

98

积分

初级会员

积分
98
 楼主| 发表于 2025-3-13 16:44:29 | 显示全部楼层

/* 配置PA1, PA2 , PA7 */
                GPIO_InitStruct.Pin =  GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7;
                GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
                GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
                GPIO_InitStruct.Pull = GPIO_NOPULL ;
                GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
                HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

                /* 配置PB13 */
                GPIO_InitStruct.Pin = GPIO_PIN_13;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
                GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
                GPIO_InitStruct.Pull = GPIO_NOPULL ;
                GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
                HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

                /* 配置PC1, PC4和PC5 */
                GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
                GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
                GPIO_InitStruct.Pull = GPIO_NOPULL ;
                GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
                HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);       

                /* 配置PB11, PB12 */
                GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
                GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
                GPIO_InitStruct.Pull = GPIO_NOPULL ;
                GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
                HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

                /* 设置中断优先级 */
                HAL_NVIC_SetPriority(ETH_IRQn, 0, 0);
                HAL_NVIC_EnableIRQ(ETH_IRQn);       
我这里面有个以太网优先级很高的中断,会不会导致我的串口中断没有及时响应而导致少点呢
回复

使用道具 举报

692

主题

3576

回帖

5677

积分

论坛元老

积分
5677
发表于 2025-3-13 17:24:55 | 显示全部楼层
marin0vv0 发表于 2025-3-13 16:44
/* 配置PA1, PA2 , PA7 */
                GPIO_InitStruct.Pin =  GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7;
                GPIO_I ...

貌似串口接收一般不建议 一边接收一边解析哟,,

一般是推荐接收完一包数据或一帧数据后再进行解析处理
回复

使用道具 举报

20

主题

38

回帖

98

积分

初级会员

积分
98
 楼主| 发表于 2025-3-13 17:56:35 | 显示全部楼层
但是问题是丢点的问题 是fifo里面可以查看到丢点了的情况
而且这样处理  我没接收到我就任务休眠罢了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-3-14 07:53:38 | 显示全部楼层
marin0vv0 发表于 2025-3-13 17:56
但是问题是丢点的问题 是fifo里面可以查看到丢点了的情况
而且这样处理  我没接收到我就任务休眠罢了

1s 20K字节,差不多就是200Kbps的速度,这个速度使用串口FIFO完全处理的过来。

你那边大概率存在FIFO满了,但是还没有及时读取的情况。
回复

使用道具 举报

4

主题

1459

回帖

1471

积分

至尊会员

积分
1471
发表于 2025-3-14 09:16:37 | 显示全部楼层
有概率丢掉一个字节,一般都是软件处理的Bug,仔细检查
回复

使用道具 举报

20

主题

38

回帖

98

积分

初级会员

积分
98
 楼主| 发表于 2025-3-14 17:19:22 | 显示全部楼层
对于fifo部分仔细检查了下,应该是没有问题的,当丢掉一个点这个情况发生时,程序会进入断点,同时可以观察寄存器ISR  的ORE置1
回复

使用道具 举报

20

主题

38

回帖

98

积分

初级会员

积分
98
 楼主| 发表于 2025-3-14 17:55:21 | 显示全部楼层
marin0vv0 发表于 2025-3-14 17:19
对于fifo部分仔细检查了下,应该是没有问题的,当丢掉一个点这个情况发生时,程序会进入断点,同时可以观察 ...

不对不对不对  进入断点 就会观察到这个ore现象 现象不对 当我没说 继续调去了
回复

使用道具 举报

7

主题

117

回帖

138

积分

初级会员

积分
138
发表于 2025-6-12 20:15:04 | 显示全部楼层
开DMA吧,轮询去接收都可以轻松这个波特率
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 07:00 , Processed in 0.045953 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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