könnte jemand erklären, warum ich nur 13 Zeichen mit USART-Interrupt empfangen kann? Ich verwende '\n', um das Ende der Zeichenfolge zu erkennen.
#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);
}
Ich habe das Problem gefunden. In der Funktion void USART2_receive(void const * argument) habe ich die Verzögerung von 50 auf 100 erhöht und dann funktioniert alles einwandfrei. Wie @MITURAJ erwähnt hat, kann dies durch einen Pufferüberlauf verursacht werden.
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));
}
}
}
Wenn Sie feststellen, dass Sie eine längere Verzögerung benötigen, sollten Sie darauf hinweisen, dass Sie nicht darauf warten, dass der Tx tatsächlich beendet wird. HAL_UART_Transmit_IT verwendet einen Interrupt, um Bytes zu senden (es ist nicht blockierend). Sie sagen ihm im Grunde, dass er senden soll, warten ein wenig und stopfen Daten erneut in den Puffer, bevor die Übertragung abgeschlossen ist!
Stattdessen schlage ich vor, dass Sie den Rückruf an HAL_UART_TxCpltCallback überwachen und sobald dies geschieht, ein Flag setzen. Warten Sie in Ihrer USART2_receive-Funktion, bis das Flag gesetzt ist, bevor Sie es auffordern, Dinge erneut zu senden. Denken Sie daran, das Flag zu löschen, bevor Sie darauf warten, dass es wieder gesetzt wird :)
Trevor_G
Arsenal
\n
aber Ihr Code prüft,\r
was 13 ist, und Sie verarbeiten nur 13 Bytes, aber warum gibt dannstrlen
mehr als 13 an und sendet einige 0x00-Bytes mit (<0>) - die Nachricht, die Sie zurückbekommen ist die Länge der übertragenen Nachricht nur der Inhalt der letzten 3 Bytes falsch.Into_Embedded
Trevor_G
Into_Embedded
Trevor_G
Into_Embedded
Trevor_G
Mitu Raj
Into_Embedded
Mitu Raj
Into_Embedded
Mitu Raj
Into_Embedded
Mitu Raj
Mitu Raj
Mitu Raj
Into_Embedded