반응형

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에서 확인가능 하도록 하시오!

ex1.zip
0.00MB

/* 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에서 제대로 인식이 되었는지 아닌지를 디버깅모드에서 확인해보시오!

ex2.zip
0.00MB

/* 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에서 그 메시지를 받아서 출력하는 예제를 구현하시오!

ex3.zip
0.00MB

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로 전송해서 출력하시오!

ex4.zip
0.00MB

/* 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를 응답하도록 하시오!

ex5.zip
0.00MB

/* 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”라고 응답한다!

ex6.zip
0.00MB

/* 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되도록 하시오!

ex7.zip
0.00MB

/* 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 */
 }

 

반응형
Posted by 덕력킹
,