完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
通信的基本概念
通信的方式可以分为多种,按照数据传送方式可分为串行通信和并行通信。按照通信的数据同步方式,可分为异步通信和同步通信。按照数据的传输方式又可分为单工,半双工和全双工通信。 (1) 串行通信 串行通信是指使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。其只需要少数几条线就可以在系统间交换信息,特别适用于计算机与计算机,计算机与外设之间的远距离通信。如下图所示: 串行通信的特点:传输线少,长距离传送时成本低,且可以利用电话网等现成的设备,但数据的传送控制比并行通信复杂。 (2)并行通信 并行通信通常是将数据字节的各位用多条数据线同时进行传送,通常是8位,16位,32位等数据一起传输。如下图所示。 并行通信的特点:控制简单,传输速度快,由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难,,抗干扰能力差。 异步通信与同步通信 (1)异步通信 异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程,为使双方的收发协调,要求发送和接收设备的时钟尽可能一致。 异步通信是以字符(构成的帧)为单位进行传输,字符与字符之间的间隙(时间间隔)是任意的,但每个字符中的各位是以固定的时间传送的,即字符之间不一定有“位间隔”的整数倍的关系,但同一字符内的各位之间的距离均为“位间隔”的整数倍,如下图所示: 异步通信的特点,不要求收发双方时钟的严格一致,实现容易,设备开销较小,但每个字符要附件2~3位用于起止位,各帧之间还有间隔,因此传输效率不高。 (2)同步通信 同步通信是要建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步,此时,传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符间不留间隙,即保持同步关系,也保持字符同步关系。发送方对接收方的同步可以通过两种方法实现。如下图所示: 单工,半双工与全双工通信 (1)单工通信 单工是指数据传输仅能沿一个方向,不能实现反向传输。如下图所示: (2)半双工通信 半双工是指数据传输可以沿两个方向,但需要分时进行,如下图所示: (3)全双工通信 全双工是指数据可以同时进行双向传输,如下所示: 通信速率 衡量通信性能的一个非常重要的参数就是通信速率,通常以比特率来表示,比特率是每秒钟传输二进制代码的位数,单位是:位/秒(bps);如每秒钟传送240个字符,而每个字符格式包含10位(1个起始位,1个停止位,8个数据位),这时比特率为: 10位*240个/秒=2400bps 在后没会遇到一个波特率的感念,它表示每秒钟传输了多少个码元,而码元是通信信号调制的概念,通信中常用时间间隔相同的符号来表示一个二进制数字。这样的信号称为码元。如常见的通信传输中,用0V表示数字0,5V表示数字1,那么一个码元可以表示两种状态0和1,所以一个码元等于一个二进制比特位,此时波特率的大小与比特率一致;如果在通信传输中,有0V,2v,4V以及6V分别表示二进制比特位,所以码元可以表示四种状态,即两个二进制比特位,所以码元数是二进制比特位数的一般,这个时候的波特率为波特率的一半,由于很多常见的通信中一个码元都是表示两种状态。 所以常常直接以波特率来表示比特率。 单片机串口介绍 串口通信简介 串口通信是指外设和计算机通过数据信号线,地线等按位进行传输数据的一种通信方式,属于串行通信方式。串口是一种接口标准,他规定了接口的电器标准,没有规定接口插件电缆以及使用的协议。 (1)接口标准 串口通信的接口标准有很多,有RS-232C,RS-232,RS-422A,RS-485等。常用的就是RS232和RS-485。RS-232其实是RS-232C的改进,原理是一样的。这里我们就以RS-232C接口进行讲解,RS-485在后面章节中会介绍。 RS-232C是EIA(美国电子工业协会)1969年修订RS-232C标准,RS-232C定义了数据终端设备(DTE)与数据通信设备(DCE之间的物理接口)标准。 RS-232C接口规定使用25针连接器,简称DB25连接器的尺寸及额插针的排列位置都有明确的定义。如下图所示: RS-232C还有一种9针的非标准连接器,简称DB9.串口通信使用的大多是DB9接口,DB25和DB接头有公头和母头之分,其中带针状的接头是公头,而带孔状的接头是母头。9针串口的外观图如下图所示: 从上图可以看到公头和母头的管脚定义顺序是不一样,这一点需要特别注意。这些管脚都有什么作用呢?9针串口和25针串口常用管脚的功能说明如下图所示: 在串口通信中,通常我们只使用2,3,5三个管脚,即TXD,RXD,SGND,其他管脚功能大家看不明白也没关系; RS-232C对逻辑电平也做了规定,如下: 在TXD和RXD数据线上; 1.逻辑1为-3~15V的电压 2.逻辑0为3~15v的电压 在RTS,CTS,DTR和DCD等控制线上; 1.信号有效(on状态)为3~15V的电压 由此可见,RS-232C用正负电压来表示逻辑状态,与晶体管-晶体管逻辑集成电路(TTL)以高低电平表示逻辑状态额规定正好相反.而我们51单片机使用的就是TTL电平,所以要实现51单片机与计算机的串口通信,需要进行TTL与RS-232C电平转换,通常使用的电平转换芯片是MAX232. 在串口通信中通常PC机的DB9为公头,单片机上使用的串口DB9为母头,通过一根直通串口线进行相连。在9针串口线实物图即为直通型串口线,串口线(com)母头连接计算机DB9的公头,串口线公头连接单片机使用的DB9母头,这样就是将2,3,5管脚直接相连。如果你要实现两台计算机串口通信,那么就需要一根交叉串口线,将2对3,3对2,5对5连接,交叉串口线一般两头都是母头。 串口通信中还需要注意的是,串口数据收发线要交叉连接,计算机的TXD要对应单片机的RXD,计算机的RXD要对应单片机的TXD,并且共GND,如下图: 有一个疑问,在计算机与单片机进行串口通信时,使用的不是直通线吗,这时候怎么让RXD交叉连接?前面我们说单片机处理的是TTL电平,需要使用RS232电平转换芯片,将RS232电平转换芯片串行数据输出管脚交叉连接在DB母头上即可。 (2)通信协议 RS232的通信协议比较简单,通常遵循96-N-8-1格式。 “96”表示的是通信波特率为9600,。串口通信中使用的是异步串口通信,即没有时钟线,所以两个设备要通信,必须要保持一致的波特率,当然,波特率常用值还有4800,115200等。 “N”表示的无校验位,由于串口通信相对更容易受到外部干扰导致传输数据出现偏差,可以在传输过程加上校验来解决这个问题。校验方法有奇校验(odd),偶校验(even),0校验(space),1校验(mark)以及无校验(noparity) “8”表示的数据位数为8位,其数据格式在前面介绍异步通信中已讲过。当然数据位还可以5,6,7位长度。 1表示的是1位停止位,串口通讯的一个数据包从起始信号开始,直到停止信号结束。数据包的起始信号由一个逻辑0的数据位表示,而数据包的停止信号可由0.5,1,1.5或2个逻辑1的数据位表示,只要双方约定一致即可。 (3)串口内部结构 上图中右边的TXD和RXD为单片机IO口,TXD对应的是P3.1管脚,RXD对应的是P3.0管脚。 串口相关寄存器 (1)串口控制寄存器SCON SMO 和SM1为工作方式选择位; SM2:多机通信控制位,主要用于方式2和方式3.当SM2=1时可以利用收到的RB8来控制是否激活RI(RB8=0时不激活RI,收到的信息丢弃;RB8=1时收到的数据进入SBUF,并激活RI。进而在中断服务中将数据从SBUF读走。当SM2=0时,不论收到的RB8为0和1,均可以使收到的数据进入SBUF,并激活RI即此时RB8不具有控制RI激活的功能)。通过控制SM2,可以实现多机通信。 REN:允许串行接收位。有软件置REN=1,则启动串行口接收数据,若软件置REN=0,则禁止接收。 TB8:在方式2或者方式3中,是接收到数据的第九位,可以用软件规定其作用。可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位。在方式0和方式1中,该位未用到。 TI:发送中断标志位。在方式0时,当串行发送第8位数据结束时,或在其它方式,串行发送停止位的开始时,有内部硬件使TI置1,向CPU发中断申请。在中断服务程序 中,必须用软件将其清0,取消此中断申请。 RI:接收中断标志位。在方式0时,当串行接收第8位数据结束时,或在其它方式,串行接收停止位的中间时,由内部硬件使RI置1,向CPU发中断申请。也必须在中断服务程序中,用软件将其清0,取消此中断申请。 (2)电源控制寄存器PCON SMOD:波特率倍增位。在串口方式1,方式2,方式3时,波特率与SMOD有关,当SMOD=1时,波特率提高一倍。复位时,SMOD=0. 串口工作方式 (1)方式0 方式0时,串行口为同步移位寄存器的输入输出方式。主要用于扩展 并行输入或输出口。数据由RXD(P3.0)引脚输入或输出,同步移位脉冲由TXD(P3.1)引脚输出。发送和接收均为8位数据,低位在先,高位在后。波特率固定为fosc/12;对应的输入输出时序图如下所示: (1)方式0输出 (2)方式0输入 (2)方式1 方式1是10位数据的异步通信口,TXD为数据发送引脚,RXD为数据接收引脚。传送一帧的格式如下所示。其中1位起始位,8位数据位,1位停止位。 对应的输入输出时序图如下所示: (1)方式1输出 内容有待更新。。。 代码收到的数据进入 /*实验现象:程序运行后,打开串口调试助手,将波特率设置为4800,选择发送数据就可以显示。 */ #include "reg52.h" typedef unsigned int u16; typedef unsigned char u8; /*函数名:UsartInit() 函数功能:设置串口 输入:无 输出:无 */ ``void UsartInit() { SCON=0X50;//设置工作方式为1 TMOD=0X20;//设置计数器工作方式2 PCON=0X80;//波特率加倍 TH1=0XF3;//计数器初始值设置,注意波特率是4800的 TL1=0XF3; ES=1;//打开接收中断 EA=1;//打开总中断 TR1=1;//打开计数器 } void main() { UsartInit(); while(1); } void Usart() interrupt 4 { u8 receiveData; receiveData=SBUF;//出去接收到的数据 RI=0;//清除接收中断标志位 SBUF=receiveData;//将接收到数据放入发送寄存器 while(!TI);//等待发送数据完成 TI=0;//清除发送完成标志位 } |
|
|
|
只有小组成员才能发言,加入小组>>
imx6ull 和 lan8742 工作起来不正常, ping 老是丢包
633 浏览 0 评论
3336 浏览 9 评论
3013 浏览 16 评论
3506 浏览 1 评论
9098 浏览 16 评论
1216浏览 3评论
631浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
619浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2361浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1926浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-11 13:40 , Processed in 1.161644 second(s), Total 79, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号