|

楼主 |
发表于 2024-12-2 22:15:57
|
显示全部楼层
/*
*********************************************************************************************************
*
* 模块名称 : BLUE_TOOTH 串口蓝牙模块驱动程序
* 文件名称 : bsp_bluetooth.c
* 版 本 : V1.1
* 说 明 : 封装 BLUE_TOOTH 模块相关的命令
*
*********************************************************************************************************
*/
#include "bsp.h"
/* BLUE_TOOTH 模块接线图
BLUE_TOOTH模块 STM32-V5开发板
UTXD --- PA3/USART2_RX
GND --- GND
VCC --- 3.3V (供电)
URXD --- PA2/USART2_TX
模块缺省波特率 460800
*/
uint8_t bluetooth_rx_buf[256] = {0}; //蓝牙接收缓存
char bluetooth_tx_buf[256] = {0}; //蓝牙发送缓存
/*
*********************************************************************************************************
* 函 数 名: bsp_InitBLUE_TOOTH
* 功能说明: 初始化二维码扫描模块的串口, 该函数被 bsp_Init() 调用。
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void bsp_InitBLUE_TOOTH(void)
{
bsp_InitUart2(UART2_BAUD);
}
/*
*********************************************************************************************************
* 函 数 名: BLUE_TOOTH_PrintRxData
* 功能说明: 打印STM32从BLUE_TOOTH收到的数据到COM3串口,主要用于跟踪调试
* 形 参: _ch : 收到的数据
* 返 回 值: 无
*********************************************************************************************************
*/
void BLUE_TOOTH_PrintRxData(uint8_t _ch)
{
#ifdef BLUE_TOOTH_TO_COM3_EN
comSendChar(COM3, _ch); /* 将接收到数据打印到调试串口1 */
#endif
}
/*
*********************************************************************************************************
* 函 数 名: BLUE_TOOTH_SendData
* 功能说明: 发送数据包
* 形 参: _databuf 数据
* _len 数据长度
* 返 回 值: 无
*********************************************************************************************************
*/
void BLUE_TOOTH_SendData(uint8_t *_databuf, uint16_t _len)
{
if (_len > 2048)
{
_len = 2048;
}
comSendBuf(COM_BLUE_TOOTH, _databuf, _len);
memset(_databuf, 0, _len);
}
/*
*********************************************************************************************************
* 函 数 名: BLUE_TOOTH_ReadLine
* 功能说明: 读取BLUE_TOOTH返回的一行应答字符串(0x0D 0x0A结束)。该函数根据字符间超时判断结束。 本函数需要紧跟AT命令发送函数。
* 形 参: _pBuf : 存放模块返回的完整字符串
* _usTimeOut : 命令执行超时,0表示一直等待. >0 表示超时时间,单位1ms
* 返 回 值: 0 表示错误(超时) > 0 表示应答的数据长度
*********************************************************************************************************
*/
uint16_t BLUE_TOOTH_ReadLine(uint8_t *_pBuf, uint16_t _usTimeOut)
{
uint8_t ucData;
uint16_t pos = 0;
uint16_t ret = 0;
uint8_t hexMode = 0; // 0: normal mode, 1: hex mode
/* _usTimeOut == 0 表示无限等待 */
if (_usTimeOut > 0)
{
bsp_StartTimer(BLUE_TOOTH_TMR_ID, _usTimeOut); /* 使用软件定时器作为超时控制 */
}
while (1)
{
bsp_Idle(); /* CPU空闲执行的操作, 见 bsp.c 和 bsp.h 文件 */
if (bsp_CheckTimer(BLUE_TOOTH_TMR_ID))
{
ret = 0; /* 成功。 返回数据长度 */
break;
}
if (comGetChar(COM_BLUE_TOOTH, &ucData))
{
BLUE_TOOTH_PrintRxData(ucData); /* 将接收到数据打印到调试串口3 */
if (hexMode == 0)
{
if (ucData == 0xFF)
{
hexMode = 1; // Enter hex mode
pos = 0; // Reset buffer position
}
else if (ucData == 0x0A) // '\n'
{
_pBuf[pos] = 0;
ret = 1; /* 成功。 返回数据长度 */
break;
}
else
{
_pBuf[pos++] = ucData; /* 保存接收到的数据 */
}
}
if (hexMode == 1)
{
_pBuf[pos] = ucData; /* 保存接收到的数据 */
if (pos == 7)
{
g_ucCarMode = _pBuf[1];
g_ucCarDir = _pBuf[2];
g_ulCarPos = (_pBuf[3]<<24) | (_pBuf[4]<<16) | (_pBuf[5]<<8) | (_pBuf[6]);
ret = 2; /* 成功。 返回数据长度 */
break;
}
pos++;
}
}
}
return ret;
}
/*
*********************************************************************************************************
* 函 数 名: BLUE_TOOTH_Parse
* 功能说明: 解析蓝牙数据,设置小车行驶方式,方向,距离,运行状态
* 形 参: _ParseBuf : 待解析数据
* _ucCarMode : 小车行驶方式
* _ucCarDir : 小车行驶方向
* _ulCarPos : 小车行驶距离
* _ucStatus : 小车行驶状态
* 返 回 值: _flag : 解析完成对应标志位
*********************************************************************************************************
*/
FLAG_E BLUE_TOOTH_Parse(uint8_t *_ParseBuf,
uint8_t *_ucCarMode, uint8_t *_ucCarDir, uint32_t *_ulCarPos,
uint8_t *_ucStatus)
{
FLAG_E _flag;
uint8_t* number_start;
// 解析字符串
if (strncmp((char*)_ParseBuf, "Stop", 4) == 0)
{
_flag = Flag_Stop;
}
else if (strncmp((char*)_ParseBuf, "Start", 5) == 0)
{
_flag = Flag_Start;
}
else if (strncmp((char*)_ParseBuf, "_StartTest", 9) == 0)
{
_flag = Flag_StartTest;
}
else if (strncmp((char*)_ParseBuf, "CarMode=", 8) == 0)
{
number_start = _ParseBuf + 8;
*_ucCarMode = atoi((char*)number_start);
_flag = Flag_ChangeCarPar;
}
else if (strncmp((char*)_ParseBuf, "CarDir=", 7) == 0)
{
uint8_t* number_start = _ParseBuf + 7;
*_ucCarDir = atoi((char*)number_start);
_flag = Flag_ChangeCarPar;
}
else if (strncmp((char*)_ParseBuf, "CarPos=", 7) == 0)
{
uint8_t* number_start = _ParseBuf + 7;
*_ulCarPos = atoi((char*)number_start);
_flag = Flag_ChangeCarPar;
}
else if (strncmp((char*)_ParseBuf, "Status=", 7) == 0)
{
uint8_t* number_start = _ParseBuf + 7;
*_ucStatus = (atoi((char*)number_start));
_flag = Flag_ChangeStatus;
}
memset(_ParseBuf, 0, 256);
return _flag;
}
/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
|
|