同步串口通信与异步串口通信

   

同步串口通信与异步串口通信     

     串口通信(Serial Communications)即串口按位(bit)发送和接收字节的通信方式。常见的串口通讯主要有异步串口通讯,和同步串口通讯两种。常见的标准有232,485,TTL。

异步通信,是指数据传送按位发送,基本以个字符为一个单位,字符与字符间的传送是完全异步的,位与位之间的传送基本上是同步的。

异步串行通信的特点可以概括为:
1.以字符为单位传送信息。
2.相邻两字符间的间隔是任意长。
3.因为一个字符中的比特位长度有限,所以需要的接收时钟和发送时钟只要相近就可以。(只要保证波特率相同)
4.异步方式特点简单的说就是:字符间异步,字符内部各位同步。


同步通信,是指数据传送是以数据块(一组字符)为单位,字符与字符之间、字符内部的位与位之间都同步。

同步串行通信的特点可以概括为:
1.以数据块为单位传送信息。
2.在一个数据块(信息帧)内,字符与字符间无间隔。
3.因为一次传输的数据块中包含的数据较多,所以接收时钟与发送进钟严格同步,通常要有同步时钟。(既要保证波特率相同,物理上的时钟要要相同)
4.同步串口通讯每一步都要有应答位和spi相同。甚至异步通信可以当做SPI使用,来驱动SPI设备。

数据格式


      在异步串口通讯的数据格式中,规定了数据包的内容,它由启始位、主体数据、校验位以及停止位组成,通讯双方的数据包格式要约定一致才能正常收发数据,其数据帧组成如下:

有校验位的

     无校验位

同步传输的数据格式
(a)单同步格式,会送一帧数据仅使用一个同步字符。当接收端收到并识别出一个完整同步字符后,就连续接收数据。一帧数据结束,进行CRC校验。
同步字符 数据 CRC1 CRC2
(b)双同步字格式,这时利用两个同步字符进行同步。
同步字符1 同步字符2 数据 CRC1 CRC2
(c)同步数据链路控制(SDC)规程所规定的数据格式。
标志符01111110 地址符8位 数据 CRC1 CRC2 标志符01111110
(d)则是一种外同步方式所采用的数据格式。对这种方式,在发送的一帧数据中不包含同步字符。同步信号SYNC通过专门的控制线加到串行的接口上。当SYNC一到达,表明数据部分开始,接口就连续接收数据和CRC校验码。
数据场 CRC1 CRC2
(e)高级数据链路控制(HDLC)规程所规定的数据格式。它们均用于同步通信。这两种规程的细节本书不做详细说明。
标志符01111110 地址符8位 控制符8位 数据 CRC1 CRC2 标志符01111110
CRC(cyclic redundancy checks)的意思是循环冗余校验码。它用于检验在传输过程中是否出现错误,是保证传输可靠性的重要手段之一。

同步串口通讯,一般有专门的起始字符(同步字符帧),和停止字符帧,校验字符帧。每个字符帧不在具有单独的起始位和终止位,以及校验位。从而提高传输效率。适合高速,多字节传输。

补充知识点

   1.stm32的同步串口还是异步串口都可以实现真正全双工工作。而51的异步串口从本质上来说,因为收发都是用的同一个寄存器,所以是半双工工作,但是在接受和发送频率不这么高的地方,一般也就当做全双工用。(本来异步串口通讯就是用在频率不是这么高的地方)

•    比特率(Bitrate)表示每秒钟传输的二进制位数,单位为比特每秒(bit/s)。
•    波特率(Baudrate)表示每秒钟传送的码元符号的个数,是衡量数据传送速率的指标。
•    码元是通讯信号调制的概念,通讯中常用时间间隔相同的符号来表示一个二进制数字,这样的信号称为码元。 常见的通讯传输中,用 0V 表示数字 0, 5V 表示数字 1,那么一个码元可以表示两种状态 0 和 1,所以一个码元等于一个二进制比特位,此时波特率的大小与比特率一致。 如果每个码元在通讯传输中,有 0V、2V、 4V 以及 6V 这4种状态,对应二进制数 00、 01、 10、 11,4种情况,相当于2个二进制,所以码元数是二进制比特位数的一半,这个时候的波特率为比特率的一半。

因为很多常见的通讯(比如串口通讯)中一个码元都是表示两种状态,所以大家常常直接以波特率来表示比特率 。

对于异步串口通信即使是单片机的晶振不相同也是不影响的,因为波特率相同就说明双方每秒收发2进制数是相同。这样就可以正常传输,和结束了。

CRC校验,可以理解为,就是除法关系。传输数据为被除数,发送数据方有个除数,两者的余数为校验位,接收方,将接收到的数据作为除数,然后除以相同的被处数,比较余数是否相等。从而达到校验的目的。

串口配置只有发送

对于异步串口配置,51与32本质是一样的

主要是以下这几步

1.配置波特率,确定收发数据位

2.确定有无校验位

3.配置波特率发生时钟(主要是51要配置)

4.配置中断清除中断标志位

5.还要确定端口(对于51就一个,软件端不用配置,对于32端有多个端口这时软件要注意配置)

stm32的串口程序

/*******************************************************************************
* 实验名称  	: USART串口通信实验
* 实验说明  : 注意:打开串口调试助手后,要先勾选DTR后再取消,见实验截图
* 接线说明  : 				
* 实验现象	: 核心板上D1指示灯闪烁,打开串口调试助手,实验现象可见文件内截图
*******************************************************************************/

#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "usart.h"

int main()
{
	u8 i=0;  
	SysTick_Init(72);
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组 分2组
	LED_Init();
	USART1_Init(9600);
	
	while(1)
	{
		i++;
		if(i%20==0)
		{
			led1=!led1;
		}
		delay_ms(10);
	}
}




//
#ifndef __usart_H
#define __usart_H

#include "system.h" 


void USART1_Init(u32 bound);


#endif

/


#include "usart.h"		 

/*******************************************************************************
* 函 数 名         : USART1_Init
* 函数功能		   : USART1初始化函数
* 输    入         : bound:波特率
* 输    出         : 无
*******************************************************************************/ 
void USART1_Init(u32 bound)
{
   //GPIO端口设置
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
 
	
	/*  配置GPIO的模式和IO口 */
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//TX			   //串口输出PA9
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;	    //复用推挽输出
	GPIO_Init(GPIOA,&GPIO_InitStructure);  /* 初始化串口输入IO */
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//RX			 //串口输入PA10
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;		//浮空输入
	GPIO_Init(GPIOA,&GPIO_InitStructure); /* 初始化GPIO */
	

   //USART1 初始化设置
	USART_InitStructure.USART_BaudRate = bound;//波特率设置
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式
	USART_Init(USART1, &USART_InitStructure); //初始化串口1
	
	USART_Cmd(USART1, ENABLE);  //使能串口1 
	
	USART_ClearFlag(USART1, USART_FLAG_TC);
		
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启相关中断

	//Usart1 NVIC 配置
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;		//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器、	
}

/*******************************************************************************
* 函 数 名         : USART1_IRQHandler
* 函数功能		   : USART1中断函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/ 
void USART1_IRQHandler(void)                	//串口1中断服务程序
{
	u8 r;
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断
	{
		r =USART_ReceiveData(USART1);//(USART1->DR);	//读取接收到的数据
		USART_SendData(USART1,r);
		while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);
	} 
	USART_ClearFlag(USART1,USART_FLAG_TC);//清除标志串口标志位
} 	

 

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码飞升,先练内功

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值