当前位置:   article > 正文

[ BLE4.0 ] 伦茨ST17H66开发-串口UART0的接收与发送

[ BLE4.0 ] 伦茨ST17H66开发-串口UART0的接收与发送

目录

一、前言

二、实现步骤

        1.设置回调函数

        2.关闭睡眠模式

三、效果展示

四、工程源代码


一、前言

        串口通信在任何一款单片机开发中都是尤为重要的。本文涉及的开发所使用的例程依然是基于[ BLE4.0 ] 伦茨ST17H66开发-OSAL系统中添加自己的Task任务文章的工程源码,本文实现的任务主要是将接收到的串口数据再打印出去。

        伦茨ST17H66的SDK中为我们提供了AT_LOG()函数和LOG()函数,这两个函数以及帮助我们实现了串口打印的功能,但是对于串口接收,官方的SDK中并没有为我们实现。

二、实现步骤

        1.设置回调函数

        首先在my_printf.c文件中找到dbg_printf_init函数,这是UART0的初始化函数。

        通过程序,我们可以看出串口的波特率设置和TX以及RX的引脚设置,同样的我们可以利用这个初始化函数自行仿照配置UART1,但此处不多赘述。通过最后一个属性 evt_handler = NULL 我们不难看出SDK没有为串口设置中断回调函数,通过查阅手册,我们可以找到标准的示例回调函数。

        因此我们根据其标准示例,仿照完成自己的中断回调函数。这里有点问题,即rx_size的类型被设定为uint8,其最大值为255,这与数组长度1024相差甚远,这将会浪费1024-255个字节控件,因此在之后的函数中,我将其改为了uint16,确保空间利用率。当然也可以选择将数组大小改为255,异曲同工。

        程序的具体实现代码如下:

  1. uint8_t receive_buf[1024];
  2. uint16_t receive_size = 0;
  3. __ATTR_SECTION_SRAM__ void uart_evt_hdl(uart_Evt_t* pev)
  4. {
  5. switch(pev->type)
  6. {
  7. case UART_EVT_TYPE_RX_DATA:
  8. case UART_EVT_TYPE_RX_DATA_TO://接收回调
  9. memset(receive_buf,'\0',1024);
  10. memcpy(receive_buf,pev->data,pev->len);//保存接收信息
  11. receive_size = pev->len;//保存接收长度
  12. //打印接收信息
  13. LOG("%s",receive_buf);
  14. break;
  15. case UART_EVT_TYPE_TX_COMPLETED://发送完成回调
  16. break;
  17. }
  18. }

        与示例不同,示例采用了拼接的方式,而在常规开发中这是不常见的。我们往往系统接收的数组里仅有这次收到的数据,因此我做了修改,只保留了本次接收的数据,没有和之前的数据做拼接,并使用LOG将数据打印出来。

        编译并烧录程序,发现程序对发送的数据没有反应,这是什么原因呢?

        2.关闭睡眠模式

        查阅文档,我们发现串口RX接收数据是不能处于睡眠模式的,这就说明其实芯片根本没有收到我们发送的数据。按照上一篇文章的方法,我们继续在宏定义中取消睡眠模式。

三、效果展示

        编译并烧录进芯片后,使用串口调试助手,进行查看。可以看到,程序顺利返回发送的信息。

四、工程源代码

        将该文件解压后放到下图所示位置即可,全局有效。

        源文件:【免费】ST17H66串口文件.zip资源-CSDN文库

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/904868
推荐阅读
相关标签
  

闽ICP备14008679号