关键词:USART UART 串口通信
理论基础
USART/UART
USART(Universal Synchronous/Asynchronous Receiver/Transmitter)
通用 同步/异步 串行 接收/发送器是一种串行通信接口。USART最多有5个信号,分别是TX,RX,nCTS.nRTS,SCLK
TX | 串行输出信号 |
RX | 串行输入信号 |
nCTS | (clear to send)允许发送信号,低电平有效,(对方发出) |
nRTS | (request to send)请求发送信号,低电平有效,(对方发出) |
SCLK | 时钟信号线,仅用于同步模式 |
TX和RX是必需的,nCTS和nRTS是硬件流控制信号。
在异步通信时可以选择是否使用硬件流控制信号,同步通信时没有硬件流控制信号。
SCLK只用于同步通信,异步通信时无SCLK
USART(Universal Asynchronous Receiver/Transmitter)
通用 异步 串行 接收/发送器 ,只有异步模式,没有SCLK时钟线,一般也没有nCTS,nRTS硬件流控制信号
串口通信的基本参数
数据位 | 8位或9位,一般是八位,每八位一帧数据,刚好1字节 |
奇偶校验位 | 分为奇校验,偶校验,或者无校验 |
停止位 | 1或2个停止位,一般设置为1个 |
波特率 | 串行数据通行速率,单位是bit/s(9600,19200,115200...) |
串口配置
串口使用方法
流程
1.时钟使能
2.设置引脚复用器映射
3.GPIO端口模式设置
4.初始化串口参数
5.使能串口
配置步骤
这些步骤都可以在CubeMax里面进行配置。在上一文章中添加配置USART如下
选择USART2
mode 选择 (Asynchronous) 异步通信
Baud Rate 波特率设置为9600
关闭过载检测
开启UART中断,配置中断优先级
这样串口就配置好了
示例代码
在UART.C中添加代码
发送代码:
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
huart 串口通道
pData 发送数据数组
Size 数据元素的数量
Timeout 等待时间
接收代码
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
huart 串口通道
pData 发送数据数组
Size 数据元素的数量
Timeout 等待时间
对串口发送数据和接收数据 代码进行改写
void UART_Transmit(uint8_t *ucData,uint8_t ucSize)
{
HAL_UART_Transmit(&huart2,ucData,ucSize,100);
}
uint8_t UART_Receive(uint8_t *ucData)
{
return HAL_UART_Receive(&huart2,ucData,1,0);
}
在UART.h头文件中添加
/* USER CODE BEGIN Prototypes */
void UART_Transmit(uint8_t *ucData,uint8_t ucSize);
uint8_t UART_Receive(uint8_t *ucData);
/* USER CODE END Prototypes */
在主函数中编写功能代码,实现数据的发送与接收
void UART_Proc(void) /* UART处理 */
{
if(ucSec1 != ucSec)
{ /* 1s到 */
ucSec1 = ucSec;
UART_Transmit(ucBuf, 4); /* 发送4个字符 */
printf(" %04u\r\n", ucSec); /* 发送秒值和回车换行 */
}
if(UART_Receive(ucUrx) == 0) /* 接收到字符 */
{
ucUrx[++ucUno] = ucUrx[0]; /* 保存字符 */
if(ucUno >= 2)
{ /* 修改秒值 */
ucSec = (ucUrx[1]-0x30)*10+ucUrx[2]-0x30;
ucUno = 0;
}
}
}
以上代码来自示例代码。
多种发送接受方式以及中断处理
发送数据的方式
//阻塞模式发送数据
HAL_UART_Transmit();
//中断模式发送数据
HAL_UART_Transmit_IT();
//DMA模式发送数据
HAL_UART_Transmit_DMA();
接受数据的方式
//阻塞模式接受数据
HAL_UART_Receivemit();
//中断模式接受数据
HAL_UART_Receivemit_IT();
//DMA模式接受数据
HAL_UART_Receivemit_DMA();
中断处理
//接受中断处理
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
uint8_t* rex;
if(huart->Instance == USART2)
{
//发送接收到的字符数据
HAL_UART_Receive(huart,rex,sizeof(rex),0);
HAL_UART_Transmit(huart,rex,sizeof(rex),10);
HAL_GPIO_TogglePin(K1_GPIO_Port,K1_Pin);
}
__HAL_UART_CLEAR_FLAG(&huart2,UART_IT_TC);//清除中断标志位
}
//发送中断处理
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
uint8_t* Tra;
if(huart->Instance == USART2)
{
//中断处理
}
__HAL_UART_CLEAR_FLAG(&huart2,UART_IT_TC);//清除中断标志位
}
DMA串口传输
*略