Cubemx配置
引脚选择
PA9 PA10 配置为串口收发管脚UART1_TX
将USART1调为异步模式(Asynchronous)
根据需求配置波特率(Baud Rate)数据位长度、奇偶校验位、停止位和时钟,一般需要改变的就是波特率。
时钟Clock一般保持默认80MHz即可
还需要在NVIC Settings中使能中断(该操作是为了后续的串口的数据接收)
函数调用
void uart_process()
{
HAL_UART_Transmit(&huart1,(unsigned char*)"Hello World!\r\n",sizeof("Hello World!\r\n),50);
}
(unsigned char*)用来强制进行数据类型转换
\r\n 一起表示回车换行
\r表示回车。
\n表示将光标移至行首,两者一起用才起到了回车换行的功能
sizeof("Hello World!\r\n)表示输出数据的大小
50是最大等待时间。
发送一个中文
u8 tx_buf[]={"你好!\r\n"};
void uart_process()
{
HAL_UART_Transmit(&huart1,(unsigned char*)buf,sizeof(buf),50);
}
如果需要发送两条及以上信息,需要在sizeof哪一项减一,因为发送句子的最后一位是00(代表停止)
u8 tx_buf[]={"你好!\r\n"};
void uart_process()
{
HAL_UART_Transmit(&huart1,(unsigned char*)buf,sizeof(buf)-1,50);
HAL_UART_Transmit(&huart1,(unsigned char*)"Hello World!\r\n",sizeof("Hello World!\r\n")-1,50);
}
串口软件调试
根据要求选择波特率和串口,一般选择无校验位和一位停止位
打开串口,点击发送
重定向printf串口输出
说明:重定向串口输出是为了简化向串口输出信息的函数
在usart.c中编写重定向函数
//重定向printf函数为串口输出
int fputc(int ch,FILE* f)
{
HAL_UART_Transmit(&huart1,(unsigned char*)&ch,1,50);
return ch;
}
然后在魔术棒中勾选UseMicro LIB才可以使用
需要注意,该函数需要在USART CODE Begin后写
并且需要在usart.c中#include "stdio.h"
(该函数可以在Help-uVision help 中搜索fput找到)
完成上述操作后在main中调用printf函数即可向串口输出
printf("hello world!\r\n");
printf("N:%d\r\n",123);
printf("N:%f\r\n",1.23);
u8 buff[]={"你好"};
printf("%s\r\n",buff);
接收程序
在上述cubemx的配置下进行编码
在初始化部分写启动函数
HAL_UART_Receive_IT(&huart1,uart_buf,1);
编写串口回调函数
写在begin4之后即可
void HAL_UART_RxCpltCallback(UART_Handle TypeDef *huart)
{
LED_Control(uart_buff[0]);
HAL_UART_Receive_IT(&huart1,uart_buf,1);//能够继续接受
}
上面是一个很基础的例子,将接收到的第一个数用来控制灯,注意,这里接受的不是文本模式
下面给出一个更具体地例子
//串口接收
u8 uart_buf[2]; //用于接收
u8 rx_buf[10]; //用于缓存
u8 rx_cnt = 0; //计数
u32 uartTick = 0;
void RxIdle_Process() //闲时判断函数,放到while(1)里
{
if(uwTick-uartTick<50)
uartTick=uwTick;
//50毫秒执行一次
rx_cnt = 0;
memset(rx_buf,'\0',sizeof(rx_buf)); //清空缓存数组
}
//回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
//接受三个字节长度数据
rx_buf[rx_cnt++]=uart_buf[0];
if(rx_cnt==3)
{
rx_cnt=0;
LED_Control(rx_buf[1]); //用第二个字节控制led
}
if(uart_buf[0]=='\n')
{
rx_cnt=0;
LED_Control(rx_buf[1]); //用第二个字节控制led
}
HAL_UART_Receive_IT(&huart1,uart_buf,1); //开启下一次串口接收
}
这里解释一下代码内容:
关于闲时判断函数是为了防止上一次输入了错误的信息,占用了缓存空间,影响下一次的信息接收。
回调函数中提供了两种判断方法,一个是根据接收到的字节长度,另一个是根据接是否接受到一句话。
接收到的rx_buf[ ]是字符型,如果想要转化为数字,可以直接在后面加上-'0'
例如rx_buf[2]对应字符5,那么(rx_buf[2]-'0')就对应整型5