STM32:串口--轮询模式

一.TTL串口

在生活中,串口无处不在,常见的有网线接口,USB等等,今天来介绍单片机中常用的串口--TTL串口。

TTL串口通过三根线连接了两个设备,实现两个设备之间的通信,这三根线分别是:

TX(发送IO口)<->RX(接收IO口)

RX(接收IO口)<->TX(发送IO口)

GND<->GND(共地)

因此,我们可以用串口将stm32与电脑进行通信,即用电脑给stm32发送指令,用电脑接收stm32发送的数据从而调试stm32程序。

二.发送指令与接收指令

1.cubemx设置:

(1)串口,IIC,定时器PWM等涉及STM32的GPIO口复用功能,我们需要手动设置下载调试器接口,进行起手式:在SYS中改为Serial Wire

(2)USART:通用(U),同步(S)/异步(A),接收器(R)和发送器(T),TTL使用的就是异步通信(UART)。

找到stm32开发板上的USB串口,发现串口连接PA2和PA3

波特率:每秒传送的码元的数量(每秒多少次电平信号)

两设备保证相同波特率(这里都设置为115200)

2.我们先实现每隔1s向电脑发送Hello World

串口发送函数:

HAL_UART_Transmit(huart, pData, Size, Timeout)

第一个参数是要操作的串口指针,即&huart2

第二个参数是要发送信息的指针,即message

第三个参数是发送内容长度,即strlen(message)

第四个参数是超时时间,比如100,HAL_MAX_DELAY(最大值,无限等到发送完成)

注意1:头文件添加<string.h>(因为要使用strlen函数)

注意2:第二个参数需要强制类型转化(串口发送函数第二个参数的类型必须为uint8_t)

其中HAL_UART_Transmit函数:

因此,函数实现如下:

cpp 复制代码
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_GPIO_Init();
  MX_DMA_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
  char message[] = "Hello World";

  /* 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);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

我们需要用到TTL串口转USB模块+串口调试助手(serial.keysking.com)建立起stm32与电脑连接通信。

注意波特率115200,接收改为ASCII(HEX为16进制)

3.STM32接收电脑发来数据

cpp 复制代码
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_GPIO_Init();
  MX_DMA_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */

  uint8_t receiveData[2];

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  HAL_UART_Receive(&huart2, receiveData, 2, HAL_MAX_DELAY);//stm32接收电脑发送的数据
	  HAL_UART_Transmit(&huart2, receiveData, 2, 100);//stm32给电脑发送刚接收到的数据
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

4.Q:实现电脑向stm32发送指令,分别控制stm32上三种小灯亮灭,并且stm32收到指令后要回复电脑当前收到的指令。

两个字节,第一个字节为R/G/B(代表颜色),第二个字节为0/1(0为关1为开)

比如,R0代表红色灯关闭

(1)设置三个小灯的GPIO口:

(2)代码如下:

cpp 复制代码
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_GPIO_Init();
  MX_DMA_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */

  uint8_t receiveData[2];
//  HAL_UARTEx_ReceiveToIdle_DMA(&huart2,receiveData,sizeof(receiveData));
//  __HAL_DMA_DISABLE_IT(&hdma_usart2_rx,DMA_IT_HT);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  //轮询模式:
	  HAL_UART_Receive(&huart2,receiveData,2,HAL_MAX_DELAY);//电脑发送给单片机,单片机接收并放入receiveData数组
	  HAL_UART_Transmit(&huart2,receiveData,2,100);//单片机发送给电脑,单片机发送receiveData数组中的数据
	  //HAL_MAX_DELAY为不设超时时间,直至结束
	  GPIO_PinState state = GPIO_PIN_SET;// GPIO_PinState用来表示高低电平的变量类型,初始化默认高电平
	  //判断单片机接收的是0还是1,设置高低电平
	  if(receiveData[1] == '0')//判断如果第二个为0,则设置为低电平,否则默认高电平
	  {
		  state = GPIO_PIN_RESET;
	  }
	  //判断单片机接收的是R还是G还是B,输出对应的颜色
	  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 */
  }
  /* USER CODE END 3 */
}

三.串口使用轮询模式的缺点:

1.必须要阻塞程序运行,直到完成发送或接收,或者等待超时。

2.接收时是固定长度的数据。

相关推荐
municornm1 小时前
单片机IO不够?ULN2003A救急方案
单片机·嵌入式硬件
m0_618526201 小时前
矩阵RGB三色LED驱动芯片CH466(SPI模式)
单片机·嵌入式硬件
染予1 小时前
实现功能:给stm32F427zgt6开发板配置网络,电脑可以ping通开发板
stm32·单片机·嵌入式硬件
Hotchip_MEMS1 小时前
单节锂电池充电管理:如何平衡充电速度与电池寿命
人工智能·单片机·嵌入式硬件·物联网
ι:2 小时前
Codex 接管嘉立创EDA 并复现 STM32 Blue Pill 学习底板的完整教学
stm32·嵌入式硬件·学习
西城微科方案开发2 小时前
蓝牙血压计 PCBA 方案
单片机·嵌入式硬件
金戈鐡馬2 小时前
深入解析PGND在FOC中的作用和存在的必要性
单片机·嵌入式硬件·foc·磁场定向控制·电调
笨笨没好名字12 小时前
怎么看懂51单片机电路图与功能实现的C语言编写(2-7入门篇)
c语言·嵌入式硬件·51单片机
项目題供诗17 小时前
STM32-TIM输入捕获(十四)
stm32·单片机·嵌入式硬件