关于串口中断接收的问题
使用串口中断例程的时候,发现当一个字节单独的发送的时候接收到的是正确的数据,但一次发送多个字节的时候接收到的数据是不正常的,当发送两个字节的时候会进入一次接收中断,当发送4个字节的时候会进入两次接收中断?总会有字节数据没接收到。我最近也在看这款单片机,用的官方的KF350开发板。
我移植了安富莱的一部分例程,串口FIFO,软件定时器等。
不过我只实现了串口2的,其他的我还没写。你可以参考一下。
发送字符串“1324” 的效果。
这说明应该是发送的数据都被接收到了。
串口2接收到的数据被压入g_RxBuf2这个数组中。
芯旺微的IDE好像要暂停调试才能看到变量。debug模式下,数组里的值怎么实时显示我还没弄明白。 串口本来就是以字节为单位传输, 每进一次中断, 需要清除中断标志, 应该是你接收逻辑还需要优化,我这边用下来暂时没发现这个问题. 编号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 = ch;
第一个代码是例程里面的串口中断接收,第二个是你发的程序的中断接收。给我的感觉是两个程序应该功能一样才对,但是我用例程没有你发的程序的效果 伤口不结 发表于 2021-7-8 15:32
第一个代码是例程里面的串口中断接收,第二个是你发的程序的中断接收。给我的感觉是两个程序应该功能 ...
对啊,应该是一样的,你的程序是怎么写的?是不是没有做缓存之类的原因? 编号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_temp;
Receive_cnt1++;
}
}
else if(Receive_cnt1==1)
{
if(Receive_temp=='T')
{
Receive_buff=Receive_temp;
Receive_cnt1++;
Receive_flag=1;
}
}
}
}
遇到A和T就存起来的,但是我试过没有达到效果 伤口不结 发表于 2021-7-8 17:04
遇到A和T就存起来的,但是我试过没有达到效果
只有分两次发送A和T效果才正确,直接发AT只接收到了A 串口都是发完一个自己,再发下一个。 这种情况一般是串口中断函数没处理好,写个buffer来装数据。 封装一个保证性能和稳定可靠性的串口通信的API,是一个上位机或嵌入式软件里面的一个重要部件。 mark
页:
[1]