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               /* 传输完成 */ 

### 51单片机串口通信实现英文字符和数据发送 #### 单片机串口初始化 为了使能51单片机串口功能,需先完成串口中断配置以及波特率设置。通常情况下,串口工作模式被设定为方式1(8位异步通信),并利用定时器T1作为波特率发生器[^1]。 以下是典型的串口初始化函数代码示例: ```c void uart_init() { TMOD |= 0x20; // 设置T1为模式2自动重装载 TH1 = 0xFD; // 波特率为9600bps, fosc=11.0592MHz SCON = 0x50; // 串口工作于方式1,允许接收 TR1 = 1; // 启动T1计数器 } ``` 上述代码中`TH1`寄存器用于定义波特率分频值,而`SCON`控制寄存器则设定了串口的工作模式及其基本属性。 #### 字符与字符串发送 对于简单的英文字母或ASCII码范围内的数值传输,可以调用专门设计好的子程序来逐字节处理待发的数据流。下面分别展示单独字符及整条消息传送的方法[^2]: - **单一字符发送** ```c void uart1_sendByte(unsigned char byte){ while(!TI); // 等待上一次发送结束 TI = 0; SBUF = byte; // 将要发送的数据放入SBUF缓冲区 } ``` 此部分逻辑等待直到前一帧完全送出后再加载新的目标值到移位寄存器里去。 - **字符串发送** 当需要连续传递多段信息时,则可循环调用前述基础单元操作构成更高级别的封装形式如下所示: ```c void uart1_sendstring(unsigned char *str){ unsigned int i=0; while (*(str+i) != '\0') { // 判断当前指针位置是否到达终止标志'\0' uart1_sendByte(*(str+i)); // 调用单字节发送函数 delay_ms(1); // 延迟一定时间防止冲突 i++; } } ``` 这里引入了一个额外延时环节以确保每轮交互之间留有足够的间隔避免潜在干扰现象的发生。 #### 数值转换成字符串再发送 如果打算把某些变量比如温度传感器读取结果之类的量化指标也纳入输出序列当中的话,那么就需要先把它们转化为对应的文本表达形式然后再按照前面介绍过的流程执行下去。例如针对无符号八比特整形参数的情况我们可以这样写: ```c void uart1_sendnum(unsigned char num1){ char buffer[4]; itoa(num1,buffer,10); uart1_sendstring(buffer); } ``` 其中运用到了标准库里的itoa函数负责完成从数字至相应进制编码下的字符串映射过程。 综上所述,借助以上几个核心组件即可轻松达成基于51系列MCU平台之上与其他设备间的基础级资料交换需求了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值