ldqmoon 发表于 2018-4-17 22:21:10

STM32L051开机串口接收数据出问题

本帖最后由 ldqmoon 于 2018-4-17 22:39 编辑

按下面这个方式来写的串口接收程序,中断方式
刚开机的时候,经常接收不到数据, 调试发现只能接收到第一个字节,上位机多发几次才能收到。

网上查了一些资料,说是中断程序太长导致, 可我的这个程序不长啊, 仅仅就是把接收到的数据放到buff中
麻烦大家分析一下

补充一下:这个程序在正常运行后就不会再出问题

#define MAX_RECV_LEN 2048
uint8_t msg_buff = {0};
uint8_t * msg = msg_buff;
static int flag = FALSE;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
    uint8_t ret = HAL_OK;
          if(UartHandle==(&huart1))
                {
    msg++;
    if( msg == msg_buff + MAX_RECV_LEN)
    {
      msg = msg_buff;
    }
    do
    {
      ret = HAL_UART_Receive_IT(UartHandle,(uint8_t *)msg,1);
    }while(ret != HAL_OK);

    flag = TRUE;
      }
}





main()中

memset(msg_buff, 0, sizeof(msg_buff));
msg = msg_buff;

      printf("hello world\r\n");
      HAL_UART_Receive_IT(&huart1, (uint8_t *)msg, 1);//启动第一次中断
do{
                if(flag==TRUE)
                {
            // doing something
      memset(msg_buff, 0, sizeof(msg_buff));
      msg = msg_buff;
      (&huart1)->pRxBuffPtr = msg;      
      flag = FALSE;   
                }
      }while(!exitflag);




feixiang20 发表于 2018-4-17 23:22:54

检查下初始化代码,是不是引脚问题,标志位问题呢

wenyangzeng 发表于 2018-4-18 07:21:01

本帖最后由 wenyangzeng 于 2018-4-18 07:25 编辑

中断函数里用上do{}很不合理。每次中断执行一次
ret = HAL_UART_Receive_IT(UartHandle,(uint8_t *)msg,1);
就应该返回了。


这个中断不是让你一直等到数据全部接收完才返回的。

bargagebaobei 发表于 2018-4-18 07:57:28

do while 不好去掉

wudianjun2001 发表于 2018-4-18 08:19:58

中断里不要有长时间的循环,这个是好习惯
页: [1]
查看完整版本: STM32L051开机串口接收数据出问题