串口通讯 (Serial Communication) 是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。
一.物理层
1.标准
根据通讯使用的电平标准不同,串口通讯可分为 TTL 标准及 RS-232 标准,RS-232相对TTL有更强的抗干扰能力和传输距离。STM32 的 USART 输出的是 TTL 电平信号,若需要 RS-232 标准的信号可使用 MAX3232 芯片进 行转换。
2.波特率
串口通讯是异步通信,异步通讯中没有时钟信号,所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码。
3.引脚
TX:发送数据输出引脚。 RX:接收数据输入引脚。 (与单片机相连接时,TX----RX,RX------TX)
二.代码层
HAL_UART_Transmit();串口发送数据,使用超时管理机制
HAL_UART_Receive();串口接收数据,使用超时管理机制
HAL_UART_Transmit_IT();串口中断模式发送
HAL_UART_Receive_IT();串口中断模式接收
HAL_UART_Transmit_DMA();串口DMA模式发送
HAL_UART_Transmit_DMA();串口DMA模式接收
1.发送函数
HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
这里图片引自Z小旋博主的文章
2.中断接收
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
举例: HAL_UART_Receive_IT(&huart1,(uint8_t *)&value,1);
3.回调函数
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
在程序发生中断后,并不会立即结束,会先完成回调函数里面的内容,所以这里可以将想要执行的代码放入回调函数中 4.重定义 在代码中可直接使用printf打印数据来检测数据
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;
}
5.上位机 常用上位机就是串口调试助手,有vofa+,等各种方便的软件,波特率一定要和配置里面的对应
6.串口中断 在cubemx中配置好中断之后,声明 HAL_UART_Receive_IT(&huart1,usart1_rx,6); 在main函数下添加回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
HAL_UART_Transmit(&huart1,usart1_tx,6,100);
HAL_UART_Receive_IT(&huart1,usart1_rx,6);
}
}
串口打印 每次中断结束都要在回调函数重新开启中断,否则中断里的内容只执行一次
|