实现蓝牙协议解析
This commit is contained in:
parent
00ee34a664
commit
5ed416bc55
|
@ -1,75 +1,65 @@
|
|||
#include "bluetooth.h"
|
||||
#include "usart.h"
|
||||
#include "control.h"
|
||||
#include "stdio.h"
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#define BUFFER_SIZE 100
|
||||
#define MESSAGE_SIZE 19
|
||||
#define CMD_NUM 9
|
||||
|
||||
static uint8_t rxBuffer[BUFFER_SIZE], rxSize;
|
||||
static uint8_t txBuffer[BUFFER_SIZE], txSize;
|
||||
static int8_t rxBuffer[BUFFER_SIZE], txBuffer[BUFFER_SIZE];
|
||||
static uint8_t cmdIndex;
|
||||
|
||||
void BLUETOOTH_Init(void)
|
||||
{
|
||||
rxSize = 0;
|
||||
HAL_UART_Receive_IT(&huart2, rxBuffer, 1);
|
||||
HAL_UARTEx_ReceiveToIdle_DMA(&huart2, rxBuffer, 100);
|
||||
}
|
||||
|
||||
void receiveCmd()
|
||||
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
|
||||
{
|
||||
// 通用协议
|
||||
if (rxBuffer[2] == ',')
|
||||
if (huart == &huart2 && rxBuffer[0] == '$' && rxBuffer[Size - 1] == '#')
|
||||
{
|
||||
cmdIndex = 0;
|
||||
for (uint8_t i = 1; i < MESSAGE_SIZE; i += 2)
|
||||
if (rxBuffer[i] == '0')
|
||||
++cmdIndex;
|
||||
else
|
||||
break;
|
||||
if (cmdIndex == CMD_NUM)
|
||||
// 通用协议
|
||||
if (rxBuffer[2] == ',')
|
||||
{
|
||||
cmdIndex = 0;
|
||||
CONTROL_CommonCmd(cmdIndex, rxBuffer[cmdIndex * 2 + 1]);
|
||||
}
|
||||
else
|
||||
{
|
||||
static uint16_t num[6];
|
||||
switch (rxBuffer[5])
|
||||
{
|
||||
// 机械手
|
||||
case 'S':
|
||||
break;
|
||||
// 舵机云台
|
||||
case 'P':
|
||||
break;
|
||||
// 七彩灯
|
||||
case 'C':
|
||||
sscanf(rxBuffer + 5, "%*3s%hu,%*3s%hu,%*3s%hu", num, num + 1, num + 2);
|
||||
CONTROL_RGB(num[0], num[1], num[2]);
|
||||
break;
|
||||
|
||||
// 模式选择
|
||||
case 'M':
|
||||
sscanf(rxBuffer + 5, "%*4s%lc%lc", num, num + 1);
|
||||
CONTROL_Mode(num[0] - '0', num[1] - '0');
|
||||
break;
|
||||
for (uint8_t i = 1; i < MESSAGE_SIZE; i += 2)
|
||||
if (rxBuffer[i] == '0')
|
||||
++cmdIndex;
|
||||
else
|
||||
break;
|
||||
if (cmdIndex == CMD_NUM)
|
||||
cmdIndex = 0;
|
||||
CONTROL_CommonCmd(cmdIndex, rxBuffer[cmdIndex * 2 + 1]);
|
||||
}
|
||||
}
|
||||
HAL_UART_Transmit(&huart1, rxBuffer, rxSize, 1000);
|
||||
}
|
||||
|
||||
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
|
||||
{
|
||||
if (huart == &huart2)
|
||||
{
|
||||
if (rxSize && rxBuffer[rxSize] == '#')
|
||||
else
|
||||
{
|
||||
if (++rxSize > 10)
|
||||
receiveCmd();
|
||||
BLUETOOTH_Init();
|
||||
static uint16_t num[6];
|
||||
switch (rxBuffer[5])
|
||||
{
|
||||
// 机械手
|
||||
case 'S':
|
||||
break;
|
||||
// 舵机云台
|
||||
case 'P':
|
||||
break;
|
||||
// 七彩灯
|
||||
case 'C':
|
||||
sscanf(rxBuffer + 5, "%*3s%hu,%*3s%hu,%*3s%hu", num, num + 1, num + 2);
|
||||
CONTROL_RGB(num[0], num[1], num[2]);
|
||||
break;
|
||||
|
||||
// 模式选择
|
||||
case 'M':
|
||||
sscanf(rxBuffer + 5, "%*4s%c%c", num, num + 1);
|
||||
CONTROL_Mode(num[0] - '0', num[1] - '0');
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (rxSize++ == 0 && rxBuffer[0] == '$')
|
||||
HAL_UART_Receive_IT(&huart2, rxBuffer + rxSize, 1);
|
||||
memcpy(txBuffer, rxBuffer, Size);
|
||||
printf("%s", txBuffer);
|
||||
HAL_UART_Transmit_IT(&huart2, txBuffer, Size);
|
||||
BLUETOOTH_Init();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user