BASIC4MCU | 질문게시판 | stm32 uart serial 통신
페이지 정보
작성자 하리 작성일2022-05-09 14:44 조회137회 댓글1건본문
/* USER CODE END Header */
/* Includes --------
----------------------------------------------------------*/
#include "main.h"
#include <string.h>
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
UART_HandleTypeDef huart1;
/* USER CODE BEGIN PV */
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_USART1_UART_Init(void);
/* USER CODE BEGIN PFP */
uint8_t str[15] = "Hello World!\n\r";
uint8_t received[5] = {0};
//uint8_t received=5;
HAL_StatusTypeDef rcvStat;
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
}
}
void UART1_IRQHandler(void)
{
HAL_UART_IRQHandler(&huart1);
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
if (huart->Instance == USART1)
{
if(rcvStat == HAL_OK)
{
if(sizeof(received) == sizeof(5))
{
HAL_UART_Transmit(&huart1, received, 1, 10);
}
rcvStat = HAL_UART_Receive_IT(&huart1, received, 1);
}
}
/* USER CODE ENdD 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_USART1_UART_Init();
/* Initialize interrupts */
MX_NVIC_Init();
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart1, received, 1);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
}
HAL_UART_Transmit(&huart1, received, 1, 10) 처럼 하나씩 받으면 제대로 받아지지 않고 잘려서 받아져요 예를 들면 hello를 보냈을 때 돌아오는건 hel만 받아지고
5개씩 받을려고 할 때 5개보다 적거나 많을 때는 ERROR란 글자를 보내고 싶어서 if문을 작성해봤는데 여러방법을 사용해봐도 ERROR란 글자는 안써지고 예를들어 eeeeee를 보내면 eeeee가 받아진 후 다음에 ffff를 보내면 effff이런식으로 받아져요
어디서부터 잘못되었을까요 ㅠㅠ
반대로 5개가 충족되면 OK를 받게 했더니 그건 제대로 받아지더라고요 HAL_UART_Transmit(&huart1, "OK", sizeof("OK"), 10);
댓글 1
조회수 137master님의 댓글
master 작성일
if(sizeof(received) == sizeof(5))
여기서 sizeof(5) 이 건 뭔가요? 상수 5의 (메모리)크기를 왜 넣었죠?
if(sizeof(received) == 5)
이렇게 해야 하는 것 아닌가요?
문자열의 크기를 측정하는 경우 널문자를 못 만나면 오동작합니다. 문자열에 대해서 공부하세요
//
HAL_UART_Transmit(&huart1, "OK", sizeof("OK"), 10);
인터럽트 안에서 시간이 많이 걸리는 처리를 하면 안됩니다.
//
2바이트 이상의 데이터를 주고 받으려면 패킷(프로토콜)을 만들어서 주고 받으세요