TTL串口

TTL串口仅仅需要两根数据线就可以进行串口通信:

①一条是从A设备发送的IO口连接到B设备的接收IO口

②一条是从B设备发送的IO口连接到A设备的接收IO口

③共地(GND)是两个设备通信的前提(保证他们的电平标准一致)

操作步骤:

①新建文件——命名为serial

②找到USART2,将串口模式改为TTL模式——即Asynchronous(异步模式)

③配置小灯的GPIO口:

④生成代码后:我们可以看到初始化串口的函数

编写代码:

因为我们在串口发送的时候需要发送字符,因此我们要加上头文件:

代码:

 MX_GPIO_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
  //char message[]="Hello World!";
  uint8_t receiveData[2];

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  //HAL_UART_Transmit(&huart2, (uint8_t*)message, strlen(message), 100);
	  //HAL_Delay(1000);
	  HAL_UART_Receive(&huart2, receiveData, 2, HAL_MAX_DELAY);
	  HAL_UART_Transmit(&huart2, receiveData, 2, 100);
	  GPIO_PinState state =GPIO_PIN_SET;
	  if(receiveData[1]=='0')
	  {
		  state = GPIO_PIN_RESET;
	  }
	  else if(receiveData[1]=='1')
	  {
		  state = GPIO_PIN_SET;
	  }
	  if(receiveData[0]=='R')
	  {
          HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, state);
	  }
	  else if(receiveData[0]=='G')
	  {
          HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, state);
	  }
	  else if(receiveData[0]=='B')
	  {
          HAL_GPIO_WritePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin, state);
	  }
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

 定义串口接收缓冲区,数组大小为2

// 串口接收缓冲区
uint8_t rx_data[2];

代码详解:

1. while (1)
这是一个无限循环,代码会一直在这个循环内运行。常用于嵌入式系统中,确保程序不断执行。

2. HAL_UART_Receive(&huart2, receiveData, 2, HAL_MAX_DELAY);
该行代码通过UART接收2个字节的数据,将其存储到 `receiveData` 缓冲区中。
HAL_MAX_DELAY表示函数将一直阻塞,直到接收到2个字节的数据。

3. HAL_UART_Transmit(&huart2, receiveData, 2, 100);
该行代码将接收到的数据通过UART原样发送回去,用于回显

4. GPIO_PinState state = GPIO_PIN_SET;
这里定义了一个 `GPIO_PinState` 类型的变量 `state`,初始值为 `GPIO_PIN_SET`(高电平)。

5. if(receiveData[1]=='0')
该行代码检查 `receiveData[1]` 是否等于字符 '0'。如果是,将 `state` 设置为 `GPIO_PIN_RESET`,即低电平。这表示如果接收到的第二个字节是 `'0'`,LED灯将被关闭。

6. else if(receiveData[1]=='1')
该行代码检查 `receiveData[1]` 是否等于字符 '1'。如果是,将 `state` 设置为 `GPIO_PIN_SET`,即高电平。这表示如果接收到的第二个字节是 '1',LED灯将被打开。

7. if(receiveData[0]=='R')
该行代码检查 receiveData[0]是否为字符 'R',如果是,表示控制红色LED灯。
HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, state);`根据前面设置的 `state` 值,控制红色LED引脚的状态(高电平点亮,低电平熄灭)。

调试:

使用B站UP主keysking写的波特律动 串口助手

网址:

波特律动 串口助手 (baud-dance.com)

编写时遇到的问题:

芯片自锁:STlink烧录一次后就无法在进行烧录,这种情况一般为芯片自锁

解决方法详细参考这篇文章:

STlink烧录一次后就无法在进行烧录解决办法_stm32烧录一次后便无法烧录-CSDN博客

与此同时:在问题解决之后,我们最好是把SYS中Debug配置为Serial Wire

作者:庆庆知识库

物联沃分享整理
物联沃-IOTWORD物联网 » STM32串口通信HAL库详解

发表回复