目录
一、前言
二、实现步骤
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,异曲同工。
程序的具体实现代码如下:
uint8_t receive_buf[1024];
uint16_t receive_size = 0;
__ATTR_SECTION_SRAM__ void uart_evt_hdl(uart_Evt_t* pev)
{
switch(pev->type)
{
case UART_EVT_TYPE_RX_DATA:
case UART_EVT_TYPE_RX_DATA_TO://接收回调
memset(receive_buf,'\0',1024);
memcpy(receive_buf,pev->data,pev->len);//保存接收信息
receive_size = pev->len;//保存接收长度
//打印接收信息
LOG("%s",receive_buf);
break;
case UART_EVT_TYPE_TX_COMPLETED://发送完成回调
break;
}
}
与示例不同,示例采用了拼接的方式,而在常规开发中这是不常见的。我们往往系统接收的数组里仅有这次收到的数据,因此我做了修改,只保留了本次接收的数据,没有和之前的数据做拼接,并使用LOG将数据打印出来。
编译并烧录程序,发现程序对发送的数据没有反应,这是什么原因呢?
2.关闭睡眠模式
查阅文档,我们发现串口RX接收数据是不能处于睡眠模式的,这就说明其实芯片根本没有收到我们发送的数据。按照上一篇文章的方法,我们继续在宏定义中取消睡眠模式。
三、效果展示
编译并烧录进芯片后,使用串口调试助手,进行查看。可以看到,程序顺利返回发送的信息。
四、工程源代码
将该文件解压后放到下图所示位置即可,全局有效。
源文件:【免费】ST17H66串口文件.zip资源-CSDN文库