[STM32#03] HAL_UART_Transmit(), HAL_UART_Receive() 함수를 이용해서 USART2 시리얼통신 해보기!(녹칸다 내맘대로 STM32)
프로그래밍/STM32 2025. 10. 20. 23:13
https://youtube.com/live/VzvWwM-p04Q
[STM32#03] STM32F103RB NUCLEO보드에서 HAL_UART_Transmit(), HAL_UART_Receive() 함수를 이용해서 USART2 시리얼통신 해보기!(녹칸다 내맘대로 STM32)
심심한녹칸다의 내맘대로 STM32시리즈이다!
STM32시리즈의 모든 자료는 구글 슬라이드에 작성하고 모두에게 공유되어있음!
https://docs.google.com/presentation/d/1myA5iYbjuKsLWLqtRLKAiRfwUwvqB1d1RGjiMIIgp3I/edit?slide=id.g39af4024cdb_1_0#slide=id.g39af4024cdb_1_0
이번편에서는 STM32보드에 설정되어있는 USART2를 이용해서 PC와 시리얼통신을 해보도록 한다!
(아두이노와 비교해서 STM32가 더 좋다고 보는것 1)

1.아두이노는 코드를 작성하고 아두이노 보드에 “업로드”를 하게 되면 내가 작성한 코드가 어떻게 작동되는지 중간 현황을 전혀 알 수 없다!
2.아두이노 코드에 변수를 설정했는데, 현재 변수에 입력되어 있는 값을 알아내기 위해서는 디스플레이를 달거나 PC와 통신을 연결해서 PC쪽으로 값을 전송해야 알아낼 수 있다!
3.지금 녹칸다가 사용하는 STM32보드는 뉴클레오 보드이고, 뉴클레오 보드는 ST링크가 내장되어 있는 방식이기 때문에 “디버깅”모드가 지원됨!
4.디버깅모드를 활용하게 되면 STM32보드에 적용될 코드에 변수값이라던지, 작동되는 메커니즘 등을 STM32cubeIDE에서 바로바로 확인할 수 있다!
(예제목차)
1.STM32의 디버깅 기능을 이용해서 1초간격으로 1씩 증가하는 nockanda_cnt라는 변수의 값을 stm32cubeide에서 확인가능 하도록 하시오!
/* USER CODE BEGIN 2 */
int nockanda_cnt = 0;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
nockanda_cnt++; //cnt값을 1씩 증가
HAL_Delay(1000); //1초 쉬기~
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
2.버튼중에 PB1번 버튼을 누르면 nockanda_cnt가 1씩 증가하는데, 녹칸다가 버튼을 누른게 STM32에서 제대로 인식이 되었는지 아닌지를 디버깅모드에서 확인해보시오!
/* USER CODE BEGIN 2 */
int nockanda_cnt = 0;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
//PB1버튼을 누르면 CNT가 1씩 증가한다~
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1) == GPIO_PIN_RESET){
nockanda_cnt++;
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
3.STM32에서 PC쪽으로 1초간격으로 “Hello STM32!!”라는 문자열을 전송하고 PC에서 그 메시지를 받아서 출력하는 예제를 구현하시오!
char text1[] = "hello stm32\n";
char *text2 = "hello stm32\n"; //얘는 text2자체가 이미 포인터임
int num = 10;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
//1초간격으로 "hello stm32\r"라는 문자열을 전송해라!
//그런데 여기서 제일 마지막에 캐리지리턴를 포함하라고 했다!
//if(HAL_UART_Transmit(&huart2, text1, sizeof(text1), 100) == HAL_OK){ // OK!
//if(HAL_UART_Transmit(&huart2, text2, sizeof(text2), 100) == HAL_OK){ // BAD!
//if(HAL_UART_Transmit(&huart2, text1, strlen(text1), 100) == HAL_OK){ // OK!
if(HAL_UART_Transmit(&huart2, text2, strlen(text2), 100) == HAL_OK){ //OK!
//전송 성공!
}else{
//전송 실패!
}
HAL_Delay(1000); //1초 쉬기~
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
4.STM32내부에 1초간격으로 증가하는 nockanda_cnt라는 변수가 있는데, 이 변수의 현재 값을 “nockanda_cnt = 1234”와 같은 형식으로 putty로 전송해서 출력하시오!
/* USER CODE BEGIN 2 */
int nockanda_cnt = 0;
char buff[100]; //아무리 길어도 100을 안넘겠지?
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
//100개짜리 char배열에 nockanda_cnt = 1234와 같은 형식으로 데이터 집어넣기~
sprintf(buff,"nockanda_cnt = %d\n",nockanda_cnt);
if(HAL_UART_Transmit(&huart2, buff, strlen(buff), 100) == HAL_OK){
//성공~
}else{
//실패~
}
nockanda_cnt++; //값증가~
HAL_Delay(1000); //1초 쉬기~
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
5.이번에는 putty에서 STM32쪽으로 고정되어있는 데이터를 전송할때 그 데이터를 수신해서 디버깅모드에서 확인하시오!(전송하는 데이터=hello nockanda!!) 그리고 정확히 hello nockanda!!인게 확인이 되면 OK를 응답하도록 하시오!
/* USER CODE BEGIN 2 */
char buff[100]; //수신한 데이터를 저장할 버퍼
char text[] = "OK!!\n";
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
//PC에서 우체통에 16개의 데이터를 넣어뒀는데 그것을 성공적으로 buff에 copy했다!
if(HAL_UART_Receive(&huart2, buff, 16, 500) == HAL_OK){
//성공
//내가 지금 수신한게 hello nockanda!!가 맞느냐?
if(strcmp(buff,"hello nockanda!!") == 0){
//일치
HAL_UART_Transmit(&huart2, text, strlen(text), 100);
}
}else{
//실패
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
6.녹칸다가 “data1”이라고 전송하면 stm32는 “nockanda”라고 응답하고 “data2”라고 전송하면 stm32는 “forever”라고 응답한다!
/* USER CODE BEGIN 2 */
char buff[100] = {'\0'}; //배열을 100개 만드는데 초기값은 모두 null 문자이다!
char text1[] = "nockanda\n";
char text2[] = "forever\n";
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
//PC에서 데이터를 무조건 5개로 해서 보내줄거야~
if(HAL_UART_Receive(&huart2, buff, 5, 500) == HAL_OK){
//성공
//내가 지금 수신한게 hello nockanda!!가 맞느냐?
if(strcmp(buff,"data1") == 0){
//일치
HAL_UART_Transmit(&huart2, text1, strlen(text1), 100);
}else if(strcmp(buff,"data2") == 0){
//일치
HAL_UART_Transmit(&huart2, text2, strlen(text2), 100);
}
}else{
//실패
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
7.예제6과 동일한 결과를 유지하되, data1이면 PB3에 연결된 LED가 ON되고, data2라고 전송하면 OFF되도록 하시오!
/* USER CODE BEGIN 2 */
char buff[100] = {'\0'}; //배열을 100개 만드는데 초기값은 모두 null 문자이다!
char text1[] = "nockanda\n";
char text2[] = "forever\n";
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
//PC에서 데이터를 무조건 5개로 해서 보내줄거야~
if(HAL_UART_Receive(&huart2, buff, 5, 500) == HAL_OK){
//성공
//내가 지금 수신한게 hello nockanda!!가 맞느냐?
if(strcmp(buff,"data1") == 0){
//일치
HAL_UART_Transmit(&huart2, text1, strlen(text1), 100);
//LED ON
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_SET);
}else if(strcmp(buff,"data2") == 0){
//일치
HAL_UART_Transmit(&huart2, text2, strlen(text2), 100);
//LED OFF
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_RESET);
}
}else{
//실패
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}








