mirror of
https://github.com/DashyFox/StackSport.git
synced 2025-06-28 05:09:32 +00:00
Working UART
This commit is contained in:
@ -24,19 +24,6 @@ void UART3_START() {
|
||||
HAL_UART_Receive_DMA(&huart3, uart_rx_buffer, UART_BUFFER_SIZE);
|
||||
}
|
||||
|
||||
//void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
|
||||
// if (huart->Instance == USART3) {
|
||||
// uartTimer = millis();
|
||||
// packet_index++;
|
||||
//
|
||||
// CDC_Transmit_FS(uart_rx_buffer, UART_BUFFER_SIZE);
|
||||
//
|
||||
// if (packet_index < UART_BUFFER_SIZE) {
|
||||
// HAL_UART_Receive_DMA(&huart3, &uart_rx_buffer[packet_index], 1);
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
||||
volatile uint32_t last_rx_time = 0;
|
||||
volatile uint32_t rx_complete_timeout = 10;
|
||||
volatile uint32_t old_pos = 0;
|
||||
@ -53,16 +40,16 @@ void handle_rx_complete(uint8_t *data, uint16_t len)
|
||||
return;
|
||||
}
|
||||
|
||||
// Распечатать пришедший буфер с указанием номеров байт
|
||||
char byte_msg[128];
|
||||
snprintf(byte_msg, sizeof(byte_msg), "Received buffer (%d bytes):\n", len);
|
||||
CDC_Transmit_FS((uint8_t*) byte_msg, strlen(byte_msg));
|
||||
|
||||
for (uint16_t i = 0; i < len; i++) {
|
||||
char byte_info[32];
|
||||
snprintf(byte_info, sizeof(byte_info), "Byte %d: 0x%02X\n", i, data[i]);
|
||||
CDC_Transmit_FS((uint8_t*) byte_info, strlen(byte_info));
|
||||
}
|
||||
// // Распечатать пришедший буфер с указанием номеров байт
|
||||
// char byte_msg[128];
|
||||
// snprintf(byte_msg, sizeof(byte_msg), "Received buffer (%d bytes):\n", len);
|
||||
// CDC_Transmit_FS((uint8_t*) byte_msg, strlen(byte_msg));
|
||||
//
|
||||
// for (uint16_t i = 0; i < len; i++) {
|
||||
// char byte_info[32];
|
||||
// snprintf(byte_info, sizeof(byte_info), "Byte %d: 0x%02X\n", i, data[i]);
|
||||
// CDC_Transmit_FS((uint8_t*) byte_info, strlen(byte_info));
|
||||
// }
|
||||
|
||||
// Проверка правильности пакета (первый байт должен быть 0xF0)
|
||||
if (data[0] != 0xF0) {
|
||||
@ -100,7 +87,7 @@ void handle_rx_complete(uint8_t *data, uint16_t len)
|
||||
return;
|
||||
}
|
||||
|
||||
CDC_Transmit_FS((uint8_t*)"\n\n", 2);
|
||||
// CDC_Transmit_FS((uint8_t*)"\n\n", 2);
|
||||
|
||||
// Если пакет корректен, передать управление обработчику команд
|
||||
uint8_t *data_ptr = &data[2];
|
||||
@ -144,16 +131,14 @@ void check_uart3_timeout(void)
|
||||
}
|
||||
|
||||
void UART3_Handler() {
|
||||
// Текущая позиция в буфере (DMA передаёт значение обратного счётчика)
|
||||
uint32_t pos = UART_BUFFER_SIZE - __HAL_DMA_GET_COUNTER(&hdma_usart3_rx);
|
||||
|
||||
if (pos != old_pos)
|
||||
{
|
||||
// Если есть новые данные, обновляем таймер
|
||||
last_rx_time = millis();
|
||||
rx_in_progress = 1;
|
||||
process_uart_data(old_pos, pos); // Обрабатываем новые данные
|
||||
old_pos = pos; // Обновляем позицию
|
||||
process_uart_data(old_pos, pos);
|
||||
old_pos = pos;
|
||||
}
|
||||
else if (rx_in_progress && (millis() - last_rx_time) > rx_complete_timeout)
|
||||
{
|
||||
@ -164,34 +149,47 @@ void UART3_Handler() {
|
||||
}
|
||||
}
|
||||
|
||||
void SendResponse(uint8_t command, uint8_t result, uint8_t *data,
|
||||
uint8_t data_length) {
|
||||
uint8_t response_buffer[64];
|
||||
uint8_t index = 0;
|
||||
void SendResponse(uint8_t command, uint8_t result, uint8_t *data, uint8_t data_length) {
|
||||
uint8_t response_buffer[64];
|
||||
uint8_t index = 0;
|
||||
|
||||
response_buffer[index++] = 0xF0;
|
||||
response_buffer[index++] = data_length + 3;
|
||||
response_buffer[index++] = command;
|
||||
response_buffer[index++] = result;
|
||||
response_buffer[index++] = 0xF0; // Начальный байт
|
||||
response_buffer[index++] = data_length + 2; // Длина данных + 2 байта (команда, результат)
|
||||
response_buffer[index++] = command; // Команда
|
||||
response_buffer[index++] = result; // Результат
|
||||
|
||||
if (data != NULL && data_length > 0) {
|
||||
for (uint8_t i = 0; i < data_length; i++) {
|
||||
response_buffer[index++] = data[i];
|
||||
}
|
||||
}
|
||||
if (data != NULL && data_length > 0) {
|
||||
for (uint8_t i = 0; i < data_length; i++) {
|
||||
response_buffer[index++] = data[i];
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t checksum = 0;
|
||||
for (uint8_t i = 0; i < index; i++) {
|
||||
checksum += response_buffer[i];
|
||||
}
|
||||
checksum %= 0xFF;
|
||||
uint16_t checksum = 0;
|
||||
for (uint8_t i = 0; i < index; i++) {
|
||||
checksum += response_buffer[i];
|
||||
}
|
||||
checksum %= 0xFF;
|
||||
|
||||
response_buffer[index++] = checksum;
|
||||
HAL_UART_Transmit(&huart3, response_buffer, index, HAL_MAX_DELAY);
|
||||
response_buffer[index++] = checksum;
|
||||
|
||||
// // Печать пакета в CDC с нумерацией байт
|
||||
// char byte_msg[128];
|
||||
// snprintf(byte_msg, sizeof(byte_msg), "Sending response buffer (%d bytes):\n", index);
|
||||
// CDC_Transmit_FS((uint8_t*) byte_msg, strlen(byte_msg));
|
||||
//
|
||||
// for (uint8_t i = 0; i < index; i++) {
|
||||
// char byte_info[32];
|
||||
// snprintf(byte_info, sizeof(byte_info), "Byte %d: 0x%02X\n", i, response_buffer[i]);
|
||||
// CDC_Transmit_FS((uint8_t*) byte_info, strlen(byte_info));
|
||||
// }CDC_Transmit_FS((uint8_t*) "\n\n", 2);
|
||||
|
||||
HAL_UART_Transmit(&huart3, response_buffer, index, HAL_MAX_DELAY);
|
||||
}
|
||||
|
||||
|
||||
void UART3_CMD_Handler(uint8_t *dataPtr, uint8_t len) {
|
||||
uint8_t command = dataPtr[0];
|
||||
if(command != 0xb5){
|
||||
|
||||
print("Received command: ");
|
||||
printNumber(command);
|
||||
@ -204,6 +202,7 @@ void UART3_CMD_Handler(uint8_t *dataPtr, uint8_t len) {
|
||||
}
|
||||
}
|
||||
print("]\n");
|
||||
}
|
||||
|
||||
switch (command) {
|
||||
case 10:
|
||||
|
Reference in New Issue
Block a user