zoukankan      html  css  js  c++  java
  • USART串行通信

    USART串行通信

    串行通信通常用于连接两个距离较远的物理设备

    基本原理

    串行通信最常用的通信标准是 RS232C

    image-20201219204059339

    右边的为更常用的一种

    • DSR: 指示数据通信设备是否准备好接受数据
    • DTR:数据终端设备准备好
    • RTS:请求由DTE向DCE发送数据
    • CTS:请求清除发送信号,由DCE发出
    • DCD:数据载波检出,表示本地DCE设备收到对方DCE设备的数据,通知DTE设备准备好接收数据
    • TxD:发送数据
    • RxD:接收数据
    • SG,PG:信号地和保护地,实际只用信号地

    RS232C的连接

    image-20201219205204071

    流控和握手

    • 无握手:通信双方必须设置同样的通信速率,否则很容易造成接收方数据溢出
    • 硬件握手:发送方真正发送数据之前,通过设置RTS为有效通知接收方做好准备,接收方准备好后将CTS置为有效通知已准备好,然后等待数据
    • 软件握手:通过特殊字符"XON"和"XOFF"来实现流控

    STM32的串行通信模块

    分频设置和波特率选择

    一切数字电路都需要时钟脉冲的驱动才能工作,波特率与时钟输入信号频率的关系为

    [mathrm{Baud} = frac{f_{ck}}{16 imesmathrm{USARTDIV}} ]

    USARTDIV是一个无符号的定点数,在BRR寄存器中,第4~15位设置了该定点数的整数部分,0~3位设置了定点数的小数部分。

    小数部分除上16加上整数部分就得到了定点数。

    常用全双工异步通信的发送配置

    image-20201219212332047

    全双工异步通信的接收配置

    image-20201219212559877

    USART常用的库函数

    1. USART_Init(USARTx, USART_InitStructure*)

      初始化USART模块

    2. USART_Cmd(UASRTx, ENABLE)

      使能USART

    3. USART_SendData(USARTx, u8*);

      发送数据

    4. USART_GetFlagStatus(UASRTx, USART_FLAG_TXE)

      获得相应位的值

    发送数据给终端示例

    省去麻烦的初始化配置代码

    while (NumberOfDataToTransfer--) {
        //这里可以看出每次发送数据只能发送一个字节
        USART_SendData(USART2, TxBuffer[TxCounter++]);
        //这里可以看出每次发送完一个字节后必须等到接收端将TXE RESET位拉低
        while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
    }
    

    从终端接收数据发送给通信端,然后又发送回来

    do {
        if ((USART_GetFlagStatus(USART2, USART_FLAG_TXNE) != RESET) && (RxCounter < RxBufferSize)) {
            RxBuffer[RxCounter] = USART_ReceiveData(USART2);
            USART_SendData(USART2, RxBuffer[RxCounter++]);
        }
    } while ((RxBuffer[RxCounter-1] != '
    ') && (RxCounter != RxBufferSize));
    
  • 相关阅读:
    python随笔:邮箱题目
    05 小程序自定义组件
    04 小程序常用组件-view text rich-text icon swiger
    03 小程序语法-WXSS样式-尺寸-样式 -选择器
    02 小程序语法-数据绑定与事件绑定
    01 小程序入门与vscode开发加装插件
    JAVA25-Git、Vue.js
    JAVA14-File类、递归、字节流、字符流、缓冲流、转换流、序列化流、Files
    JAVA13-异常、线程、同步、等待与唤醒案例、线程池、Lambda表达式
    JAVA12-Scanner类、Random类、ArrayList类、String类、static、Arrays类、Math类、静态方法
  • 原文地址:https://www.cnblogs.com/lunar-ubuntu/p/14162257.html
Copyright © 2011-2022 走看看