c语言单片机串口通讯,单片机C语言之串口通信协议

2023-05-16

串口通信概述

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

常用三种串口通信协议

1、RS-232

RS-232(ANSI/EIA-232标准)是IBM-PC及其兼容机上的串行连接标准。可用于许多用途,比如连接鼠标、打印机或者Modem,同时也可以接工业仪器仪表。用于驱动和连线的改进,实际应用中RS-232的传输长度或者速度常常超过标准的值。RS-232只限于PC串口和设备间点对点的通信。RS-232串口通信最远距离是50英尺。

6a257845692ffa6ffa3f7703b1878071.png

从计算机连出的线的截面。

RS-232针脚的功能:

数据:

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

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

握手:

RTS(pin 7):发送数据请求(Request to Send)

CTS(pin 8):清除发送(Clear to Send)

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

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

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

地线:

GND(pin 5):地线

其它

RI(pin 9):铃声指示

2、RS-422

RS-422(EIA RS-422-AStandard)是Apple的Macintosh计算机的串口连接标准。RS-422使用差分信号,RS-232使用非平衡参考地的信号。差分传输使用两根线发送和接收信号,对比RS-232,它能更好的抗噪声和有更远的传输距离。在工业环境中更好的抗噪性和更远的传输距离是一个很大的优点。

RS-485(EIA-485标准)是RS-422的改进,因为它增加了设备的个数,从10个增加到32个,同时定义了在最大设备个数情况下的电气特性,以保证足够的信号电压。有了多个设备的能力,你可以使用一个单个RS-485口建立设备网络。出色抗噪和多设备能力,在工业应用中建立连向PC机的分布式设备网络、其他数据收集控制器、HMI或者其他操作时,串行连接会选择RS-485。RS-485是RS-422的超集,因此所有的RS-422设备可以被RS-485控制。RS-485可以用超过4000英尺的线进行串行通行。

串口的基本结构

SBUF:51单片机中的特殊寄存器,串行数据缓冲器(一个接收一个发送),两个其实是共用的一个地址99H,但是两个在物理上面是分开的。

当发送使用时,就采用SBUF=XXX; (XXX为需要传送的数据)

当接收使用时,采用XXX=SBUF;

记得因为是串行的所以传输都是一位一位进行的。

T1溢出率:T1计时器的溢出频率(就是计时器每次低位计满向高位进位时间的倒数)

用处:用于计算波特率(每秒传输二进制代码的位数)

b77ce504592f5509b0c2fa1f396ccb7f.png

串口通信方式

并行

适合短距离通信,并行通信控制简单、相对传输速度快(8位一起传输)。

25fd5f778ea42e010780aba50061d281.png

串行

只能一位一位的传送。

eedc56f05f33a1b07bb3d7b8e64ff00e.png

同步(了解)

建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步。此时,传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符间不留间隙。

发送方对接收方的同步可以通过外同步和自同步

异步(常)

以字符(构成的帧)为单位进行传输。数据位从低到高传送。

格式:

ba762b1930b9146546b666508827edc5.png

这里的空闲时间是任意的。

单片机C语言之串口通信协议

现在我们要做一个实验,将一个字节从51单片机发送到电脑串口调试助手上。这个实验的目的是为了掌握串口通信协议的收发过程。

虚拟串口

实验一、虚拟串口实验

一般单片机都有专门的串口引脚,51里面分别是P3.0和P3.1,这些引脚拥有串口的硬件电路,因此使用它们并不需要设置信号的发送停止。为了掌握协议,我们使用其他的引脚来模拟串口,所以也叫虚拟串口。这里我们选用P1.0,然而注意到我们51单片机要发送数据给电脑,必须经过一个串口转USB设备(即TTL电平转换为RS232电平),而限于我们的开发板只有P3.0与P3.1连接到了串口转USB设备,所以我们可以将P1.0短接到P3.1 。 下图是这个串口转USB的原理图。

2ba9bee626a62b1444f21ada479905e0.png

代码如下:

#include “reg51.h”

/*

将P1.0虚拟成串口发送脚TX

以9600bit/s的比特率向外发送数据

因为波特率是 9600bit/s

所以me发送一位的时间是 t=1000000us/9600=104us

*/

sbit TX=P3^1; //P1^0 output TTL signal, need to transferred to rs232 signal, can be connected to P3^1

#define u16 unsigned int //宏定义

#define u8 unsigned char

u8 sbuf;

bit ti=0;

void delay(u16 x)

{

while(x--);

}

void TImer0_Init()

{

TMOD |= 0x01;

TH0=65440/256;

TH0=65440%256;

TR0=0;

}

void Isr_Init()

{

EA=1;

ET0=1;

}

void Send_Byte(u8 dat)

{

sbuf=dat;//通过引入全局变量sbuf,可以保存形参dat

TX=0; //A 起始位

TR0=1;

while(TI==0); //等待发送完成

TI=0; //清除发送完成标志

}

void TF0_isr() interrupt 1 //每104us进入一次中断

{

staTIc u8 i; //记录进入中断的次数

TH0=65440/256;

TL0=65440%256;

i++;

if(i》=1 && i《=8)

{

if((sbuf&(1《《(i-1)))==0) // (sbuf&(1《《(i-1)))表示取出i-1位

{

TX=0;

}

else

{

TX=1;

}

}

if(i==9) //停止位

{

TX=1;

}

if(i==10)

{

TR0=0;

i=0;

ti=1; //发送完成

}

}

void main()

{

TX=1; //使TX处于空闲状态

Timer0_Init();

Isr_Init();

while(1)

{

Send_Byte(65); //0x41

delay(60000);

}

}

实验引入了定时器0来控制发送线上的各个位的保持时间。首先main函数进入,TX置1则使发送线处于空闲,这时候发送方和接受方都处于空闲。接下来初始化定时器0,TR0置0表示还不要启动定时器0。接着中断系统初始化,此时中断系统已经开启。进入while循环,先进Send_Byte()函数,将65传给形参dat,dat再将65赋值给sbuf,到这里准备工作就做好了。接着TX置0,这个是起始位,要保持这个起始位104us。于是就启动定时器TR0置1,计时器开始计数。当第一次溢出的时候,也就是过了104us,进入中断,同时接收方也侦测到了这个突然被拉低的信号,于是迅速启动自己的定时器。进入中断子函数后,先是重装定时器初值,然后i加1,也就是当i=1时,就应该发送数据的最低位了,总共有8位数据,所以使用条件语句if(i》=1 && i《=8)来判断是否发送完数据位。然后再通过if(i==9) 来发送停止位,最后当i=10时,也就是发送完了,这时候要关闭定时器(那么程序也就),同时i置0,ti置1(才能跳出while(ti==0)循环),最后将ti置0,保证下次要发送字节时让程序停留在while(ti==0)。

片上串口

以上说的是虚拟串口,上文中谈到与串口相关的引脚P3.0与P3.1,事实上51单片机自带片上串口,那这个串口又该怎么使用呢?

片上串口支持同步模式与异步模式。简单来说同步模式就是指有时钟线,而异步模式无时钟线。这里的时钟线是指在同步通信时,用一根线专门传输时钟信号,这个信号用来与要发送的每一位保持同步,这样就避免了例如异步通信中因为采用定时器而引入的时间误差。

片上串口还支持8位模式和9位模式。如下图所示

68716797530b21a96af17b327492308a.png

其中D0-D7是一个字节的8个位。9位模式只是多了一个位TB8,这个TB8的作用是奇偶校验或多机通信。奇偶校验原理这不加分析。多机通信时比如主机只发送数据给网络中的一台地址为0x02的设备,这时候先让TB8为1,前面的D0-D7则为地址即0x02,之后再让TB8为0,前面的D0-D7则为数据了。

上面设置了片上串口的模式,另外还要设置串口的波特率。

片上串口的波特率等于定时器1工作在方式2时溢出率的32分频。如果要定时器1工作在方式2,那么TMOD=0x20。另外要保证为32分频,我们还必须设置计数器初值。设晶振为11.0592Mhz,则定时器的计数脉冲为F=f/12,则定时器每计一个脉冲的时间为T=12/f。又令计数器的起点为x,则溢出一次要计的脉冲数为(256-x)。所以在计数起点为x时,溢出一次的时间为t=12/f*(256-x)。则对应的溢出率为1/t=f/(12*(256-x))。对应的波特率就为b=f/(384*(256-x))。

x=256-f/(384*b)

其中f为晶振频率,b为希望的波特率,x为定时器的计数起点TH1的值。

例如当晶振为11.0592M,希望波特率为9600bit/s,则TH1=253。题外话,我们同样可以演算出在其他常用波特率情况下,TH1始终为一个整数。这里也就解释了为什么51里面选用了11.0592M的晶振而不是12M,这样就保证了串口的时序更加准确,虽然牺牲了定时器的准确度。

实验二,片外串口发送一个字节。

好了现在开始我们的实验之旅。直接看代码吧。

#include “reg51.h”

#define u16 unsigned int

#define u8 unsigned char

void delay(u16 x)

{

while(x--);

}

void Uart_Init() //串口初始化

{

SCON=0x50; //8位异步模式

TMOD|=0x20; //定时器1工作方式2

TH1=253;//9600bit/s

TR1=1;

}

void Send_Byte(u8 dat)

{

SBUF=dat; //启动发送,只需要把发送内容给SBUF这个寄存器

while(TI==0); //等待发送完成,因为TI为1时表示在发送停止位

TI=0;

}

void main()

{

Uart_Init();

while(1)

{

Send_Byte(‘m’);

delay(60000);

}

}

实验二较之实验一,代码减少了很多,而且不用考虑繁琐的位发送时序。只需要明白各个寄存器SCON,TMOD,TCON,SBUF的用法。TI是SCON中的第一位,为发送中断请求标志位。在本方式中,在停止位开始发送时由内部硬件置位,响应中断后TI必须又软件清零。

实验三、片上串口发送一个字符串

上面介绍了如何发送一个字节,那如何发送一个字符串甚至文本呢?这里我们首先介绍下字符串的概念。

字符串:从存储器的某个地址开始,连续存放多个字符的ASCII码,并且在最后一个字符的后面存放一个0,这段连续的内存空间就叫字符串,最后的0叫字符串的结束符。注意这里的0和加单引号的0不是一个概念,加单引号的0是指0的ASCII码。

数组与字符串的关系:字符串是数组的一种特殊情况,数组在特定条件下可当做字符串用。C语言用双引号描述一个字符串,如“abcd”。

下面我们通过一个实验来展示如何发送字符串。我们实验的目标是打印字符串“Hello World ! 第一!”到打印机。直接上代码。

#include “reg51.h”

#define u16 unsigned int

#define u8 unsigned char

void delay(u16 x)

{

while(x--);

}

void Uart_Init() //串口初始化

{

SCON=0x50; //8位异步模式

TMOD|=0x20; //定时器1工作方式2

TH1=253;//9600bit/s

TR1=1;

}

void Send_Byte(u8 dat) //串口发送一个字节

{

SBUF=dat; //启动发送,只需要把发送内容给SBUF这个寄存器

while(TI==0); //等待发送完成,因为TI为1时表示在发送停止位

TI=0;

}

void Send_String(u8 *str) //发送一个字符串 *str为字符串第一个字符的地址

{

abc: //标号

if(*str != 0)

{

Send_Byte(*str);

str++;

goto abc;

}

}

void main()

{

Uart_Init();

while(1)

{

Send_String(“Hello World! 第一!”);

Send_Byte(10);

delay(60000);

delay(60000);

}

}

实验效果

fa83f601afe6b5c4ff528ec1bd175179.png

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c语言单片机串口通讯,单片机C语言之串口通信协议 的相关文章

随机推荐

  • postman linux 安装包,Postman 下载和安装 · Postman API 自动化测试与持续集成全栈

    8种机械键盘轴体对比 本人程序员 xff0c 要买一个写代码的键盘 xff0c 请问红轴和茶轴怎么选 xff1f Postman 下载与安装 下载 Postman 有 Windows Linux MacOS 等多个版本 xff0c 另外也可
  • (超)超体素

    参考 xff1a PCL 超体聚类点云分割算法详解 x1f4a5 Voxel体素预了解 xff1a 图中是3D数据的不同表示类型 xff08 a xff09 点云 xff08 Point clouds xff09 xff1b b 体素网格
  • linux curl 绑定host,curl请求指定host ip(指定域名解析的内网某ip)

    RequireJS 模块的定义与加载 模块不同于传统的脚本文件 它良好地定义了一个作用域来避免全局名称空间污染 它可以显式地列出其依赖关系 并以函数 定义此模块的那个函数 参数的形式将这些依赖进行注入 而无需引用全局变量 RequireJ
  • http协议_网络协议HTTP详解

    一 http协议的定义 HTTP是超文本传输协议的缩写 是互联网上使用最为广泛的一种网络协议 xff0c 适用于www服务器传输超文本到本地浏览器传输协议 它可以使浏览器的传输更加高效 xff0c 使网络传输减少 他还能使计算机能快速准确的
  • cmake导入so库_CMake与动态链接库(dll, so, dylib)

    使用CMake可以很方便的实现跨平台编译 如果要Link一个第三方库 xff0c 需要针对平台进行设置 这里分享下如何创建一个简单的CMake工程实现Windows Linux和macOS上的自动编译 SDK下载 CMake下载安装 Win
  • ros 开源物体检测_机器人操作系统ROS—使用激光雷达RpLidar A1进行SLAM定位建图

    移动机器人在环境中获取障碍物的具体位置 房间的内部轮廓等信息都是非常必要的 xff0c 这些信息是机器人创建地图 进行导航的基础数据 考虑成本 xff0c 入手了一个SLAMTEC公司的低成本二维激光雷达RpLidar A1进行初步的学习
  • python实现登录抓取_[Python]网络爬虫(五):利用POST方式登录账号抓取

    今天的工作很有意思 我们用 Python 来登录网站 用Cookies记录登录信息 然后就可以抓取登录之后才能看到的信息 今天我们拿知乎网来做示范 为什么是知乎 这个很难解释 但是肯定的是知乎这么大这么成功的网站完全不用我来帮他打广告 知乎
  • linux tcp ip c,Linux下TCP/IP编程--TCP实战(select)

    本文参考自徐晓鑫 后台开发 xff0c 记录之 一 为什么要使用非阻塞I O之select 初学socket的人可能不爱用select写程序 xff0c 而习惯诸如connect accept recv recvfrom这样的阻塞程序 当让
  • 串口485接法图_rs485接口接线方法

    展开全部 RS485采用差分信号负逻辑 xff0c 43 2V xff5e 43 6V表示 0 xff0c 6V xff5e 2V表示 1 62616964757a686964616fe4b893e5b19e31333365643661RS
  • can帧格式 dlc_CAN帧格式(标准帧、拓展帧)

    来源 xff1a https www cnblogs com fengliu p 9277165 html CAN2 0B标准帧 CAN 标准帧信息为11个字节 xff0c 包括两部分 xff1a 信息和数据部分 前3个字节为信息部分 位置
  • c++发送soap协议报文_软件间对接时,常用的接口类型及协议有哪些?

    软件系统之间的接口是实现一个系统跟另外系统进行信息交互的桥梁 xff0c 接口一般分为两种 xff1a 程序内部的接口和系统对外的接口 软件接口的通常分为两类 xff1a webservice接口和http api接口 xff1a webS
  • RGB彩色图、Depth深度图

    x1f4a6 彩色图 xff0c 深度图 信息缺乏 如 xff0c 颜色相近导致位置信息丢失 x1f4a6 深度图 相近深度的物体 xff0c 因为颜色或纹理的丢失 xff0c 导致难区分 深度图并不可以直接使用 xff0c 因为深度图只能
  • 超声换能器的原理及设计_超声波焊接机模具的原理与设计(二)

    一只焊头的使用寿命关键决定于两个方面 xff1a 材料 工艺 材料方面 xff1a 超声波焊接要求金属材料有柔顺性好 声波传递过程中机械损耗小 好的特点 xff0c 所以最常用的材料为铝合金及钛合金 xff0c 材料是保证超声波模具寿命于熔
  • request python_Python request使用方法及问题总结

    一 总结说明 模拟postman访问接口 xff0c 具体参照七 python接口开发 xff08 二 xff09 gt gt 三 postman访问接口 本篇文章调用的接口 xff0c 也是来自于接口开发的源码 xff0c 阅读本篇文章最
  • rtk定位权限_RTK定位原理概述

    精品文档 一 RTK 定位原理概述 RTK 测量利用的是载波相位差分 GPS 技术来实时定位的 xff0c 正是凭 借差分改正和载波相位测距两种测量方法才使得动态定位的精度可 以达到厘米级 差分 GPS 技术是利用了基准站与流动站之间空间的
  • 给视频加字幕HTML代码,给Html5视频播放器添加字幕

    现在各种支持HTML5的浏览器都能够播放html5视频了 xff0c 但是对于字幕的支持却很少 xff0c 我们期待像DVD那样强大的字幕 往往我们还不得不通过js来做 xff0c 着实是一件痛苦的事情 现在IE10率先对HTML5 Vid
  • cmake 指定头文件路径_CMake教程(一)

    CMake官方文档 xff1a https cmake org cmake help v3 17 guide tutorial index html adding system introspection step 5 CMake的优点 高
  • Adam优化器

    Adam优化算法是一种对随机梯度下降法的扩展 简单来说 xff0c Adam是带动量的梯度下降算法和RMSProp算法的结合 对梯度的一阶矩估计 xff08 First Moment Estimation xff0c 即梯度的均值 xff0
  • C++输入至回车结束

    之前比赛被这个小问题难住了 xff0c 好坑啊 其实很简单 xff1a while cin gt gt a if cin get 61 61 39 n 39 break 举例 xff1a include lt bits stdc 43 43
  • c语言单片机串口通讯,单片机C语言之串口通信协议

    串口通信概述 串口通信指串口按位 bit 发送和接收字节 尽管比按字节 byte 的并行通信慢 xff0c 但是串口可以在使用一根线发送数据的同时用另一根线接收数据 常用三种串口通信协议 1 RS 232 RS 232 ANSI EIA 2