关键词:USART UART 串口通信
通用 同步/异步 串行 接收/发送器是一种串行通信接口。USART最多有5个信号,分别是TX,RX,nCTS.nRTS,SCLK
TX | 串行输出信号 |
RX | 串行输入信号 |
nCTS | (clear to send)允许发送信号,低电平有效,(对方发出) |
nRTS | (request to send)请求发送信号,低电平有效,(对方发出) |
SCLK | 时钟信号线,仅用于同步模式 |
TX和RX是必需的,nCTS和nRTS是硬件流控制信号。
在异步通信时可以选择是否使用硬件流控制信号,同步通信时没有硬件流控制信号。
SCLK只用于同步通信,异步通信时无SCLK
通用 异步 串行 接收/发送器 ,只有异步模式,没有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中断,配置中断优先级
这样串口就配置好了
发送代码:
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);//清除中断标志位
- }
*略