Car/Core/Src/bluetooth.c

76 lines
1.7 KiB
C

#include "bluetooth.h"
#include "usart.h"
#include "control.h"
#include "stdio.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 uint8_t cmdIndex;
void BLUETOOTH_Init(void)
{
rxSize = 0;
HAL_UART_Receive_IT(&huart2, rxBuffer, 1);
}
void receiveCmd()
{
// 通用协议
if (rxBuffer[2] == ',')
{
cmdIndex = 0;
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]);
}
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;
}
}
HAL_UART_Transmit(&huart1, rxBuffer, rxSize, 1000);
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart == &huart2)
{
if (rxSize && rxBuffer[rxSize] == '#')
{
if (++rxSize > 10)
receiveCmd();
BLUETOOTH_Init();
}
else if (rxSize++ == 0 && rxBuffer[0] == '$')
HAL_UART_Receive_IT(&huart2, rxBuffer + rxSize, 1);
}
}