串口收发
基本思路,初始上电,发送一次指令格式,串口输入控制led。如果输入错误则提示输入格式。
Cubemx新建工程 设置串口 生成代码
1、串口发送/接收函数
HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制
HAL_UART_Receive();串口轮询模式接收,使用超时管理机制
HAL_UART_Transmit_IT();串口中断模式发送
HAL_UART_Receive_IT();串口中断模式接收
HAL_UART_Transmit_DMA();串口DMA模式发送
HAL_UART_Transmit_DMA();串口DMA模式接收
HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
功能:串口发送指定长度的数据。如果超时没发送完成,则不再发送,返回超时标志(HAL_TIMEOUT)。
参数:
UART_HandleTypeDef *huart UATR的别名 如 : UART_HandleTypeDef huart1; 别名就是huart1
*pData 需要发送的数据
Size 发送的字节数
Timeout 最大发送时间,发送数据超过该时间退出发送
举例: HAL_UART_Transmit(&huart1, (uint8_t *)ZZX, 3, 0xffff); //串口发送三个字节数据,最大传输时间0xffff
————————————————
版权声明:本文为CSDN博主「Z小旋」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
参考原文链接:https://blog.csdn.net/as480133937/article/details/99073783
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
功能:串口中断接收,以中断方式接收指定长度数据。
大致过程是,设置数据存放位置,接收数据长度,然后使能串口接收中断。接收到数据时,会触发串口中断。
再然后,串口中断函数处理,直到接收到指定长度数据,而后关闭中断,进入中断接收回调函数,不再触发接收中断。(只触发一次中断)
参数:
UART_HandleTypeDef *huart UATR的别名 如 : UART_HandleTypeDef huart1; 别名就是huart1
*pData 接收到的数据存放地址
Size 接收的字节数
举例: HAL_UART_Receive_IT(&huart1,(uint8_t *)&value,1); //中断接收一个字符,存储到value中
————————————————
版权声明:本文为CSDN博主「Z小旋」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
参考原文链接:https://blog.csdn.net/as480133937/article/details/99073783
2、串口中断函数
HAL_UART_TxHalfCpltCallback();一半数据发送完成时调用
HAL_UART_TxCpltCallback();数据完全发送完成后调用
HAL_UART_RxHalfCpltCallback();一般数据接收完成时调用
HAL_UART_RxCpltCallback();数据完全接受完成后调用
HAL_UART_ErrorCallback();传输出现错误时调用
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
功能:HAL库的中断进行完之后,并不会直接退出,而是会进入中断回调函数中,用户可以在其中设置代码,
串口中断接收完成之后,会进入该函数,该函数为空函数,用户需自行修改,
参数:
UART_HandleTypeDef *huart UATR的别名 如 : UART_HandleTypeDef huart1; 别名就是huart1
举例: HAL_UART_RxCpltCallback(&huart1){ //用户设定的代码 }
————————————————
版权声明:本文为CSDN博主「Z小旋」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
参考原文链接:https://blog.csdn.net/as480133937/article/details/99073783
usart.c 添加库 #include
并增加如下代码,重定向c函数库用的,没看明白。
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
int fgetc(FILE * f)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1,&ch, 1, 0xffff);
return ch;
}
Main 函数添加库 #include "stdio.h"
int main(void)前添加如下代码
uint8_t aTxStartMessages[] = "\r\n******UART commucition using IT******\r\nPlease enter 1 or 0 :\r\n";//1打开led 0关闭led
uint8_t ch;//定义ch
char len[] = "12354687496865";//定义len
while (1)前添加如下代码
HAL_UART_Transmit_IT(&huart1 ,(uint8_t*)aTxStartMessages,sizeof(aTxStartMessages));第一次上电打印指令
while (1)中添加如下代码
ch=getchar(); //获取字符串,只能接受1个字母或数字,没明白用法
//scanf("%c",&ch);//获取字符串,只能接受2个字母或数字,没明白用法
printf("接收到字符串:%c\n",ch);//打印字符串,%c表示打印字符串。%d表示打印数字
if(ch=='0') //如果收到0
{
HAL_GPIO_WritePin (GPIOB,GPIO_PIN_8,GPIO_PIN_SET);//关闭8脚上的led
printf("off");//打印off,如果打印的不是变量,可不加%c
}
if(ch=='1')//如果收到1
{
HAL_GPIO_WritePin (GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);//打开8脚上的led
printf("on");//打印off,如果打印的不是变量,可不加%c
}
if(ch!='0'&&ch!='1')//如果不是零,也不是1,打印len数组的长度。
{
printf("%d",sizeof(len));
}
测试如下