当前位置: 首页 > news >正文

32单片机——串口

1、通信

通信的方式可以分为多种:

(1)按照数据传送方式可分为串行通信和并行通信;

①串行通信

        基本特征:数据逐位顺序依次传输

        优点:传输线少、布线成本低、灵活度高等优点,一般用于近距离人机交互,特殊处理后也可以用于远距离

        缺点:传输速率低

②并行通信

        基本特征:数据各位可以通过多条线同时传输

        优点:传输速率高

        缺点:布线成本高,抗干扰能力差因而适用于短距离、高速率的通信

(2)按照通信的数据同步方式,可分为异步通信和同步通信

①同步通信

        要求通信双方共用同一时钟信号,在总线上保持统一的时序和周期完成信息传输

         优点:可以实现高速率、大容量的数据传输,以及点对多点传输

        缺点: 要求发送时钟和接收时钟保持严格同步,收发双方时钟允许的误差较小,同时硬件复杂

②异步通信

        不需要时钟信号,而是在数据信号中加入开始位和停止位等一些同步信号,以便使接收端能够正确地将每一个字符接收下来,某些通信中还需要双方约定传输速率

        优点 :没 有时钟信号硬件简单,双方时钟可允许一定误差

        缺点:通信速率较低,只适用点对点 传输

(3)按照数据的传输方向又可分为单工、半双工和全双工通信

①单工:数据传输仅能沿一个方向,不能实现反方向传输。如校园广播

②半双工:数据共用一条线路沿着两个方向,但是需要分时进行。如对讲机

③全双工:数据利用两条线路同时进行双向传输,一条用于发送数据,另一条用于接收数据。如打电话

1.1 通信速率

        衡量通信性能的一个非常重要的参数就是通信速率,通常以比特率(Bitrate)来表示。比特率是每秒钟传输二进制代码的位数,单位是:位/秒( bps)

如:每秒钟传送240个字符,而每个字符格式包含10位(1个起始位、1个停止位、8个数据位),这时的比特率为:10位×240个/秒=2400bps

        波特率表示每秒钟传输了多少个码元。而码元是通信信号调制的概念,通信中常用时间间隔相同的符号来表示一个二进制数字,这样的信号称为码元。

如:常见的通信传输中,用0V表示数字0,5V 表示数字1,那么一个码元可以表示两种状态0和1,所以一个码元等于一个二进制比特位,此时波特率的大小与比特率一致;如果在通信传输中,有0V、2V、4V以及6V分别表示二进制数00、01、10、11,那么每个码元可以表示四种状态,即两个二进制比特位,所以码元数是二进制比特位数的一半,这个时候的波特率为比特率的一半

        由于很多常见的通信中一个码元都是表示两种状态,所以我们常常直接以波特率来表示比特率

1.2 常见的串行通信接口

2、串口(RS-232)

        串口通信是一种设备间常用的串行通信方式,串口按位(bit)发送和接收字节。尽管比特字节(byte)的串行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据

        串口通信协议是指规定了数据包的内容,内容包含了起始位、主体数据、校验位及停止位,双方需要约定一致的数据包格式才能正常收发数据的有关规范。在串口通信中,常用的协议包括 RS-232、RS-422和RS-485等

2.1 RS-232接口(DB9)

(1)数据:

        TXD(pin 3):串口数据输出

        RXD(pin 2):串口数据输入

(2)握手:

        RTS(pin 7):请求发送

        CTS(pin 8):清除发送

        DSR(pin 6):数据发送就绪

        DCD(pin 1):数据载波检测

        DTR(pin 4):数据终端就绪

(3)地线:GND(pin 5):信号地

(4)其他:RI(pin 9):振铃指示

2.2 RS-232通信

注意:两个设备之间的TXD和RXD,必须交差连接,方可正常通信 

2.3 STM32串口与电脑USB口通信

注意:两个设备之间的TXD和RXD,必须交差连接,方可正常通信 

2.4 RS-232电平、COMS电平与TTL电平的区别

一般情况下 

(1)RS-232电平

        逻辑1:-15V ~ -3V

        逻辑0:+15V ~ +3V

(2)COMS电平

        逻辑1:3.3V

        逻辑0:0V

(3)TTL电平

        逻辑1:5V

        逻辑0:0V

3、STM32的USART

        USART:Universal synchronous asynchronous receiver transmitter,通用同步异步收发器,常用的是异步通信

(1)特征

①全双工异步通信

②单线半双工通信

③单独的发送器和接收器使能位

④可配置使用DMA的多缓冲器通信

⑤多个带标志的中断源

(2)外设的引脚

USART框图

①USART信号引脚

        TX:发送数据输出引脚

        RX:接收数据输入引脚

        SW_RX:数据接收引脚,属于内部引脚,用于智能卡模式

        IrDA_RDI:IrDA 模式下的数据输入

        IrDA_TDO:IrDA模式下的数据输出

        nRTS:发送请求,若是低电平,表示USART准备好接收数据

        nCTS:清除发送,若是高电平,在当前数据传输结束时阻断下一次的数据发送 

        SCLK:发送器时钟输出,适用于同步传输

②数据寄存器

        USART_DR包含了已发送或接收到的数据,它由两个寄存器组成,一个专门给发送用的(TDR),一个专门给接收用的(RDR),该寄存器具备读和写的功能

        TDR寄存器提供了内部总线和输出移位寄存器之间的并行接口

        RDR寄存器提供了输入移位寄存器和内部总线之间的并行接口

        当进行数据发送操作时,往USART_DR中写入数据会自动存储在TDR内;当进行读取操作时,向USART_DR读取数据会自动提去RDR数据

发送数据的流程

接收数据的流程 

 

③控制器

        USART有专门控制发送的发送器,控制接收的接收器,还有唤醒单元、中断控制等等

④时钟与波特率

        主要功能:为USART提供时钟以及配置波特率,常用的波特率:4800、9600、115200

4、案例

根据接收到不同的指令,进行不同的操作(0x0d--回车--\r;0x0a--换行--\n)
      0x21 0x0d 0x0a ----> led0亮
      0x22 0x0d 0x0a ----> led0灭
      0x23 0x0d 0x0a ----> beep响
      0x24 0x0d 0x0a ----> beep不响

串口的配置文件:【免费】32单片机-串口的配置资源-CSDN文库

main.c 

#include "./SYSTEM/delay/delay.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/EXTI/exti.h"
#include "./BSP/BEEP/beep.h"


int main(void){
    uint16_t count;
    HAL_Init();
    sys_stm32_clock_init(RCC_PLL_MUL9);  //设置系统时钟
    delay_init(72);
    
    led_init();
    beep_init();
    
    usart_init(115200);  //串口
    while (1){
        //实时监测状态变量的值
        if(g_usart_rx_sta & 0x8000){        //接收到bit15位
            count=g_usart_rx_sta & 0x3fff;
            HAL_UART_Transmit(&g_uart1_handle,(uint8_t *)g_usart_rx_buf,count,1000);  //将指定内容发送出去
            /*
            分析接收到的内容/指令进行不同的操作
            */
            if((g_usart_rx_sta & 0xc000)==0xc000){  // 0xC000表示同时设置了bit15和bit14
                if(g_usart_rx_buf[0]==0x21){  //led0亮
                    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);
                }else if(g_usart_rx_buf[0]==0x22){  //led0灭
                    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
                }else if(g_usart_rx_buf[0]==0x23){  //beep响
                    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);
                }else if(g_usart_rx_buf[0]==0x24){  //beep不响
                    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
                }
            }
            //等待发送完成
            while(__HAL_UART_GET_FLAG(&g_uart1_handle,UART_FLAG_TC)!=SET);
            g_usart_rx_sta=0;
        }else{
            delay_ms(20);
        }
  }
}


 

HAL_UART_Transmit 

用于通过UART(串口)发送数据

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout) 

①参数1:UART句柄,用于标识不同的UART模块

②参数2:要发送的数据缓冲区指针 

③参数3:要发送的数据长度 

④参数4:发送超时时间,单位为毫秒 

__HAL_UART_GET_FLAG

用来获取状态寄存器的标志位 

#define __HAL_UART_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->SR & (__FLAG__)) == (__FLAG__)) 

①参数1:串口句柄

②参数2:标志位宏 

UART_FLAG_TC 

#define UART_FLAG_TC             ((uint32_t)USART_SR_TC

#define USART_SR_TC                USART_SR_TC_Msk               /* 传输完成 */ 

相关文章:

  • C++初阶-string类1
  • Hadoop虚拟机中配置hosts
  • 微信小程序 XSS 防护知识整理
  • 上海车展,世界模型 + VLA,城区智驾进入下半场
  • 同时启动俩个tomcat压缩版
  • spring--事务详解
  • react-10样式模块化(./index.module.css, <div className={welcome.title}>Welcome</div>)
  • 神经网络用于地震数据时空均匀插值的方法与开源资料
  • 六、UI自动化测试06--PO设计模式
  • micro-app前端微服务原理解析
  • 论文笔记(八十二)Transformers without Normalization
  • linux系统加固
  • 逻辑回归之参数选择:从理论到实践
  • GNU gettext 快速上手
  • 两向量平行公式、向量与平面平行公式、两平面平行公式;两向量垂直公式、向量与平面垂直公式、两平面垂直公式
  • 基于 HT 构建 2D 智慧仓储可视化系统的技术解析
  • IP 地址和 MAC 地址是如何转换的
  • mac下载homebrew 安装和使用git
  • 3.2goweb框架GORM
  • 基于BM1684X+RK3588的智能工业视觉边缘计算盒子解决方案
  • 5月起,这些新规将施行
  • 朝鲜海军新型驱逐舰进行首次武器系统测试
  • 排除燃气爆炸、人为放火可能,辽宁辽阳火灾事故起火原因正在调查
  • 烟花、美食和购物优惠都安排上了,上海多区开启热闹模式
  • 安徽省公安厅原副厅长刘海石主动投案,正接受审查调查
  • 美情报机构攻击中国大型商用密码产品提供商,调查报告公布