• 【蓝桥杯物联网赛项学习日志】Day4 关于USART/UART


    关键词: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 等待时间

    对串口发送数据和接收数据 代码进行改写

    1. void UART_Transmit(uint8_t *ucData,uint8_t ucSize)
    2. {
    3. HAL_UART_Transmit(&huart2,ucData,ucSize,100);
    4. }
    5. uint8_t UART_Receive(uint8_t *ucData)
    6. {
    7. return HAL_UART_Receive(&huart2,ucData,1,0);
    8. }

    在UART.h头文件中添加

    1. /* USER CODE BEGIN Prototypes */
    2. void UART_Transmit(uint8_t *ucData,uint8_t ucSize);
    3. uint8_t UART_Receive(uint8_t *ucData);
    4. /* USER CODE END Prototypes */

    在主函数中编写功能代码,实现数据的发送与接收

    1. void UART_Proc(void) /* UART处理 */
    2. {
    3. if(ucSec1 != ucSec)
    4. { /* 1s到 */
    5. ucSec1 = ucSec;
    6. UART_Transmit(ucBuf, 4); /* 发送4个字符 */
    7. printf(" %04u\r\n", ucSec); /* 发送秒值和回车换行 */
    8. }
    9. if(UART_Receive(ucUrx) == 0) /* 接收到字符 */
    10. {
    11. ucUrx[++ucUno] = ucUrx[0]; /* 保存字符 */
    12. if(ucUno >= 2)
    13. { /* 修改秒值 */
    14. ucSec = (ucUrx[1]-0x30)*10+ucUrx[2]-0x30;
    15. ucUno = 0;
    16. }
    17. }
    18. }

    以上代码来自示例代码。

    多种发送接受方式以及中断处理

    发送数据的方式

    1. //阻塞模式发送数据
    2. HAL_UART_Transmit();
    3. //中断模式发送数据
    4. HAL_UART_Transmit_IT();
    5. //DMA模式发送数据
    6. HAL_UART_Transmit_DMA();

    接受数据的方式

    1. //阻塞模式接受数据
    2. HAL_UART_Receivemit();
    3. //中断模式接受数据
    4. HAL_UART_Receivemit_IT();
    5. //DMA模式接受数据
    6. HAL_UART_Receivemit_DMA();

     中断处理

    1. //接受中断处理
    2. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    3. {
    4. uint8_t* rex;
    5. if(huart->Instance == USART2)
    6. {
    7. //发送接收到的字符数据
    8. HAL_UART_Receive(huart,rex,sizeof(rex),0);
    9. HAL_UART_Transmit(huart,rex,sizeof(rex),10);
    10. HAL_GPIO_TogglePin(K1_GPIO_Port,K1_Pin);
    11. }
    12. __HAL_UART_CLEAR_FLAG(&huart2,UART_IT_TC);//清除中断标志位
    13. }
    14. //发送中断处理
    15. void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
    16. {
    17. uint8_t* Tra;
    18. if(huart->Instance == USART2)
    19. {
    20. //中断处理
    21. }
    22. __HAL_UART_CLEAR_FLAG(&huart2,UART_IT_TC);//清除中断标志位
    23. }

    DMA串口传输

    *略

  • 相关阅读:
    人工智能 :一种现代的方法 第七章 逻辑智能体
    2022/6/29学习总结
    字符串
    JavaScript之无题之让人烦躁的模块化
    jquey+mybatis-plus实现简单分页功能
    04设计模式-建造型模式-工厂模式
    OpenCV自学笔记八:几何变换
    C# AnimeGAN 漫画风格迁移 动漫风格迁移 图像卡通化 图像动漫化
    流水线的dependence问题(指令相关性)
    Python中zip函数的使用方法
  • 原文地址:https://blog.csdn.net/peng_papa/article/details/127909324