当前位置: 首页 > news >正文

基于STM32F1x系列与JY901模块串口通信

一、硬件

JY901引脚 STM32F103引脚 功能说明
VCC 3.3V 电源供电
GND GND 地线
TX PA10 (USART1_RX) 接收数据
RX PA9 (USART1_TX) 发送数据

二、STM32串口配置代码(HAL库)

// usart.c
#include "stm32f1xx_hal.h"UART_HandleTypeDef huart1;void MX_USART1_UART_Init(void)
{huart1.Instance = USART1;huart1.Init.BaudRate = 115200;        // 默认波特率huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart1.Init.OverSampling = UART_OVERSAMPLING_16;if (HAL_UART_Init(&huart1) != HAL_OK){Error_Handler();}
}// 重定向printf函数
int fputc(int ch, FILE *f)
{HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, HAL_MAX_DELAY);return ch;
}

三、数据接收与解析

1. 数据结构定义

typedef struct {uint8_t header[2];    // 起始符 0x55 0xAAuint8_t addr;         // 地址位uint8_t ctrl;         // 控制码uint16_t length;      // 数据长度uint8_t data[64];     // 数据域uint8_t checksum;     // 校验和
} JY901_Frame;typedef struct {float accel[3];       // 加速度 (g)float gyro[3];        // 角速度 (°/s)float angle[3];       // 角度 (°)float mag[3];         // 磁场 (mG)float pressure;       // 气压 (hPa)float altitude;       // 高度 (m)
} JY901_Data;

2. DMA接收配置

#define RX_BUFFER_SIZE 256uint8_t rx_buffer[RX_BUFFER_SIZE];
JY901_Frame current_frame;void MX_DMA_Init(void)
{__HAL_RCC_DMA1_CLK_ENABLE();DMA_HandleTypeDef hdma_usart1_rx;hdma_usart1_rx.Instance = DMA1_Channel5;hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE;hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE;hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;hdma_usart1_rx.Init.Mode = DMA_CIRCULAR;hdma_usart1_rx.Init.Priority = DMA_PRIORITY_HIGH;if (HAL_DMA_Init(&hdma_usart1_rx) != HAL_OK){Error_Handler();}__HAL_LINKDMA(&huart1, hdmarx, hdma_usart1_rx);HAL_UART_Receive_DMA(&huart1, rx_buffer, RX_BUFFER_SIZE);
}

四、数据解析核心代码

void USART1_IRQHandler(void)
{HAL_UART_IRQHandler(&huart1);if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE)){__HAL_UART_CLEAR_IDLEFLAG(&huart1);// 计算接收数据长度uint16_t len = RX_BUFFER_SIZE - __HAL_DMA_GET_COUNTER(huart1.hdmarx);// 解析数据帧if(Parse_Frame(rx_buffer, len, &current_frame)){// 数据处理Process_JY901_Data(&current_frame, &sensor_data);}}
}// 数据帧解析函数
bool Parse_Frame(uint8_t *buffer, uint16_t len, JY901_Frame *frame)
{if(len < 10) return false;  // 最小帧长度// 检查起始符if(buffer[0] != 0x55 || buffer[1] != 0xAA) return false;frame->addr = buffer[2];frame->ctrl = buffer[3];frame->length = (buffer[4] << 8) | buffer[5];// 检查数据长度合法性if(frame->length > RX_BUFFER_SIZE - 8) return false;// 复制数据域memcpy(frame->data, buffer+6, frame->length);// 校验和验证uint8_t checksum = 0;for(int i=2; i<6+frame->length; i++) checksum += buffer[i];if(checksum != buffer[6+frame->length]) return false;return true;
}

五、数据处理与输出

void Process_JY901_Data(JY901_Frame *frame, JY901_Data *data)
{static float accel_scale = 16.0f/32768.0f;  // ±2g量程static float gyro_scale = 2000.0f/32768.0f; // ±2000°/s量程// 解析加速度data->accel[0] = (frame->data[0] | (frame->data[1]<<8)) * accel_scale;data->accel[1] = (frame->data[2] | (frame->data[3]<<8)) * accel_scale;data->accel[2] = (frame->data[4] | (frame->data[5]<<8)) * accel_scale;// 解析角速度data->gyro[0] = (frame->data[6] | (frame->data[7]<<8)) * gyro_scale;data->gyro[1] = (frame->data[8] | (frame->data[9]<<8)) * gyro_scale;data->gyro[2] = (frame->data[10]| (frame->data[11]<<8)) * gyro_scale;// 解析角度(示例:Roll/Pitch/Yaw)data->angle[0] = (frame->data[12] | (frame->data[13]<<8)) / 100.0f; // Rolldata->angle[1] = (frame->data[14] | (frame->data[15]<<8)) / 100.0f; // Pitchdata->angle[2] = (frame->data[16] | (frame->data[17]<<8)) / 100.0f; // Yaw
}

六、主程序流程

int main(void)
{HAL_Init();SystemClock_Config();MX_USART1_UART_Init();MX_DMA_Init();printf("JY901 UART Test Start...\r\n");while(1){// 主循环处理其他任务HAL_Delay(10);}
}

参考代码 Jy901通过串口连接stm32f1x的源代码 www.youwenfan.com/contentcnj/71613.html

七、常见问题解决

  1. 数据乱码 检查波特率是否匹配(使用逻辑分析仪验证) 确认TX/RX引脚交叉连接
  2. 校验失败 验证数据帧长度字段是否正确 检查数据解析顺序是否与协议一致
  3. 动态漂移 实现温度补偿算法 定期执行零偏校准
http://www.gsyq.cn/news/25965.html

相关文章:

  • Hash与布隆过滤器
  • 2025年安恒信息深度解析:AI与数据安全双轮驱动的技术演进全景
  • 清单测试
  • 开源手写识别库zinnia
  • 2025年10月中国宝宝辅食品牌推荐榜:深海去刺鱼领衔对比
  • contos 同步SVN 迁移SVN 安装SVN
  • 2025年10月石墨电极厂家推荐榜:十强对比与选购全攻略
  • 2025.10.20 - 10.31
  • Random VIMs
  • 【每日积累】javascript 一文弄懂eval
  • 腾讯云COS通过CDN加速配置指南 - 教程
  • 量子计算25年发展历程与技术挑战
  • 藏宝阁
  • 【GitHub每日速递 251021】一键将全新Arch安装变身超美现代Web开发系统!Omarchy太神了
  • [Mongodb]mongodb的安装以及增删改查
  • 【JavaScript-基础】split,splice,slice 三者的用法
  • 2025 代码源 CSP-S 模拟赛复盘
  • 2025.10.21——1绿
  • 快速提升Entra ID安全性的实用指南
  • 机器学习商业应用实战指南
  • 在线签名工具,手写签名保存为png图片,用于生成电子签名用于word文档等
  • 在线签名工具,保存为png图片,用于生成电子签名用于word文档等
  • 251021
  • CityRefer:城市规模点云数据上的地理感知 3D 视觉接地数据集 - MKT
  • LLM学习笔记DAY8
  • Grounded-SAM 使用文本提示检测和分割所有内容 - MKT
  • mysql数据库查询参考
  • 视觉和语言 国防科大清华城市空间无人机导航推理!GeoNav:赋予多模态大模型地理空间推理能力,实现语言指令导向的空中目标导航 - MKT
  • Python理论题目集
  • 以太坊账⼾模型的理解,合约账⼾、EOA账⼾认识