搜索

[KungFu32位 MCU] 关于串口中断接收的问题

[复制链接]
4525|11
手机看帖
扫描二维码
随时随地手机跟帖
伤口不结|  楼主 | 2021-7-8 09:05 | 显示全部楼层 |阅读模式
使用串口中断例程的时候,发现当一个字节单独的发送的时候接收到的是正确的数据,但一次发送多个字节的时候接收到的数据是不正常的,当发送两个字节的时候会进入一次接收中断,当发送4个字节的时候会进入两次接收中断?总会有字节数据没接收到。

使用特权

评论回复
编号10086| | 2021-7-8 11:35 | 显示全部楼层
串口和FIFO.zip (2.8 MB, 下载次数: 4)

使用特权

评论回复
编号10086| | 2021-7-8 12:23 | 显示全部楼层
发送字符串“1324” 的效果。
这说明应该是发送的数据都被接收到了。

6053260e67d99bb9e3.png

使用特权

评论回复
编号10086| | 2021-7-8 12:39 | 显示全部楼层
串口2接收到的数据被压入g_RxBuf2这个数组中。

芯旺微的IDE好像要暂停调试才能看到变量。debug模式下,数组里的值怎么实时显示我还没弄明白。
5621660e6810c6859c.png
9884160e68114b53d3.png

使用特权

评论回复
psm132132| | 2021-7-8 13:41 | 显示全部楼层
串口本来就是以字节为单位传输, 每进一次中断, 需要清除中断标志, 应该是你接收逻辑还需要优化,  我这边用下来暂时没发现这个问题.

使用特权

评论回复
伤口不结|  楼主 | 2021-7-8 15:32 | 显示全部楼层
编号10086 发表于 2021-7-8 12:39
串口2接收到的数据被压入g_RxBuf2这个数组中。

芯旺微的IDE好像要暂停调试才能看到变量。debug模式下,数 ...
if(USART_Get_Receive_BUFR_Ready_Flag(USART2_SFR))
        {
                Receive_buff=USART_ReceiveData(USART2_SFR));
        }

uint32_t strflags   = _pUart->uart->STR;//str寄存器(串口状态)
        uint32_t ierflags   = _pUart->uart->IER;//ier寄存器(串口中断使能)

        if ((strflags & USART_STR_RDRIF) != RESET)//串口接收中断RDRIF
        {
                /* 从串口接收数据寄存器读取数据存放到接收FIFO */

                /*1.从RBUFR寄存器中读取接收到数据ch(注:从RBUFR读取数据会自动把接收中断标志RDRIF清零)*/
                uint8_t ch;
                ch = _pUart->uart->RBUFR;

                /*2.把ch放入接收缓冲区*/
                _pUart->pRxBuf[_pUart->usRxWrite] = ch;


第一个代码是例程里面的串口中断接收,第二个是你发的程序的中断接收。给我的感觉是两个程序应该功能一样才对,但是我用例程没有你发的程序的效果

使用特权

评论回复
编号10086| | 2021-7-8 16:56 | 显示全部楼层
伤口不结 发表于 2021-7-8 15:32
第一个代码是例程里面的串口中断接收,第二个是你发的程序的中断接收。给我的感觉是两个程序应该功能 ...

对啊,应该是一样的,你的程序是怎么写的?是不是没有做缓存之类的原因?

使用特权

评论回复
伤口不结|  楼主 | 2021-7-8 17:04 | 显示全部楼层
编号10086 发表于 2021-7-8 16:56
对啊,应该是一样的,你的程序是怎么写的?是不是没有做缓存之类的原因? ...
        if(USART_Get_Receive_BUFR_Ready_Flag(USART2_SFR))
        {
                Receive_temp=USART_ReceiveData(USART2_SFR));
                if(Receive_flag!=1)
                {                       
                                        if(Receive_cnt1==0)
                                        {
                                                if(Receive_temp=='A')
                                                {
                                                        Receive_buff[Receive_cnt1]=Receive_temp;
                                                        Receive_cnt1++;
                                                }
                                        }
                                   else if(Receive_cnt1==1)
                                        {
                                                if(Receive_temp=='T')
                                                {
                                                        Receive_buff[Receive_cnt1]=Receive_temp;
                                                        Receive_cnt1++;
                                                        Receive_flag=1;
                                                }
                                        }
          }       
        }


遇到A和T就存起来的,但是我试过没有达到效果

使用特权

评论回复
伤口不结|  楼主 | 2021-7-8 17:05 | 显示全部楼层
伤口不结 发表于 2021-7-8 17:04
遇到A和T就存起来的,但是我试过没有达到效果

只有分两次发送A和T效果才正确,直接发AT只接收到了A

使用特权

评论回复
coody| | 2021-7-8 17:55 | 显示全部楼层
串口都是发完一个自己,再发下一个。

使用特权

评论回复
huquanz711| | 2021-7-8 19:45 | 显示全部楼层
这种情况一般是串口中断函数没处理好,写个buffer来装数据。

使用特权

评论回复
besovideo| | 2021-7-8 20:54 | 显示全部楼层
封装一个保证性能和稳定可靠性的串口通信的API,是一个上位机或嵌入式软件里面的一个重要部件。

使用特权

评论回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

本版热帖

本版活跃用户

优质原创写原创,赢大奖

编辑推荐

  • 1 kk的回忆 得到打赏 ¥561.01
  • 2 火星国务卿 得到打赏 ¥518.00
  • 3 呐咯密密 得到打赏 ¥295.00
  • 4 小叶三千 得到打赏 ¥210.00
  • 5 jinglixixi 得到打赏 ¥190.00
  • 6 Gavin3389 得到打赏 ¥180.00
  • 7 神圣雅诗人 得到打赏 ¥170.00
  • 8 xyz549040622 得到打赏 ¥150.00
  • 9 linghz 得到打赏 ¥120.00
  • 10 137017878 得到打赏 ¥115.00
在线客服 快速回复 返回顶部 返回列表