강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

민재님의 프로필 이미지
민재

작성한 질문수

interrupt 방식 문자열 송수신 질문이있습니다.

작성

·

374

0

HAL_UART_Receive_IT(&huart1, receivedData, 2); // 이것만 했을경우 문제점 <- 초기화가안된다. 데이터 5개를 수신하면 인터럽트를 발생시킨다.

HAL_UART_Receive_IT(&huart1, receivedData, 5); // 이것만 했을경우 문제점 <- 초기화가안된다. 데이터 5개를 수신하면 인터럽트를 발생시킨다.

 

이런식으로 main문에 문자열 2개를 받으면 위에문을 실행시키고 5개를받으면 아래의 receive를받고싶습니다

예를들어서 "hi"를 입력받으면 위에 receive문을 받아서 hi, hello라는 문자열을 출력해주고, "byeby"를 입력받으면 BYE, BYE라는 문자열을 출력해주고 싶은데 어떻게 하면 될지 알려주시면 감사하겠습니다.

답변 1

0

안녕하세요, 인프런 AI 인턴이에요.

UART 통신에서 interrupt 방식으로 문자열 송수신을 처리하고 싶으시군요. 입력받은 문자열에 따라 다르게 처리하기 위해서는 일정 길이의 문자열을 송수신할 때마다 인터럽트를 발생시켜야 합니다. 다음은 예시 코드로 설명 드리겠습니다.

#include <stdio.h>
#include <string.h>

#define MAX_BUFFER_SIZE 10

UART_HandleTypeDef huart1;
char receivedData[MAX_BUFFER_SIZE];
int bufferCount = 0;
char command1[3] = "hi";
char command2[6] = "byebye";

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
    if (huart->Instance == USART1) {
        if (bufferCount >= 2) {
            // 2개의 문자를 수신했을 때 처리할 내용
            if (strncmp(receivedData, command1, 2) == 0) {
                printf("hi, hello\n");
            }
        }
        else if (bufferCount >= 6) {
            // 6개의 문자를 수신했을 때 처리할 내용
            if (strncmp(receivedData, command2, 6) == 0) {
                printf("BYE, BYE\n");
            }
        }
        
        // 수신 버퍼 초기화
        bufferCount = 0;
        memset(receivedData, 0, sizeof(receivedData));
        
        // 다음 수신 대기
        HAL_UART_Receive_IT(&huart1, (uint8_t*)receivedData, 1);
    }
}

int main() {
    // UART 초기화
    HAL_UART_Receive_IT(&huart1, (uint8_t*)receivedData, 1);
    
    // 무한 루프
    while (1) {
        // 추가적인 처리 또는 다른 동작 수행
    }
}

위의 코드는 UART 수신 시 인터럽트가 발생하면 HAL_UART_RxCpltCallback 함수가 호출되고, 수신한 문자열에 따라 처리를 하는 예시입니다. 문자열 길이가 2인 경우 "hi"를 수신했을 때 "hi, hello"를 출력하고, 문자열 길이가 6인 경우 "byebye"를 수신했을 때 "BYE, BYE"를 출력합니다. 수신된 버퍼를 초기화한 후 다음 수신 대기를 진행합니다.

한 가지 주의하실 점은 HAL_UART_RxCpltCallback 함수는 인터럽트 핸들러로 동작하기 때문에 매우 짧은 시간 내에서 처리가 완료되어야 합니다. 따라서 복잡한 연산이나 긴 작업을 수행하는 경우에는 다른 방법을 고려해야 합니다.

이 코드는 예시일 뿐이며, 실제로 사용하실 때에는 자신의 요구사항에 맞게 수정하셔야 합니다. 참고가 되셨으면 좋겠습니다. 추가로 궁금한 점이 있으면 얼마든지 물어보세요!

민재님의 프로필 이미지
민재

작성한 질문수

질문하기