Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
玩溜GD32303E-EVAL BSP系列(二)----读取GPS传感器数据
发布于 2018-04-28 14:47:50 浏览:5100
订阅该版
[tocm] ## 1. 准备 基于第一个章节大家已经把基本系统跑起来,本章节将介绍使用RT-Thread提供的串口驱动框架获取GPS传感器的数据,并在shell显示出来。 本文使用的GPS模块型号是GY-GPS6MV2,采用 U-BLOX NEO-6M 模组,兼容 3.3V/5V 电平。 GPS模块外观如下: ![gps-a.png](/uploads/201804/28/151104csde245n4ednd0yn.png) GPS模块各引脚说明如下: | 引脚 | 说明 | | ----- | --------| | VCC | 电源(3.3V~5.0V) | | GND | 接地 | | RXD | 模块串口接收脚(TTL 电平),可接单片机的 TXD | | TXD | 模块串口发送脚(TTL 电平),可接单片机的 RXD | GPS模块和GD32303E-EVAL开发板连接情况如下: | GPS引脚 | GD32303E-EVAL开发板引脚 | | ----- | --------| | VCC | 3.3V或者5.0V电源 | | GND | GND | | RXD | USART1 TX,引脚为PA2 | | TXD | USART1 RX,引脚为PA3 | 开发板供电及连接情况: * 供电方式:评估板使用 Mini USB 接口或者 DC-005 连接器提供 5V 电源。 * 下载程序:下载程序到评估板需要一套 JLink 或者使用 GD-Link 工具。 * 串口连接:使用 USB 转串口线连接评估版串口0的 PA9 和 PA10 引脚,并连接电脑。 ## 2. 运行测试代码 ## 打开 MDK 或者 IAR 工程文件,添加附件的测试代码文件到工程,如下图所示: ![GPS2.png](/uploads/201804/28/151104x42h8negni5h2ggb.png) 然后再 main 函数里调用测试代码的`app_init()`函数: ```c #include
#include
extern rt_err_t app_init(void); int main(void) { /* user app entry */ if (RT_EOK != app_init()) { rt_kprintf("app operate failed!
"); } return 0; } ``` `app_init()`函数首先会对串口的相关参数进行配置,以适配 GPS 模块,然后会创建一个 gps 线程,线程中串口1会以中断接收的方式接收 GPS 模块发送的数据,并打印出来。 ### 运行结果 在电脑端使用 putty 打开对应端口,波特率配置为115200,编译代码并下载至开发板,然后按 reset 重启开发板,putty 会显示从GPS模块接收到的数据。 ![GPS1.png](/uploads/201804/28/151104kvh8vzhdvb4n4g8m.png) ## 3. 如何使用RT-Thread 串口驱动获取GPS传感器数据? ## ### 3.1 使用哪一个串口? GD32303E-EVAL BSP默认已经使能了串口0(USART0)和串口1(USART1),串口0连接了 USB 转串口模块,因此可以使用串口1来获取GPS传感器的数据。调用`rt_device_find()`函数,传入串口名称,查找系统已经注册的串口设备,并保存串口设备句柄。源码如下: ```c #define GPS_USE_UART "uart1" /* 串口设备句柄 */ static rt_device_t uart_device = RT_NULL; /* 查找系统中的串口设备 */ uart_device = rt_device_find(GPS_USE_UART); if (RT_NULL == uart_device) { rt_kprintf(" find device %s failed!
",GPS_USE_UART); return RT_EINVAL; } ``` ** 注 **:系统运行后可在 shell使用`list_device`命令查看已经注册的设备: ![list_device.png](/uploads/201804/28/151104hj27dffjv9j4di4f.png) ### 3.2 配置串口传输模式 串口驱动在注册串口的时候会使用RT-Thread提供的默认的配置参数配置串口,本示例需要修改串口的波特率和接受缓冲区大小以适配GPS模块。GPS一次性发送数据过多,默认配置的缓冲区大小是64字节,若 gps 线程一直没有处理缓冲区的数据那么缓冲区的数据将会被新数据覆盖,造成数据丢失,所以当接收的数据过多的时候需要修改缓冲区大小。 调用`rt_device_control()`函数对串口进行配置。 注意:对缓冲区的修改必须在串口打开以前完成,对串口传输模式的修改需要在串口打开后才可完成。源码如下: ```c struct serial_configure gps_use_config = { BAUD_RATE_9600, /* 9600 bits/s */ DATA_BITS_8, /* 8 databits */ STOP_BITS_1, /* 1 stopbit */ PARITY_NONE, /* No parity */ BIT_ORDER_LSB, /* LSB first sent */ NRZ_NORMAL, /* Normal mode */ 1024, /* Buffer size */ 0 }; if (RT_EOK != rt_device_control(uart_device, RT_DEVICE_CTRL_CONFIG,(void *)&gps_use_config)) { rt_kprintf("uart config failed.
"); } if (uart_open(uart_device) != RT_EOK) { rt_kprintf("uart open error.
"); } if (RT_EOK != rt_device_control(uart_device, RT_DEVICE_CTRL_CONFIG,(void *)&gps_use_config)) { rt_kprintf("uart config failed.
"); } ``` ### 3.3 打开串口 串口1配置为中断接收的方式打开,调用`rt_device_open()`打开串口,源码如下: ```c /* 串口接收事件标志 */ #define UART_RX_EVENT (1 << 0) /* 事件控制块 */ static struct rt_event event; static rt_err_t uart_open(rt_device_t device) { rt_err_t res; if (device != RT_NULL) { res = rt_device_set_rx_indicate(device, uart_intput); /* 检查返回值 */ if (res != RT_EOK) { rt_kprintf("set %s rx indicate error.%d
",device->parent.name,res); return -RT_ERROR; } /* 打开设备,以可读写、中断方式 */ res = rt_device_open(device, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX ); /* 检查返回值 */ if (res != RT_EOK) { rt_kprintf("open %s device error.%d
",device->parent.name,res); return -RT_ERROR; } /* 初始化事件对象 */ rt_event_init(&event, "event", RT_IPC_FLAG_FIFO); return RT_EOK; } else { rt_kprintf("can't open %s device.
",device->parent.name); return -RT_ERROR; } } ``` ### 3.4 读取串口数据 串口1接收到数据后会执行中断回调函,此数会发送一个事件标志,这个标志会触发正在等待这个事件的线程。调用 `rt_device_read()`读取数据,源码如下: ```c /* 回调函数 */ static rt_err_t uart_intput(rt_device_t dev, rt_size_t size) { /* 发送事件 */ rt_event_send(&event, UART_RX_EVENT); return RT_EOK; } ... ... static rt_uint8_t uart_getchar(void) { rt_uint32_t e; rt_uint8_t ch; /* 读取1字节数据 */ while (rt_device_read(uart_device, 0, &ch, 1) != 1) { /* 接收事件 */ rt_event_recv(&event, UART_RX_EVENT,RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR,RT_WAITING_FOREVER, &e); } return ch; } ``` 本章节大致讲解了RT-Thread 串口设备接口的使用,更多源码请参考测试代码。若需要使用其他相关接口,请参考RT-Thread 串口设备应用笔记,若要对工程进行配置请参考ENV工具的使用。 ## 4. 参考 * [ENV工具](https://www.rt-thread.org/document/site/rtthread-development-guide/rtthread-tool-manual/env/env-user-manual/) * [GD32303E-EVAL](http://gd32mcu.21ic.com/site) * [串口设备应用笔记](https://www.rt-thread.org/document/site/rtthread-application-note/driver/uart/an0001-rtthread-driver-uart/) * [玩溜GD32303E-EVAL BSP系列(一)------基本系统跑起来~](https://www.rt-thread.org/qa/thread-7027-1-1.html) * [GD32303E-EVAL BSP源码及资料百度云盘链接](https://pan.baidu.com/s/1uHza1tiVUnmg8ixMzZLAFA)
查看更多
7
个回答
默认排序
按发布时间排序
touren
2018-05-02
这家伙很懒,什么也没写!
赞 ....
我夏了夏天
认证专家
2018-05-02
Life isn't about finding yourself, life is about creating yourself.
赞!!!
lukgeeker
2019-02-26
这家伙很懒,什么也没写!
顶~~~~~~
shanyinglee
2019-06-28
这家伙很懒,什么也没写!
蛮好的~~~
是阿晋啊
2019-08-29
这家伙很懒,什么也没写!
这个gps不需要发帧吗
我爱学习
2021-04-06
这家伙很懒,什么也没写!
请问有源码吗?
惊鸿一面
2021-06-09
这家伙很懒,什么也没写!
膜拜大佬,请问可以发一下源码吗,有的细节还是看不太明白
撰写答案
登录
注册新账号
关注者
0
被浏览
5.1k
关于作者
misonyo
这家伙很懒,什么也没写!
提问
5
回答
180
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
RT-Thread项目助手v0.2.0 - 支持Env Windows
2
RttreadV5.10上,GD32F450Z RTC时间显示问题
3
rt-smart启动流程分析
4
EtherKit快速上手PROFINET
5
RTThread USB转串口无法接收数据
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部