目录
串口收发数据——
使用串口助手以及接收中断实现
一:串口在 cubeMX 中配置
串口在 cubeMX 中的配置过程如下:
1. 首先在 Connectivity 标签页下将 USART1 打开,将其 Mode 设置为 Asynchronous 异步 通讯方式。异步通讯即发送方和接收方间不依靠同步时钟信号的通讯方式。
PS:并记得打开USART1的NVIC!!!!否则无法触发接收中断。
2. 接着将其波特率(Baud Rate)设置为 115200,数据帧设置为 8 位数据位(8Bits 即一位长度的数据,其中包含了校验位,如果设置了校验位那么数据帧要设置为9位),无校验位(Parity),1 位停止位(Stop Bit)。
3. 同样地,打开 USART6,将其以和 USART1 同样的方式进行设置。
4. 接着前往 NVIC 标签页下,开启 USART1 和 USART6 的中断。
5:TXD对应的引脚进行改动:将已经生成的PB6引脚改成在PA9引脚处设置成USART_TX,
而RXD对应生成的引脚无需改动为PB7.
tip:在将PB6引脚的USART_TX模式改成在PB7引脚实现的时候,可以先点击引脚视觉PB6对应的图标 并长按CTRL,然后 点击PA9并松开CTRL即可快速转移引脚模式。
二:串口发送函数:HAL_UART_Transmit
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData,
uint16_t Size, uint32_t Timeout) :
返回值:HAL_StatusTypeDef
参数1:UART_HandleTypeDef *huart,这是要进行发送的串口的句柄指针,使用是如果用的是串口1就输入:&huart1,
参数2:uint8_t *pData,要发送的数据(可以不只是一个字节),可以定义一个数组然后直接调用这个数组,也可以直接填入一个字符串。
参数3:要发送的数据的大小,可以用sizeof函数来计算数据大小,
参数4:自定义一个发送超过时间,如果超过这个发送时间则取消本次发送,比如定一个100ms
三:串口接收函数: HAL_UART_Receive_IT
使用样例:HAL_UART_Receive_IT(&huart1,&a,sizeof(a));//开启扫描,直至接收到数据
参数1:&huartx;
参数2:被定义的用来接收数据的数组或字符,
参数3:参数2的长度
HAL_UART_Receive_IT函数能够开启数据接收,直至接收到数据,所以在给UART中断进行使能之后应该开启数据接收,这样当在串口助手里面发送数据的时候,就能够接收到输入的数据并进入中断接收,然后在中断接收也就是回调函数里面,应该再次调用此函数,重新开启数据接收,直至下次接收到数据,这样就可以一直接收用户在串口助手里面输入的数据了。
四:结合以上两个收发函数实现收发数据
1,先在注释Begin2和End2之间使能接收中断:
__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);//开启接收中断使能
2,定义一个uint8_t的字符a。
3,然后开启数据接收: HAL_UART_Receive_IT(&huart1,&a,sizeof(a));//开启扫描,直至接收到数据 .
4,编写中断回调函数:(中断回调函数的参数是固定的)
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart==&huart1)//判断是否为UART1接收到的数据
{
HAL_GPIO_TogglePin(GPIOH,GPIO_PIN_12);
HAL_UART_Transmit (&huart1,&a,sizeof(a),10);//检测到用户输入的数据返回用户输入的数据
HAL_UART_Receive_IT(&huart1,&a,sizeof(a));//重新开启扫描
}
}
在回调函数里面先判断是否是UART1接收到的数据,然后可以翻转PH12电平来观察现象,以判断是否进入了回调函数,最后发送接收到的数据,实现收发,然后再次开启数据接收,实现连续的数据收发。主循环无需编写。
使用DMA进行数据传输——
DMA可以进行两个外设之间数据的直接高效传输,而绕开了CPU,所以无需使用接收中断函数也能接收到数据。毕竟使用DMA进行数据传输,CPU就不需要直接参与了。
有关DMA发送和接收的两个常用函数:
(1)HAL_UART_Receive_DMA
(2) HAL_UART_Transmit_DMA
这两个函数的参数与不加DMA后缀的前面的收发数据的函数的参数基本一致,只是发送的函数无需设置第四个参数(无需设定传输时间阈值)。
在Cube中将USART1和6分别打开成发(T)和收(R)的状态并在keil中调用这两个函数,就可以在给USART1和6(C板上分别对应UART2和1)之间连上对应的收发数据线后实现一个串口发数据一个串口收数据的目的了。(注意接线时TXD——RXD,RXD——TXD,而VCC可以不连)
补充:
1.PWM呼吸灯的每次循环结尾处一定要加上1ms的延迟!否则无法实现呼吸灯。
2.使用UART异步全双工进行数据传输的时候要保证收发两段约定的波特率相同。
工程移植注意事项:
1.复制例程的文件到自己的工程下时一定要保证文件路径添加正确。
2.复制对应的文件后要记得在主函数中引用对应库函数的头文件,并注意初始化函数(Init),
3.每次Cube生成对应代码时可能会生成与移植文件重复的函数,需要在对应.c文件里找到它并重复的删除或更改一下函数名。