может кто-нибудь объяснить, почему я могу получить только 13 символов с прерыванием USART? Я использую '\n' для определения конца строки.
#define BUFFER_SIZE 100
char receive_buffer[BUFFER_SIZE];
char receive_data;
int receive_index = NULL;
int data_ready_index = NULL;
void USART2_receive(void const * argument){
for(;;){
if(data_ready_index == 1){
HAL_UART_Transmit_IT(&huart2, (uint8_t *)"Received data: ", strlen("Received data: "));
HAL_Delay(50);
HAL_UART_Transmit_IT(&huart2, (uint8_t *)receive_buffer, strlen(receive_buffer));
memset(receive_buffer, NULL, sizeof(receive_buffer));
HAL_Delay(50);
HAL_UART_Transmit_IT(&huart2, (uint8_t *)"\r\n", strlen("\r\n"));
data_ready_index = NULL;
}
}
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if (huart->Instance == USART2){
if (receive_data != 13){
receive_buffer[receive_index++]=receive_data;
}else{
receive_index = NULL;
data_ready_index = 1;
// Received data ready to be processed
}
}
}
void USART2_IRQHandler(void){
HAL_UART_IRQHandler(&huart2);
HAL_UART_Receive_IT(&huart2, (uint8_t *) &receive_data, 1);
}
Я нашел проблему. В функции void USART2_receive(void const * arguments) я увеличил задержку с 50 до 100, после чего все работает нормально. Как упоминал @MITURAJ, это может быть вызвано переполнением буфера.
void USART2_receive(void const * argument){
for(;;){
if(data_ready_index == 1){
HAL_UART_Transmit_IT(&huart2, (uint8_t *)"Received data: ",
strlen("Received data: "));
HAL_Delay(100);
HAL_UART_Transmit_IT(&huart2, (uint8_t *)receive_buffer,
strlen(receive_buffer));
HAL_Delay(100);
HAL_UART_Transmit_IT(&huart2, (uint8_t *)"\r\n", strlen("\r\n"));
data_ready_index = NULL;
memset(receive_buffer, NULL, sizeof(receive_buffer));
}
}
}
Обнаружение того, что вам нужна более длительная задержка, должно подсказать вам, что вы не ждете фактического завершения Tx. HAL_UART_Transmit_IT использует прерывание для отправки байтов (это не блокирует). По сути, вы говорите ему передать, немного подождать и снова втиснуть данные в буфер, прежде чем передача будет завершена!
Вместо этого я предлагаю вам отслеживать обратный вызов HAL_UART_TxCpltCallback и, как только это произойдет, установить какой-либо флаг. В вашей функции USART2_receive подождите, пока будет установлен флаг, прежде чем снова запрашивать отправку. Не забудьте очистить флаг, прежде чем ждать его повторной установки :)
Тревор_G
Арсенал
\n
но ваш код проверяет,\r
что равно 13, и вы обрабатываете только 13 байтов, но тогда почему выдаетеstrlen
больше 13 и отправляете с ними несколько 0x00 байтов (<0>) - сообщение, которое вы возвращаете это длина передаваемого сообщения, только содержимое последних 3 байтов неверно.Into_Embedded
Тревор_G
Into_Embedded
Тревор_G
Into_Embedded
Тревор_G
Миту Радж
Into_Embedded
Миту Радж
Into_Embedded
Миту Радж
Into_Embedded
Миту Радж
Миту Радж
Миту Радж
Into_Embedded