历史上的今天
返回首页

历史上的今天

今天是:2025年03月25日(星期二)

正在发生

2019年03月25日 | STM32cube HAL库 UART串口中断方式收发任意长度 调试笔记

2019-03-25 来源:eefocus

STM32Cube对于新项目的开发能节省不少时间,从繁琐芯片初始化中解脱出来



1.STM32 UART初始化部分,配置好工程,采用STM32cube生成代码,初始化即已经完成。


2.串口中断方式的发动作:HAL_UART_Transmit_IT


没做任何处理的情况下,我们在程序中使用printf会把信息打印到显示屏中去,这时我们需要将printf重定向就能将printf的消息打印到串口中 去。在主函数中添加如下函数:


int fputc(int ch, FILE *f) 

{

    HAL_UART_Transmit_IT(&huart1, (uint8_t *)&ch, 1);

    osDelay(1); 

    return 0;

}


//即完成重定向,执行printf即能将任意长度的字符发送到串口中。



3.串口中断的收动作:HAL_UART_Receive_IT


HAL_UART_Receive_IT(&huart1,(uint8_t *)&value,1);//程序不会在这个语句停留,直接会按照中断方式把接收数据存放在value中,但是这个语句只能使能一次串口中断。所以要在中断服务函数或者回调函数中重新使能

代码:


//接收缓存初始化

#define MAX_RECV_LEN 1024 

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;

    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);

    

    if(*(msg-1) == '\n')   //接收以\n为结尾字符,则表示接收完成

    {

        flag  = true;

    }



void uart_main(void)

{

    extern UART_HandleTypeDef huart1;

    HAL_UART_Receive_IT(&huart1, (uint8_t *)msg, 1); //开启第一次中断


    while(1)

    {

        if (flag == true)

        {

            printf("msg_buff = %s\r\n",msg_buff);

            memset(msg_buff, 0, sizeof(msg_buff));   //清空缓存区

            // 指向接收缓存的头部

            msg = msg_buff;

            (&huart1)->pRxBuffPtr = msg;

            flag = false;

        }

        osDelay(10);

    }

}

推荐阅读

史海拾趣

GTE Microcircuits公司的发展小趣事
选择合适的复合放大器需要根据具体应用需求来考虑,包括所需的增益、带宽、噪声系数、电源电压等参数。同时,还需要考虑放大器的封装形式、功耗、以及成本等因素。建议在选择时参考数据手册和应用笔记等资料,并结合实际测试来确定最合适的型号。
思博科技(Cybermax)公司的发展小趣事

为了进一步扩大市场份额,思博科技开始积极拓展国际市场。公司参加了多个国际电子展会,与全球各地的客户建立了联系。同时,思博科技还与国际知名企业展开了合作,共同研发新产品。这些合作不仅提升了公司的技术水平,还为公司带来了更多的商机。在国际市场的拓展过程中,思博科技逐渐成为了全球电子行业的佼佼者。

Gold Peak Group公司的发展小趣事
对操作人员进行必要的培训,使其了解控制电路的工作原理、操作方法和安全注意事项。
Diodes Incorporated公司的发展小趣事

值得一提的是,Diodes Incorporated还荣获了亚洲金选奖殊荣。公司的超高功率密度(UHPD)充电器解决方案在亚洲金选奖中获得了金选节能系统功率半导体供货商项目公司奖。这一奖项的获得,不仅彰显了公司在节能系统功率半导体产品领域的领先地位,也进一步提升了公司的品牌形象和市场竞争力。

以上五个故事概述了Diodes Incorporated公司在电子行业中发展起来的相关事实。通过这些故事,我们可以看到公司在技术创新、市场拓展、财务表现以及品牌建设等方面所取得的成就和进步。

安纳森(AnaSem)公司的发展小趣事

随着技术的不断成熟和市场的逐步扩大,安纳森开始将目光投向更广阔的全球市场。公司积极与全球各地的合作伙伴建立战略合作关系,共同开拓市场。同时,安纳森还设立了多个海外研发中心和销售网点,以便更好地了解当地市场需求,提供更贴近用户的产品和服务。这一系列的全球化布局,不仅提升了安纳森的品牌影响力,也为其未来的发展奠定了坚实的基础。

驰兴电感(Coilank)公司的发展小趣事

驰兴电感始终坚持“品质第一”的原则,对产品的每一个细节都进行严格把控。公司引进了先进的生产设备和检测仪器,确保产品从原材料到成品的每一个环节都符合高标准的质量要求。这种对品质的执着追求,使得驰兴电感的产品在市场上赢得了良好的口碑,树立了高品质的品牌形象。

问答坊 | AI 解惑

简易数控直流电源

简易数控直流电源  94年的题, 谁会做啊, 我想了解以下他的原理几过程. 我的邮箱,cf2928@163.com 要不谁告诉我那有我去下也行,谢了.…

查看全部问答>

【分享】mini2440开发板实现国际象棋人机对弈

前段时间买了2440开发板也没怎么搞,惭愧:$ 最近没啥其它事情就好好啃啃吧,哎……没什么基础啊,先欣赏下别人的东西吧 【mini2440开发板实现国际象棋人机对弈 】 我在机子上跑了一下,好像不太能跟电脑对弈啊,不知道哪个地方还有问题 ...…

查看全部问答>

传输线和反射的经典文章

传输线和反射的经典文章…

查看全部问答>

U盘多盘符的问题

我在一个嵌入式系统中,主机在GET MAX LUN我已经返回01,但是主机并未显示2个盘符.仅仅出现了一个盘符 还需要做哪方面的工作…

查看全部问答>

VC如何发彩信,已经实现ATDT*99***1#这一步了,下一步应该是什么,内容打包?如果打包?

VC如何发彩信,已经实现ATDT*99***1#这一步了,下一步应该是什么,内容打包?如果打包? ATE AT+CMGF=0 AT+CIMI   AT+CIMI获得IMSI  IMSI 国际移动用户识别码(IMSI) international mobile subscriber identity 国际上为唯一识别 ...…

查看全部问答>

DM642 编码器初始化

 /*进行SAA7121H的初始化*/ GPIO_RSET(GPVAL,0x0); addrI2C = 0xB8 >>1; /*选择第0路的I2C的地址*/ /*将第0路的视频输入口的数据口设为高阻状态,   使能SCLK,将第27脚设为输入*/ _IIC_write(hSeeddm642i2 ...…

查看全部问答>

2812 flash不能烧写

问题是这样的:我用flash烧写了一个控制电机的程序,不能运行,就把代码改了一下,再进行烧程序的时候就烧不进去啦,我也没有动“lock”和密码(在flash烧写的时候一直很小心的),怎么会锁住呢?很是不解。请EEWORLD老师和各位高手解答一下,谢谢 ...…

查看全部问答>

C题智能小车群

本帖最后由 paulhyde 于 2014-9-15 08:55 编辑 109197413  …

查看全部问答>

恳请各位高手指点迷津,替小弟检查一下错误

各位高手,小弟近日在学习关于修改BSP的内容,有一种想法,设置多个引导行,然后在系统启动时按照需要选择相应的引导顺序,然后将config.h中的引导行 #define DEFAULT_BOOT_LINE \\ \"fd=0,0(0,0)host:/fd0/vxWorks.st h=90.0.0.3 e=90.0.0.50 u=ta ...…

查看全部问答>

.一个初中生是如何成为嵌入式工程师的

我是一个只有初中毕业没有读过多少书的人从小就爱好无线电记得很小的时候当通讯兵的父亲带回来几本电子方面的书籍从此就迷上了无线电那种痴迷程度决不亚于现在的小孩迷恋游戏机至今仍然清楚的记得曾经因为装成功一台6管收音机而兴奋的几天几夜没睡 ...…

查看全部问答>