如何使用蓝牙串口app连接开发板

专业文档是百度文库认证用户/机构上传的专业性文档,文库VIP用户或购买专业文档下载特权礼包的其他会员用户可用专业文档下载特权免费下载专业文档。

专业文档是百度文库认证用户/机构上传的专业性文档,文库VIP用户或购买专业文档下载特权礼包的其他会员用户可用专业文档下载特权免费下载专业文档。

阅读已结束,下载本文需要

}

本应用笔记描述了如何使用RT-Thread的串口设备,包括串口配置、设备操作接口的应用。并给出了在正点原子STM32F4探索者开发板上验证的代码示例。

串口(通用异步收发器,常写作UART、uart)是最为广泛使用的通信接口之一。在裸机平台或者是没有设备管理框架的RTOS平台上,我们通常只需要根据官方手册编写串口硬件初始化代码即可。引入了带设备管理框架的实时操作系统RT-Thread后,串口的使用则与裸机或者其它RTOS有很大的不同之处。RT-Thread中自带I/O设备管理层,将各种各样的硬件设备封装成具有统一接口的逻辑设备,方便管理及使用。本文说明了如何在RT-Thread中使用串口。

本文首先给出使用RT-Thread的设备操作接口开发串口收、发数据程序的示例代码,并在正点原子STM32F4探索者开发板上验证。接着分析了示例代码的实现,最后深入地描述了RT-Thread设备管理框架与串口的联系。

RT-Thread提供了一套简单的I/O设备管理框架,它把I/O设备分成了三层进行处理:应用层、I/O设备管理层、硬件驱动层。应用程序通过RT-Thread的设备操作接口获得正确的设备驱动,然后通过这个设备驱动与底层I/O硬件设备进行数据(或控制)交互。RT-Thread提供给上层应用的是一个抽象的设备操作接口,给下层设备提供的是底层驱动框架。

那么用户如何使用设备操作接口开发出跨平台的串口应用代码呢?

本文基于正点原子STM32F4探索者开发板,给出了串口的配置流程和应用代码示例。由于RT-Thread设备操作接口的通用性,因此这些代码与硬件平台无关,读者可以直接将它用在自己使用的硬件平台上。 正点原子STM32F4探索者开发板使用的是STM32F407ZGT6,具有多路串口。我们使用串口1作为shell终端,串口2作为实验用串口,测试数据收发。终端软件使用putty。板载串口1带有USB转串口芯片,因此使用USB 线连接串口1和PC即可;串口2则需要使用USB转串口模块连接到PC。

4.打开putty,选择正确的串口,软件参数配置为-1-N、无流控。如图所示:

以方便使用串口。app_uart.c中的代码与硬件平台无关,读者可以把它直接添加到自己的工程。利用这几个函数在main.c中编写测试代码。 main.c源码如下:

/* 创建成功则启动线程 */

这段程序实现了如下功能:

  1. 测试线程调用uart_open函数打开指定的串口后,首先使用uart_putchar函数发送字符和uart_putstring函数发送字符串。

  2. 接着在while循环里面调用uart_getchar函数读取接收到的数据并保存到局部变量uart_rx_data中,最后将数据错位后输出。

编译、将代码下载到板卡,复位,串口2连接的终端软件putty(软件参数配置为-1-N、无流控)输出了字符2、0、1、8和字符串Hello RT-Thread!。输入字符 ‘A’,串口2接收到将其错位后输出。实验现象如图所示:

图中putty连接开发板的串口2作为测试串口。

串口通常被配置为接收中断和轮询发送模式。在中断模式下,CPU不需要一直查询等待串口相关标志寄存器,串口接收到数据后触发中断,我们在中断服务程序进行数据处理,效率较高。RT-Thread官方bsp默认便是这种模式。

uart_open函数用于打开指定的串口,它完成了串口设备回调函数设置、串口设备的开启和事件的初始化。源码如下:

/* 查找系统中的串口设备 */ /* 查找到设备后将其打开 */ /* 打开设备,以可读写、中断方式 */ /* 初始化事件对象 */

uart_open函数首先调用rt_device_find根据串口名字获得串口句柄,保存在静态全局变量uart_device中,后面关于串口的操作都是基于这个串口句柄。这里的名字是在drv_usart.c中调用注册函数rt_hw_serial_register决定的,该函数将串口硬件驱动和RT-Thread设备管理框架联系起来了。

接着调用rt_device_set_rx_indicate设置串口接收中断的回调函数。 最后调用rt_device_open以可读写、中断接收方式打开串口。它的第二个参数为标志,与上面提到的注册函数rt_hw_serial_register保持一致即可。

uart_putchar函数用于发送1字节数据。uart_putchar函数实际上调用的是rt_device_write来发送一个字节,并采取了防出错处理,即检查返回值,失败则重新发送,并限定了超时。源码如下:

调用uart_putchar发生的数据流向示意图如下:

uart_getchar函数用于接收数据,uart_getchar函数的实现采用了串口接收中断回调机制和事件用于异步通信,它具有阻塞特性。 相关源码如下:

/* 串口接收事件标志 */

uart_getchar函数内部有一个while()循环,先调用rt_device_read去读取一字节数据,没有读到则调用rt_event_recv等待事件标志,挂起调用线程;串口接收到一字节数据后产生中断,调用回调函数uart_intput,回调函数里面调用了rt_event_send发送事件标志以唤醒等待该event事件的线程。 调用uart_getchar函数发生的数据流向示意图如下:

I/O设备管理框架和串口的联系

更多关于I/O设备管理框架的说明和串口驱动实现细节,请参考《RT-Thread编程手册》第 6 章 I/O设备管理

如果设备注册时指定的参数中包括RT_DEVICE_FLAG_STANDALONE,此设备将不允许重复打开

此函数可根据设备句柄来打开设备。

oflag支持以下参数:

如果上层应用程序需要设置设备的接收回调函数,则必须以INT_RX或者DMA_RX 的方式打开设备,否则不会回调函数。

查找到对应设备将返回相应的设备句柄;否则返回RT_NULL

此函数根据指定的设备名称查找设备。

此函数可设置一个回调函数,当硬件设备收到数据时回调以通知应用程序有数据到达。

当硬件设备接收到数据时,会回调这个函数并把收到的数据长度放在size参数中传递给上层应用。上层应用线程应在收到指示后,立刻从设备中读取数据。

内存缓冲区指针,读取的数据将会被保存在缓冲区中

返回读到数据的实际大小(如果是字符设备,返回大小以字节为单位;如果是块设备,返回的大小以块为单位);如果返回0,则需要读取当前线程的errno来判断错误状态。

此函数可从设备中读取数据

调用这个函数,会从设备dev中获得数据,并存放在buffer缓冲区中。这个缓冲区的最大长度是size。pos根据不同的设备类别存在不同的意义。

内存缓冲区指针,放置要写入的数据

返回写入数据的实际大小(如果是字符设备,返回大小以字节为单位;如果是块设备, 返回的大小以块为单位);如果返回0,则需要读取当前线程的errno来判断错误状态。 注:调用这个函数,会把缓冲区buffer中的数据写入到设备dev中。写入数据的最大长度是 size。pos根据不同的设备类别存在不同的意义。

此函数可向设备中写入数据。

}

我要回帖

更多关于 蓝牙串口app 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信