2017-07-24 23:06:05 qq_36629451 阅读数 14782
  • 单片机有很多-1.3.第1季第3部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第3个课程,主要讲了单片机的发展史,各种主流单片机的各自特点,STC51单片机的各系列的特点以及项目中如何选型主控单片机。

    2561 人正在学习 去看看 朱有鹏

首先弄懂串行通信和并行通信以及串口通信和并口通信的概念。

串行通行:它是一个概念,它是指数据一位一位地顺序传送,其特点就是通信线路

简单,只要一对传输线就可实现双向通信,适用于远距离通信,但传输速度慢。

包括普通的串口通信,I2C,SPI,UART...

串口通信:是一种实际通信方式,但是我们可以几乎看成一样.

串行接口:简称串口,或串行通信接口,或串行通讯接口(通常指com口)。

并行通信:如果一组数据的各数据位在多条线上同时被传输,那么就是并行通信。

并口接口:就是一种接口,各数据位同时被传输,传输速度快,效率高,一边可用于MCU。


串行通信又可分为单工,半双工和全双工

单工:信息只能单向传送。

半双工:信息能双向传送但不能同时。

全双工:信息能同时双向传送。

串行通信还可分为同步通信和异步通信

同步通信(两根线):是把许多字符组成一个信息组,这样,字符可以一个接一个地传输,但是,

在每组信息(通常称为信息帧)的开始要加上同步字符,在没有信息要传输时,要填上空字符,

因为同步传输不允许有间隙。同步方式下,发送方除了发送数据,还要传输同步时钟信号,

信息传输的双方用同一个时钟信号确定传输过程中每1位的位置

异步通信(一根信号线,没有时钟线)是一种很常用的通信方式。异步通信在发送字符时,所发送的字符之间的时间

间隔可以是任意的。当然,接收端必须时刻做好接收的准备。发送端可以在任意时刻开始发送字符,

因此必须在每一个字符的开始和结束的地方加上标志,即加上开始位和停止位,以便使接收端能够

正确地将每一个字符接收下来。异步通信的好处是通信设备简单、便宜,但传输效率较低(因为开始位和停止位的开销所占比例较大)。

同步通信与异步通信区别:

1.同步通信要求接收端时钟频率和发送端时钟频率一致,发送端发送连续的比特流;异步通信时

不要求接收端时钟和发送端时钟同步,发送端发送     完一个字节后,可经过任意长的时间间隔再发送下一个字节。
2.同步通信效率高;异步通信效率较低。

3.同步通信较复杂,双方时钟的允许误差较小;异步通信简单,双方时钟可允许一定误差。
4.同步通信可用于点对多点;异步通信只适用于点对点。

单片机中的SPI、UART、I2C

1、SPI

    SPI允许单片机和外围设备或者单片机之间高速同步数据传输,SPI可以有主机和从机模式之选,通信的主从机之间通过移位寄存器同时交换数据。目前自己用的以主机模式居多。SPI需要四线:SS,MISO,MOSI,SCK。

   通信过程:在设置好SPI的工作模式:包括SCK频率(数据传输速率),工作速度,主从模式,以及数据接收发送对应的时钟极性。在主模式下,将SS拉低表示通信的开始,然后通过向SPI数据寄存器中写入一字节的数据后自动启动时钟SCK开始进行一次通信,通信完成后会产生相应的中断标志,标志一个字节数据的传送完成。通信完成后将SS脚拉高,表示通信过程已经结束。

   注意SS引脚的设置:当设置为从机模式时,SS引脚应设置为输入,拉低的时候SPI才能起作用,拉高的话是消极的SPI模式;在主机模式下,SS引脚可以设置,一般应设置为输出,如果设置为输入的话应保持为高,否则将不能进行正常的主机模式操作。

2、USART

   USART的操作比较简单,主要是设置波特率,数据格式,以及中断允许位等,值得至于的是其USART IN SPI MODE,在SPI模式下的USART的操作跟SPI操作差不多,主要是Clock的设置,然后发送数据还是通过USART的中断进行

3、I2C

   I2C接口是简单强大的通信接口,只需要两根双向总线(时钟和数据线),SCL和SDA,即可实现一个主机和最多128个从机进行通信。模拟I2C接口的过程:启动I2C,一般是在SCL为高时将SDA拉低启动数据发送,SDA只有在SCL为低时才能拉高拉低有效,在SCL为高时拉高拉低SDA只是用于停止启动I2C通信


I2C总线是内部总线,用来连接内部系统内的芯片。
串口通信是用来和系统外部的设别通信的。比如设备和设备之间通信。

SPI,UAR,I2C都是串行通信方式,并行通信方式一般用的少,因为只适合

短距离,一般用于MCU比较多,因为MCU它对数据的传输速度有要求,而且

与塔相连的芯片一般会比较近。


MCU 他的属性要比CPU(这里指单片机,其他地方应该也是) 强,它包括CPU的性能,

且还有CPU没有的性能。



2019-11-23 10:17:48 ShenZhen_zixian 阅读数 723
  • 单片机有很多-1.3.第1季第3部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第3个课程,主要讲了单片机的发展史,各种主流单片机的各自特点,STC51单片机的各系列的特点以及项目中如何选型主控单片机。

    2561 人正在学习 去看看 朱有鹏

单片机串口接收的几种常用的数据处理方法

一、为什么串口接收的数据需要处理
我们在做项目的时候经常会用到串口,当我们用串口和别的设备通讯的时候就需要严格遵循通讯协议,然而,仅仅是遵循通讯协议是不够的,因为单片机串口受到别的信号干扰的时候,容易出现数据错误,特别是串口发送的第一个字节和最后一个字节。一旦出现这种情况,设备之间的通讯可能会受到影响,甚至会导致系统瘫痪。另外,串口收到数据的时候,我们也需要判断一帧数据的长度,特别是指令发送比较频繁的时候。因此,串口在接收到数据之后应该先进行数据处理,再执行命令,这样能够增强产品的稳定性。

二、串口接收重点关注的几个标志
为了保证通讯的稳定性,一般的通讯协议会加入帧头、帧尾、数据长度、校验这四个标志中的一个或多个。它们的作用如下:
1、帧头:串口发送数据的第一个字节是最容易出错的,如果你把重要的指令放在第一个字节,一旦出现错误,可能会使从机执行错误的操作。而帧头能够有效规避这个问题。
2、帧尾:和帧头类似,帧尾也能避免最后一个字节出错,同时,它也可以作为接收端接收完成的标志。
3、数据长度:它可以作为接收端接收完成的标志。有时也能作为判断数据是否正确的标志。
4、校验:能够有效避免校验以外的所有数据的错误,但是校验正确不代表数据一定没有出错,每种校验方式都有一定的缺陷。
帧头、帧尾、数据长度和校验,这四种标志加起来之后能够大大的增强数据传输的稳定性,但不是每个通讯协议都会包含以上四个标志,可能只会用到其中的一两个。因为如果要发送的主要数据本身就比较长,加上这个几个标志之后会更长,这对于那种传输速度慢、传输数据时间长、传输指令频繁处理速度慢的设备来说,较长的指令可能会影响工作效率。具体我就不多说了,我今天主要讲的是接收数据的处理方法,大家根据自己的协议选择合适的处理方法就行了。

三、常用的几种数据处理方法
1、判断帧头:串口接收到第一个数据之后先判断是否是帧头,如果帧头正确就存起来继续收,反之则丢掉继续等帧头。示例代码片段如下:

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断
{
	Res = USART_ReceiveData(USART1);//读取接收到的数据,同时也清除了中断标志位
		   
	USART_RX_BUF[USART_RX_STA ++] = Res;
	if(USART_RX_BUF[0] != 0xA5 && USART_RX_STA == 1)
	{//帧头错误
	     USART_RX_STA = 0;//重新接收
	}
	if(USART_RX_STA >= USART_RX_Len)
	{//接收完成
	    USART_RX_STA = 0;
	    USART_RXHANDLE_FLAG = 1;
	}
}

这种处理方法能够有效避免第一个字节出错的问题,我就试过一次主设备那边传过来的数据帧头前面多了一个字节(可能是刚开始传输的时候电压不稳定产生的纹波),用这种方法就能够之间把第一个错误的数据丢掉,从正确的帧头开始接收。但是这种方法不能够检查帧头后面的数据是否正确。
2、判断帧尾:可以把帧尾作为一帧数据接收完成的标志。另外,当接收缓存存了多个指令的时候,帧尾能够帮助我们在一堆数据中区分出哪些数据是同一个指令的。当然,如果仅仅是区分数据用帧头也可以。不过这种办法必须保证帧尾和其他数据不一样,不然就会出现错误的判断。所以有些人为了避免这个问题会用两个字节作为帧尾,不过这样一来,数据长度就更大了,影响通讯效率。
3、根据数据长度判断是否完成接收:可以通过数据长度判断接收是否完成。如果协议里面的指令长度不是统一的,我们就不能根据固定的长度来接收数据。这个时候在一帧数据里面加入数据长度这个标志,就能够给单片机一个判断的准则,单片机接收到数据长度这个标志之后,根据这个长度来接收剩下的数据。示例代码片段如下:

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断
{
	Res = USART_ReceiveData(USART1);//读取接收到的数据,同时也清除了中断标志位
		   
	USART_RX_BUF[USART_RX_STA ++] = Res;
	if(USART_RX_BUF[0] != 0xA5 && USART_RX_STA == 1)
	{//帧头错误
	     USART_RX_STA = 0;//重新接收
	}
	If(USART_RX_STA == 4)
	{
	USART_RX_Len = USART_RX_BUF[3];//数据长度
	}
	if(USART_RX_STA >= (USART_RX_Len + 4))
	{//接收完成
	    USART_RX_STA = 0;
	    USART_RXHANDLE_FLAG = 1;
	}
}

4、根据接收时间判断一帧数据的长度。根据波特率计算出两个字节传输的时间间隔,接收到数据之后定时器开始计时,在定时器中断触发之前收到数据就清空,重新计时,超过两个字节的间隔时间,就认为是一帧数据接收完成。具体的程序我就不写了,这个网上能找到很多例程。这种方法适合接收长度不定的情况,在这个方法的基础上还可以加上帧头帧尾等标志,增强稳定性。
5、校验处理:校验一般是在接收完成之后进行,校验是很必要的,因为它包含一帧数据的所有字节,通过校验能够大大的减少出错的概率。

四、总结
其实串口接收数据处理主要要注意两点,第一点是单片机如何确定一帧数据接收完成,第二点是单片机如果判断接收到的数据是正确的指令。第一点可以通过帧尾,数据长度等标志确定接收完成。第二点可以先通过帧头初步判断指令的正确性,再通过校验二次处理,判断指令是否正确接收。

关于串口接收数据处理的相关内容就介绍到这里,如果还有什么问题,可以留言,如果文章有哪里写的不对,欢迎指正,谢谢!

2018-01-24 09:54:06 QQ_Peng123 阅读数 1827
  • 单片机有很多-1.3.第1季第3部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第3个课程,主要讲了单片机的发展史,各种主流单片机的各自特点,STC51单片机的各系列的特点以及项目中如何选型主控单片机。

    2561 人正在学习 去看看 朱有鹏

 单片机对于很多人并不陌生,在学校的时候就需要用到开发板,参与实际项目之后,很多地方也需要用到单片机,下面对几种常见的单片机做一下比较,希望对初学者提供帮助。

51系列单片机

 用过比较多的就是STC单片机,优点就是价格便宜,开发简单,主要应用于对速度、功耗要求不高的场合。如控制继电器,485通讯等,缺点是功耗大,速度慢,开发手段比较落后。

MSP430单片机

 优点是功耗低、且相对速度较快,寻址方式很多,指令少,容易上手。适用于对功耗要求较高的场合。如使用干电池供电;缺点是程序空间占用很大(与PIC进行比较),瞬时掉电复位性能较差,读出简单写入麻烦等。

STM32单片机

 优点是属于ARM内核的一个版本,超高性价比,片内资源丰富,专为高性能,低成本,低功耗的嵌入式应用设计,缺点是有些存储模块只能支持16位数据传输,如SPI等,几乎所有系列都是如此。升级的时候更多的只是对工艺速度的提升,这一点让人费解。

PIC32单片机

 优点是从实际出发,重视产品性能,不搞单纯的功能累积,靠发展多种型号来满足不同的层次应用要求,缺点是价格高,开发软件是基于JAVA使用起来卡顿,芯片实际功耗比较大,使用过PIC32MX675F256H单片机,运行后能明显感觉到发热。
 以上单片机都是参与实际任务使用过的,每种单片机都有使用场合,根据经验,选择能满足要求的便宜的即可。
2018-08-04 09:42:47 bolinste 阅读数 1391
  • 单片机有很多-1.3.第1季第3部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第3个课程,主要讲了单片机的发展史,各种主流单片机的各自特点,STC51单片机的各系列的特点以及项目中如何选型主控单片机。

    2561 人正在学习 去看看 朱有鹏

尊重原创,转载请说明出处……

 

在工作中用单片机很久了,对通信数据的处理有一些小小的心得体会。分享出来供讨论和指正。

以下讨论基于C语言。

 

在单片机中串口是一个很重要和基本的外设。对串口数据的存储很多大拿都有自己的方式方法。个人总结有如下几种:

1、开辟一个较大的数组对数据进行保存。有时会结合定时器进行数据的“分帧”/“分包”

2、使用链表的方式进行数据存储。每个字节做成一个节点,逐节增加节点予以记录。

3、使用内存管理的方式。有经验的工程师会自己写内存管理的程序,把串口读到的数据通过内存管理进行处理。

4、使用OS的数据队列。

 

几种方式的对比分析:

编号 优点 缺点
1 写法简单,容易理解 数组长度有限,有数据溢出的风险。
2 理论实现容易,数组长度灵活 占用的内存过大
3 灵活易用,数组长度灵活,不依赖操作系统 理解起来可能会有难度
4 灵活易用,数组长度灵活,依赖操作系统 必须依赖OS

 

 

 

 

 

 

下面对上述的几种方式做详细的介绍。

 

 

2013-09-25 16:06:30 zjomin 阅读数 3074
  • 单片机有很多-1.3.第1季第3部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第3个课程,主要讲了单片机的发展史,各种主流单片机的各自特点,STC51单片机的各系列的特点以及项目中如何选型主控单片机。

    2561 人正在学习 去看看 朱有鹏

1.介绍

SPI 通信最常用的地方时 单片机访问 Flash 或 Ram,很少用在两个单片机通信上。但是鉴于spi通信的优势,用在两个单片机之间通信时,合理的程序设计,会更好的体现它的优势。在这里提出几种设计方式,同时列举了各自的缺点和优点,需要根据具体情况采用相应的模式并克服缺点。

2.全局分析

采用spi在物理层上已经是采用 Master - Slave 方式,在协议的设计上有了较大的限制,表面上也就是 slave 不能向 Master 自由的发送数据。因为spi总线协议规定,由Master来控制 SCLK 信号,Slave要发送多少个字节以及什么时候发送,Master并不知道,这就是问题所在。

对于有些单片机在Slave状态时,并不知道 Master 何时发送完成,这样也会困扰开发者。

3.全局设计

3.1 采用Ask-Answer 模式

在其他的总线协议中,很常用的一种方式,Master 发送Ask,Slave接收处理,并准备好处理结果,Master 发送无效数据,目的是取回Slave的数据。

优点:协议健壮性比较好,逻辑简单

缺点:没有体现SPI 全双工的优势

3.2 采用Peer-Peer 模式

可以在对实时性没有严格要求的情况下使用,这种模式下,程序上并不区分Master和Slave。暂且将spi的Master称为P1,将Slave称为P2,P1发送数据的同时P2也将数据发送到P1,两者的数据没有必然联系,双方可以根据数据包中包含的不同信息做相应的处理。。适合用于数据交换的场合。

优点:采用全双工方式,协议健壮性比较好,逻辑简单

缺点:适用场合比较少,实时性不高


3.3 采用Master-Master 模式

在默认状态下都是Salve,当一方有数据需要发送时,切换到Master状态,发送完数据立马切换到Slave状态,前提是需要避免双方同时切换到 Master 的情况。

优点:实时性比较好,协议健壮性比较好,逻辑简单

缺点:适用场合比较少,单工通信

3.4 带预知和状态的Master-Slave 模式

带预知和状态,意思是Master发送数据包时,包含下一次数据交换时Master要请求的数据内容,这样Slave在处理Master传来的数据之后,就开始准备数据下次交换的数据;同时,Slave准备数据时,同时包含了Slave的状态、错误等,供Master判断下一步进行哪一种数据交换。整体上来说,Master 根据Slave的状态,发起通信,并通知Slave下一次通信类型,而Slave在回答Master时,同时也把状态信息发送到 Master。

数据结构也比较简单,可以参考如下:


HEADER 作为固定的开头

PACKET TYPE   为当前的数据包类型

NEXT PACKET TYPE 为下一次通信的数据包类型

DATA LEN  为后面的数据长度

DATA  表示数据

Slave 的数据包可以设计如下:


STATUS                 为Slave当前的状态


优点:充分利用全双工特性
缺点:逻辑复杂,对于想要获得的数据会有一个周期的延时

 

4.后续设计

采用模式4,通信效率是最高的,开发过程相对比较复杂,不过,一劳永逸。

转载注明出处:http://blog.csdn.net/iodoo

没有更多推荐了,返回首页