一、STM32cubeMX+HAL库实现串口通信
1.创建项目
SYS设置:
RCC设置:
时钟树设置:
USART1设置:
将Mode设置为Asynchronous,使能串口中断:
project manager设置
2.编写代码
用keil打开刚才建的项目,
在main.c里编写代码:
定义缓冲区大小:
#define LENGTH 10 // 接收缓冲区大小
定义缓冲区和标志位:
uint8_t RxBuffer[LENGTH]; // 接收缓冲区
uint8_t Rxflag = 0; // 标志位,0为接收未完成,1为接收完成
定义接收成功信息
HAL_UART_Receive_IT(&huart1, (uint8_t*)RxBuffer, LENGTH); // 使能接收中断
char data[] = "\nReveive Success\n"; // 接收成功信息
在while(1)中循环中发送成功信息和接收到的信息:
char data1[]="\nhellowindows!";
HAL_UART_Transmit(&huart1,(uint8_t *)data1,15,0xffff);
HAL_Delay(1500);
if (Rxflag == 1){ // 若数据接收完成
HAL_UART_Transmit(&huart1, (uint8_t *)data, 18, 0xFFFF); // 接收成功信息
// 发送接收到的字符
HAL_UART_Transmit_IT(&huart1, (uint8_t*)RxBuffer, LENGTH);
Rxflag = 0; // 清除标志位
}
3.编译
编译无误
4.烧录,并用串口助手运行
二、中断串口通信
1.通过CubeMX配置项目
设置RCC
设置SYS
设置USART
设置NVIC
创建项目
2.在keil配置代码
打开通过CubeMX生成的项目
在main函数前定义全局变量
char c;//指令 0:停止 1:开始
char message[]="hello Windows\n";//输出信息
char tips[]="CommandError\n";//提示1
char tips1[]="Start.....\n";//提示2
char tips2[]="Stop......\n";//提示3
int flag=0;//标志 0:停止发送 1.开始发送
在main函数中设置接收中断
HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);
main函数中的while循环里面添加传输代码
if(flag==1){
//发送信息
HAL_UART_Transmit(&huart1, (uint8_t *)&message, strlen(message),0xFFFF);
//延时
HAL_Delay(1000);
}
在main函数下面重写中断处理函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
//当输入的指令为0时,发送提示并改变flag
if(c=='#'){
flag=0;
HAL_UART_Transmit(&huart1, (uint8_t *)&tips2, strlen(tips2),0xFFFF);
}
//当输入的指令为1时,发送提示并改变flag
else if(c=='*'){
flag=1;
HAL_UART_Transmit(&huart1, (uint8_t *)&tips1, strlen(tips1),0xFFFF);
}
//当输入不存在指令时,发送提示并改变flag
else {
flag=0;
HAL_UART_Transmit(&huart1, (uint8_t *)&tips, strlen(tips),0xFFFF);
}
//重新设置中断
HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);
}
3.编译并烧录
打开串口助手
当输入 * 后开始发送hello windows
当输入 # 后停止发送