串口接收数据出错

2019-07-20 04:30发布

在进行串口接收数据的实验里,用原子哥提供的usart.c,波特率115200,修改的地方如下:
#if 1
#pragma import(__use_no_semihosting)            
//标准库需要的支持函数                 
struct __FILE
{
        int handle;
};
FILE __stdout;      
//定义_sys_exit()以避免使用半主机模式   
void _ttywrch(int ch)
{
ch = ch;
}
void _sys_exit(int x)
{
        x = x;
}
这里添加void _ttywrch(int ch) 是为了防止报错,另外一个改动的地方在回调函数里面:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
        if(huart->Instance==USART1)//如果是串口1
        {
                if((USART_RX_STA&0x8000)==0)//接收未完成
                {
                        if(USART_RX_STA&0x4000)//接收到了0x0d
                        {
                                if(aRxBuffer[0]!=0x0a)
                                {
                                        USART_RX_STA=0;//接收错误,重新开始
                                        printf("接收错误,重新开始 ");
                                }
                                else USART_RX_STA|=0x8000;        //接收完成了
                        }
                        else //还没收到0X0D
                        {       
                                if(aRxBuffer[0]==0x0d)USART_RX_STA|=0x4000;
                                else
                                {
                                        USART_RX_BUF[USART_RX_STA&0X3FFF]=aRxBuffer[0];
                                        USART_RX_STA++;
                                        if(USART_RX_STA>(USART_REC_LEN-1))
                                        {
                                                USART_RX_STA=0;//接收数据错误,重新开始接收
                                                printf("接收数据错误,重新开始接收 ");
                                        }
                                        printf("USART_RX_STA = %d aRxBuffer = %c ", USART_RX_STA, aRxBuffer[0]);
                                }                 
                        }
                }
        }
}

这里添加printf是为了分析错误原因。主函数里面循环为:
while(1)
    {
        if(USART_RX_STA&0x8000)
        {
                printf("发送的数据为: ");
                HAL_UART_Transmit(&UART1_Handler, (u8*)USART_RX_BUF, USART_RX_STA&0X3FFF, 1000);
                while(__HAL_UART_GET_FLAG(&UART1_Handler, UART_FLAG_TC)!=SET);
                printf(" ");
                USART_RX_STA=0;
        }
    }

下载到板子里,发送数据为12345,发送新行,打印出的消息是这样的:


delay_ms(1000) = 1000.23 ms[2018-12-16 10:32:09.463]
USART_RX_STA = 1        aRxBuffer = 1[2018-12-16 10:32:12.549]
发送的数据为:[2018-12-16 10:32:14.703]
1[2018-12-16 10:32:14.703]
USART_RX_STA = 1        aRxBuffer = 1[2018-12-16 10:32:15.027]
USART_RX_STA = 2        aRxBuffer = 2[2018-12-16 10:32:16.040]
USART_RX_STA = 3        aRxBuffer =
[2018-12-16 10:32:17.075]
USART_RX_STA = 4        aRxBuffer = 2[2018-12-16 10:32:17.941]
USART_RX_STA = 5        aRxBuffer = 3[2018-12-16 10:32:18.592]
USART_RX_STA = 6        aRxBuffer = 3[2018-12-16 10:32:19.153]
USART_RX_STA = 7        aRxBuffer = 3[2018-12-16 10:32:19.641]
USART_RX_STA = 8        aRxBuffer = 1[2018-12-16 10:32:20.112]
USART_RX_STA = 9        aRxBuffer = 4[2018-12-16 10:32:20.560]
USART_RX_STA = 10        aRxBuffer = 4[2018-12-16 10:32:21.156]
USART_RX_STA = 11        aRxBuffer = 1[2018-12-16 10:32:27.179]
USART_RX_STA = 12        aRxBuffer = 4[2018-12-16 10:32:28.158]


每点一下发送按钮,就打印一行信息。猜想程序接收到1个字符后没有继续接收。
请各位大神指点。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
jermy_z
1楼-- · 2019-07-20 05:06
printf很费时间的
傲慢的我
2楼-- · 2019-07-20 06:00
补充:用原子哥自带的   2,标准例程-HAL库版本实验3 串口通信实验  ,修改为内部高速时钟,LED0修改为LED1,usart.c中未进行任何修改,最后串口助手打印的消息也是错误,现象与上面类似,怀疑原子哥例程有错,附上代码,请大神指点。
file:///C:/Users/91434/Pictures/360%E6%88%AA%E5%9B%BE20181216230807217.jpg
傲慢的我
3楼-- · 2019-07-20 07:49
 精彩回答 2  元偷偷看……
正点原子
4楼-- · 2019-07-20 08:44
printf不要放串口中断服务函数里面!!
傲慢的我
5楼-- · 2019-07-20 10:01
 精彩回答 2  元偷偷看……
wang51950
6楼-- · 2019-07-20 11:35
 精彩回答 2  元偷偷看……

一周热门 更多>