前言
一、配置
二、使用步骤
1.串口发送
代码逻辑
效果展示
2.串口接收单个字符
代码逻辑
中断回调函数
3.串口接受字符串
代码逻辑
字符串函数
中断回调函数
声明
代码开源
前言
一、配置
二、使用步骤
1.串口发送
代码逻辑
sprintf(tx_buf,"jin ke\r\n")
:这行代码使用sprintf
函数将字符串"jin ke\r\n"
写入到tx_buf
缓冲区中。HAL_UART_Transmit(&huart1,(uint8_t*)tx_buf,strlen(tx_buf),50)
:这行代码使用HAL_UART_Transmit
函数通过huart1
串口发送tx_buf
缓冲区中的数据。发送的数据长度是通过strlen(tx_buf)
计算得到的,并且设置了一个超时时间为50
毫秒。
&huart1
是指向huart1
这个结构体的指针。huart1
通常是一个串口通信相关的结构体,通过这个指针可以访问和操作与该串口相关的配置和功能将
tx_buf
强制转换为(uint8_t*)
是为了确保将缓冲区中的数据以字节数组的形式传递给HAL_UART_Transmit
函数。在 C 语言中,很多函数需要以特定的数据类型来接收参数,通过这种强制转换可以满足函数的要求,以便正确地进行数据传输操作。
char tx_buf[20];
LCD_Init();
LCD_Clear(White);
LCD_SetBackColor(White);
LCD_SetTextColor(Black);
sprintf(tx_buf,"jin ke\r\n");
HAL_UART_Transmit(&huart1,(uint8_t*)tx_buf,strlen(tx_buf),50);
将字符串写入缓冲区主要有以下几个原因:
- 提高效率:一次性将数据准备好放入缓冲区,然后统一进行发送,可以减少频繁的操作和中断,提高数据传输的效率。
- 便于管理:将数据集中在缓冲区中,方便对数据进行进一步的处理或操作,比如在发送之前可以根据需要对缓冲区中的数据进行修改。
- 连贯性:确保数据的连贯性和完整性,避免在逐字节发送过程中出现数据丢失或不完整的情况。
效果展示
2.串口接收单个字符
案例:接受到O时,点亮LED1并发送LED1OPEN!,接受到C时,熄灭LED1并发LED1CLOSE!
代码逻辑
HAL_UART_RxCpltCallback
是一个串口接收完成的回调函数。当串口接收到数据完成时,会调用这个函数来处理接收到的数据。在这个函数中,可以根据接收到的数据进行各种相应的操作,如控制其他设备、更新状态等。
uint8_t rx_data;
中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(rx_data=='O')
{led_show(2,1);
sprintf(tx_buf,"led1OPEN!");
HAL_UART_Transmit(&huart1,(uint8_t*)tx_buf,strlen(tx_buf),50);
}
if(rx_data=='C')
{led_show(2,0);
sprintf(tx_buf,"led1CLOSE!");
HAL_UART_Transmit(&huart1,(uint8_t*)tx_buf,strlen(tx_buf),50);
}
HAL_UART_Receive_IT(&huart1,&rx_data,1);
}
3.串口接受字符串
代码逻辑
uart_proc
函数用于处理串口数据。
- 当
rx_count
等于 4 时,进行数据的比较和相应操作。- 通过
strcmp
函数比较接收到的rx_buf
与特定字符串(如"LEDO"
和"LEDC"
)是否相等。- 根据比较结果控制
led
的显示状态,并发送相应的消息。- 最后将
rx_count
清零,清空rx_buf
并重置其内容。memset
是一个 C 语言标准库函数,用于将一段内存区域设置为指定的值。它的函数原型一般为
void *memset(void *str, int c, size_t n)
,其中:str
:指向要填充的内存块。c
:要设置的值(通常是一个字符)。n
:要设置的字节数。在上述代码中,memset(rx_buf, 0, 20)
是将rx_buf
这个内存区域的前 20 个字节全部设置为 0,起到清空的作用。
strcmp
函数用于比较两个字符串。它的工作原理是逐个字符地比较两个字符串,直到遇到不同的字符或到达字符串的末尾。
如果两个字符串完全相同,则返回 0;如果第一个字符串小于第二个字符串,则返回一个负数;如果第一个字符串大于第二个字符串,则返回一个正数。
在代码中,通过
strcmp
函数来比较接收到的rx_buf
和特定的字符串,以确定执行相应的操作
字符串函数
void uart_proc(void)
{
if(rx_count==4)
{
if(strcmp(rx_buf,"LEDO")==0)
{
led_show(1,1);
sprintf(tx_buf,"led1OPEN!\r\n");
HAL_UART_Transmit(&huart1,(uint8_t*)tx_buf,strlen(tx_buf),50);
}
if(strcmp(rx_buf,"LEDC")==0)
{
led_show(1,0);
sprintf(tx_buf,"led1CLOSE!\r\n");
HAL_UART_Transmit(&huart1,(uint8_t*)tx_buf,strlen(tx_buf),50);
}
rx_count=0;
memset(rx_buf,0,20);
}
}
中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
rx_buf[rx_count++]=rx_data;
HAL_UART_Receive_IT(&huart1,&rx_data,1);
}
声明
/* USER CODE BEGIN PV */
uint8_t key_rval;
char tx_buf[20];
uint8_t rx_data;
char rx_buf[20];
uint8_t rx_count;
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
void uart_proc(void);
/* USER CODE END PFP */
代码开源
通过网盘分享的文件:12-TEST6-串口通信(接收和发送多个字符).zip
链接: https://pan.baidu.com/s/1IoKdqO9sgooXArpK1wgjyg?pwd=0820 提取码: 0820