1. 项目概述与硬件选型
这个基于STM32的北斗/GPS双模定位系统,是我去年为一个农业无人机项目开发的定位子系统。核心功能是通过蓝牙主从通信,将定位模块获取的经纬度信息实时传输到VB开发的上位机界面显示。整套系统在实际田间测试中表现稳定,定位精度达到了2.5米以内,完全满足农用设备的作业需求。
1.1 硬件架构解析
主控芯片选用了经典的STM32F103C8T6,这款Cortex-M3内核的MCU在性价比和性能上达到了很好的平衡。其内置的3个USART接口正好满足本项目需求:
- USART1用于调试输出
- USART2连接定位模块
- USART3连接蓝牙模块
定位模块采用的是中科微ATGM332D,选择它主要基于三个考量:
- 同时支持北斗BDS和GPS双系统定位,在复杂环境下可用卫星数量更多
- 内置陶瓷天线,体积小巧(16×12mm)适合嵌入式集成
- 功耗仅45mA@3.3V,比同类产品低20%左右
蓝牙模块选用HC-05主从一体模块,具体型号是汇承科技的HC-05-6。这个选择经历了实际测试对比:
- 传输距离:无障碍环境下实测可达30米
- 功耗:配对状态下约8mA,传输时峰值25mA
- 支持SPP协议,可直接当作虚拟串口使用
硬件连接关键点:定位模块的TX接STM32的USART2_RX(PA3),蓝牙模块的RX接USART3_TX(PB10)。特别注意蓝牙模块的VCC要接3.3V,5V会损坏模块。
1.2 系统工作原理
系统采用主从式架构设计,数据流向如下:
- 定位模块每秒通过串口输出NMEA-0183协议数据
- STM32解析GPRMC语句获取经纬度、速度等信息
- 主控将数据打包后通过HC-05主机发送
- 从机HC-05接收数据并转发给上位机串口
- VB程序解析数据并在GMap.NET控件上显示位置
这种架构的优势在于:
- 主从分离降低单节点负载
- 蓝牙无线传输避免布线限制
- 上位机可灵活部署在控制室或移动设备
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. STM32端关键实现
2.1 NMEA协议解析优化
ATGM332D模块默认输出频率为1Hz,会连续发送如下语句:
code复制$GPGGA,...*hh
$GPGLL,...*hh
$GPRMC,...*hh
$GPVTG,...*hh
我们只需要关注$GPRMC语句,它包含完整的定位信息:
code复制$GPRMC,085120.307,A,2232.8946,N,11355.2353,E,0.00,0.00,220623,,,A*68
在串口中断中采用环形缓冲区存储数据:
c复制#define GPS_BUF_SIZE 256
volatile uint8_t gpsBuffer[GPS_BUF_SIZE];
volatile uint16_t rxIndex = 0;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if(huart->Instance == USART2) {
gpsBuffer[rxIndex++] = rxData;
if(rxIndex >= GPS_BUF_SIZE) rxIndex = 0;
HAL_UART_Receive_IT(&huart2, &rxData, 1);
}
}
解析时采用状态机提高效率:
c复制typedef enum {
WAIT_START,
IN_MESSAGE,
CHECK_CRC
} ParserState;
ParserState state = WAIT_START;
for(int i=0; i<rxIndex; i
