你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
ldqmoon 提问时间:2018-4-17 22:21 /
本帖最后由 ldqmoon 于 2018-4-17 22:39 编辑

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

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

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

#define MAX_RECV_LEN 2048
uint8_t msg_buff[MAX_RECV_LEN] = {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);




收藏 评论4 发布时间:2018-4-17 22:21

举报

4个回答
feixiang20 回答时间:2018-4-17 23:22:54
检查下初始化代码,是不是引脚问题,标志位问题呢

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

wenyangzeng 回答时间:2018-4-18 07:21:01
本帖最后由 wenyangzeng 于 2018-4-18 07:25 编辑

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


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

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

琦子 回答时间:2018-4-18 07:57:28
do while 不好  去掉

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

wudianjun2001 回答时间:2018-4-18 08:19:58
中断里不要有长时间的循环,这个是好习惯

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版