码迷,mamicode.com
首页 > 其他好文 > 详细

USART串行通信

时间:2020-12-25 11:36:11      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:信号   r++   整数   图片   工作   ++   cts   math   连接   

USART串行通信

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

基本原理

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

技术图片

右边的为更常用的一种

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

RS232C的连接

技术图片

流控和握手

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

STM32的串行通信模块

分频设置和波特率选择

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

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

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

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

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

技术图片

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

技术图片

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] != ‘\r‘) && (RxCounter != RxBufferSize));

USART串行通信

标签:信号   r++   整数   图片   工作   ++   cts   math   连接   

原文地址:https://www.cnblogs.com/lunar-ubuntu/p/14162257.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!