求助:关于stm32F103,串口接收数据问题

2019-10-15 19:08发布

有两颗103的ARM,一颗使用USART3,一颗使用UART4;
第一颗的USART3发送数据通过PCB到DP接口,然后走DP线,到另外一个PCB的DP接口,然后进另一颗的UART4接收数据;
在波特率设置为9600或者以上时,出现UART4接收数据偶尔丢字节,通过加计数,发现UART4进入中断的次数和少于USART3发送次数;
(发送数据按自定义协议发送,有包头和Checksum;波特率为9600时,USART3每隔200MS发送一次数据,每次7个字节,发送1000次;UART4收到数据,发现收到数据次数偶尔为998或者999,有时候正常,进中断的次数计数偶尔为6998或者6999,正常应该为:7000。)
修改波特率为2400,发送接收数据正常(测试几W次,暂未发现异常)

麻烦大神帮忙看看会是什么问题

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
fengye00
1楼-- · 2019-10-15 23:42
fengye00
2楼-- · 2019-10-16 03:09
fengye00
3楼-- · 2019-10-16 08:59
 精彩回答 2  元偷偷看……
正点原子
4楼-- · 2019-10-16 10:38
说明是串口速度高才出现数据丢失,可能的问题是中断服务程序写的不好,处理不过来
fengye00
5楼-- · 2019-10-16 16:18
正点原子 发表于 2016-12-12 20:49
说明是串口速度高才出现数据丢失,可能的问题是中断服务程序写的不好,处理不过来

感谢原子大大的回复。  中断服务函数如下:


void UART4_IRQHandler(void)
{
        BYTE B_Uart4RcvData;

        if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)
        {
                USART_ClearITPendingBit(UART4, USART_IT_RXNE);
                B_Uart4RcvData = USART_ReceiveData(UART4);
                RecvTimes++;

                if(B_Uart4Lock == UART_UNLOCK)
                {
                        if(W_Uart4RecvIndex == W_Uart4ProcessIndex)
                        {
                                W_Uart4RecvIndex    = 0;
                                W_Uart4ProcessIndex = 0;
                                W_Uart4Counter      = 0;
                        }
                }
                if(W_Uart4RecvIndex >= Rx4BufferSize)
                {
                        W_Uart4RecvIndex = 0;
                }
                RxBuffer4[W_Uart4RecvIndex++] = B_Uart4RcvData;

        if(USART_GetFlagStatus(UART4,USART_FLAG_ORE) == SET) //溢出
    {
        USART_ClearFlag(UART4,USART_FLAG_ORE); //读SR
        USART_ReceiveData(UART4); //读DR
        Flag++ ;
    }


        }
}
fengye00
6楼-- · 2019-10-16 18:39
正点原子 发表于 2016-12-12 20:49
说明是串口速度高才出现数据丢失,可能的问题是中断服务程序写的不好,处理不过来

感谢原子大大的回复。  中断服务函数如下:


void UART4_IRQHandler(void)
{
        BYTE B_Uart4RcvData;

        if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)
        {
                USART_ClearITPendingBit(UART4, USART_IT_RXNE);
                B_Uart4RcvData = USART_ReceiveData(UART4);
                RecvTimes++;

                if(B_Uart4Lock == UART_UNLOCK)
                {
                        if(W_Uart4RecvIndex == W_Uart4ProcessIndex)
                        {
                                W_Uart4RecvIndex    = 0;
                                W_Uart4ProcessIndex = 0;
                                W_Uart4Counter      = 0;
                        }
                }
                if(W_Uart4RecvIndex >= Rx4BufferSize)
                {
                        W_Uart4RecvIndex = 0;
                }
                RxBuffer4[W_Uart4RecvIndex++] = B_Uart4RcvData;

        if(USART_GetFlagStatus(UART4,USART_FLAG_ORE) == SET) //溢出
    {
        USART_ClearFlag(UART4,USART_FLAG_ORE); //读SR
        USART_ReceiveData(UART4); //读DR
        Flag++ ;
    }


        }
}

一周热门 更多>