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.接收时是固定长度的数据。

相关推荐
蓝斯49712 小时前
从.到实现一个Windows上的虚拟hid键盘设备
windows·单片机·计算机外设
熙芯XiChip13 小时前
硬实时与软实时RTOS核心区别
嵌入式硬件
伟大的前程13 小时前
unsigned int 定义的变量 在 电脑的 64 位系统中 和 32 位 cortex-m0 和 8 位的 51 单片机
单片机·嵌入式硬件
小渔村的拉线工14 小时前
1.HPM6E80 解析芯片整体工作原理和存储架构
单片机·嵌入式硬件·mcu·架构·hpm6e80
熙芯XiChip15 小时前
CAN与CANopen的本质区别
单片机
lilihewo15 小时前
Altium Designer 封装库的创建(分享pcb 3D封装库)
嵌入式硬件·51单片机
神罚天下ET16 小时前
典型arm位单片机启动流程(从上电到main.c)
c语言·arm开发·单片机
碧海银沙音频科技研究院17 小时前
蓝牙耳机使用WSDF5361锂保芯片进入船运模式实现方法
嵌入式硬件·算法
Zevalin爱灰灰17 小时前
模拟信号链电路——基于TL431的电压基准电路
单片机·嵌入式硬件
csdn杰哥18 小时前
瑞萨单片机开发教程[二十七] DTC 外部中断触发传输实验
单片机·嵌入式硬件·mongodb·瑞萨·ra6m5