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

嵌入式单片机---串口通信及相关通信技术

一、通信方式分类

(一)按数据传输线路数量划分:串行通信与并行通信

类别定义特点
并行通信多个比特同时通过并行线进行传输优点:传输速率较高;缺点:占用大量芯片资源
串行通信将数据拆分成一个个比特,按照先后次序在一根总线上进行发送优点:系统占用资源少,结构简单;地位:主机间通信的常用方式

(二)按数据传输方向划分:单工、半双工、全双工通信

通信方式定义关键特点
单工通信(Simplex)数据仅能沿固定单一方向传输,一方永久为发送端,另一方永久为接收端1. 单向不可逆;2. 仅需1根传输总线
半双工通信(Half-Duplex)数据可沿两个方向传输,但不能同时双向传输,需切换传输方向1. 双向可逆,但需分时;2. 可共用1根传输总线;3. 存在“发送-接收”的切换
全双工通信(Full-Duplex)数据可沿两个方向同时传输,通信双方可同时发送和接收数据1. 双向同步进行;2. 通常需2根独立传输线(如TX/RX);3. 无切换延迟,交互效率最高

二、串口通信(UART)核心知识

(一)串口通信定义

通常指“异步串口通信(UART)”,是串行通信的一种,通过1根发送线(TX)和1根接收线(RX)实现双向数据传输,靠“波特率同步”,广泛用于短距离设备交互(如单片机与电脑、传感器与控制器),属于异步串行全双工通信方式。

(二)串口通信时序

串口通信空闲时数据线为高电平,数据以“帧”为单位传输,1帧包含4个固定部分,时序顺序如下:

        空闲时为高电平

  1. 起始位:帧的开始标志,必为低电平(持续1个“位时间”,$ \text{位时间} = \frac{1}{\text{波特率}} $),用于通知接收端“即将传数据”;
  2. 数据位:实际传输的二进制数据,通常为5~8位(最常用8位,即1个字节),按“低位在前(LSB)、高位在后(MSB)”传输;
  3. 校验位(可选):用于检错,分奇校验(数据位+校验位总“1”的个数为奇数)、偶校验(总“1”的个数为偶数)、无校验(省略);
  4. 停止位:帧的结束标志,为高电平,用于接收端确认1帧结束,以保证下一个字节发送前的起始位能够表现出来。

(三)串口通信速率

  1. 速率决定因素:串口通信速率由“波特率(Baud Rate)”决定,波特率指“每秒传输的信号变化次数”(对串口而言,通常1个信号变化对应1位数据,因此 $ \text{波特率} \approx \text{每秒传输的位数} $,即bps),且收发双方必须设置相同的波特率,否则会因“位时间不匹配”导致数据传输错误。
  2. 常见波特率(单位:bps):1200、2400、4800、9600(常用)、115200等。

三、同步通信与异步通信

通信类型定义优点缺点
同步通信通信设备之间除了需要数据线之外,还需额外的时钟线(如SCLK),收发双方通过时钟信号“同步节奏”,数据连续传输(无间隙),发送方负责控制时钟线的变化,每发送一个比特,都需要将时钟线按照规则进行改变,通常以“块”为单位传输(如16位、32位)无需起始/停止位,传输效率高需额外时钟线,线路成本高,时钟干扰会影响同步
异步通信无需时钟线,收发双方通过“约定相同的波特率”同步节奏,数据以“帧”为单位传输(每帧含起始/停止位,帧间可有空隙)线路少(仅TX/RX)、成本低,适合短距离因波特率偏差可能导致误码(需预留容错空间),效率略低

串口通信归属:串口通信(UART)属于异步通信,无需时钟线,靠起始/停止位和约定波特率实现数据同步。

四、常见电平标准(TTL、RS232、RS485)

三者是串口通信的“电平标准”(定义“0”和“1”对应的电压范围),核心差异是“电压范围”“传输距离”和“抗干扰能力”:

电平标准电平定义特点应用场景
TTL(晶体管-晶体管逻辑电平)高电平(1)= 3.3V/5V,低电平(0)= 0V电压范围小,抗干扰能力弱,传输距离短(通常≤10米)设备内部短距离通信(如单片机与传感器、模块间的板上通信)
RS232(Recommended Standard 232)高电平(1)= -15V~-3V,低电平(0)= +3V~+15V(与TTL反相)采用正负电压,抗干扰能力比TTL强,传输距离中等(通常≤15米),支持全双工(需TX/RX两根线)早期电脑串口(DB9接口)与外设通信(如Modem、单片机下载),需通过“TTL-RS232转换器”与TTL设备连接
RS485(Recommended Standard 485)采用“差分信号”(两根线A/B,通过A-B电压差判断电平:A>B时为1,A<B时为0),无固定电压范围(通常差分电压≥200mV即可识别)差分传输抗干扰能力极强,传输距离远(最大1200米),支持多设备联网(最多32/128台设备共享总线),默认半双工(仅需A/B两根线,全双工需额外两根线)工业现场长距离、多设备通信(如传感器网络、PLC控制、智能家居总线),需通过“TTL-RS485转换器”与TTL设备连接

五、USB相关

USB(通用串行总线)是一种常用的串行通信接口,具有即插即用、支持热插拔、传输速率较高、可同时为外部设备供电等特点,广泛应用于电脑与外部设备(如U盘、鼠标、键盘、手机等)的连接与数据传输,其通信方式为串行通信,支持全双工传输。

六、51单片机串口通信相关代码

(一)头文件引用

#include <reg52.h>  
#include <stdio.h>  
#include <string.h>  
#include "delay.h"  

(二)串口初始化函数

void init_uart(void)  
{  unsigned char t;  t = SCON;  t &= ~(3 << 6);  t |= (1 << 6) | (1 << 4);  SCON = t;  PCON |= (1 << 7);  t = TMOD;  t &= ~(3 << 4);  t |= (2 << 4);  t &= ~(3 << 6);  TMOD = t;  TH1 = 204;  TL1 = 204;  TCON |= (1 << 6);  IE |= (1 << 7) | (1 << 4);  
}  

(三)单个字符发送函数

void send_char(char ch)  
{  SBUF = ch;  while((SCON & (1 << 1)) == 0);  SCON &= ~(1 << 1);  
}  

(四)缓冲区发送函数

void send_buffer(const char *p, int len)  
{  while(len--)  {  send_char(*p++);  }  
}  

(五)串口中断服务函数

void uart_handler(void) interrupt 4  
{  if((SCON & (1 << 0)) != 0)  {  P2 = SBUF;  SCON &= ~(1 << 0);  }  
}  

(六)全局变量定义

xdata char recv_buffer[64];  
int pos = 0;  

(七)主函数

int main(void)  
{  int i = 1;  int n = 10;  char *p = (char *) &p;  xdata char buffer[32];  init_uart();  while(1)  {  n = sizeof(int);  sprintf(buffer, "int size  =  %d\n", n);  send_buffer(buffer, strlen(buffer));  n = sizeof(char);  sprintf(buffer, "char size  =  %d\n", n);  send_buffer(buffer, strlen(buffer));  n = sizeof(short);  sprintf(buffer, "short size  =  %d\n", n);  send_buffer(buffer, strlen(buffer));  n = sizeof(double);  sprintf(buffer, "double size  =  %d\n", n);  send_buffer(buffer, strlen(buffer));  n = sizeof(long);  sprintf(buffer, "long size  =  %d\n", n);  send_buffer(buffer, strlen(buffer));  n = sizeof(char *);  sprintf(buffer, "char * size  =  %d\n", n);  send_buffer(buffer, strlen(buffer));  delay(0x9FFF);  }  return 0;  
}  

http://www.xdnf.cn/news/1469935.html

相关文章:

  • PPIO上线kimi-k2-0905,编码能力大幅提升
  • 阿里云ESA 没有数据发送到SLS的解决
  • Linux调试命令速查:Java/微服务必备
  • 代码版本控制
  • C++ 异常
  • android嵌入式开发入门
  • GD32入门到实战34--ARM启动流程
  • 大模型——剪枝、量化、蒸馏、二值化
  • 一招快速识别你的电脑是机械硬盘还是固态硬盘
  • 笔记三 FreeRTOS中断
  • 虚拟机详细图文教程系列15、Linux虚拟机Centos8系统部署禅道开源项目
  • 如何修改drawio中的线条样式(将实线变为虚线)
  • unsloth笔记:基本介绍
  • SAP官方授权供应商名单2025
  • 神经网络|(十九)概率论基础知识-伽马函数·下
  • JavaSE丨IO流全解:从基础概念到序列化实战
  • 树莓派传感器扩展板资料
  • VMWare上搭建大数据集群
  • 8. Mono与IL2Cpp简介
  • mysql中null值对in子查询的影响
  • B.50.10.03-Nginx核心原理与电商应用
  • 基于STM32单片机FM调频TEA5767功放收音机液晶显示设计
  • Zynq-7000 上 RT-Thread 的 MMU 与 SMP 优势分析
  • 七彩喜智慧养老:科技向善,让“养老”变“享老”的智慧之选
  • 23种设计模式——桥接模式 (Bridge Pattern)详解
  • 极大似然估计与概率图模型:统计建模的黄金组合
  • 洛谷 P1099 [NOIP 2007 提高组] 树网的核-普及+/提高
  • ShareX神操作:多区域截图+特效功能!
  • linux ubi文件系统
  • Linux 文件系统及磁盘相关知识总结