串口数据收发原理与实现方法详解

1.1 字符串接收函数

        发送方结束标志是你接收方判断的依据,也可以说是属于协议的一部分。

我们这里使用串口助手数据发送自动添加了\r\n,所以我们将它们看成结束标志。

1.2 数据传输方式

        计算机与外部进行沟通只有并行和串行两种方式,计算机只能知道断电和上电,一根线同一时间只有断电或者上电,多根线就存在断电和上电同时存在。

所以一根线的时候称之为串行通信,多条线就是并行通信。

 

同样速度下一条线传输和8条线传输,谁快?8条,也就说并行传输数据的速度快,但是成本更高

一般情况下对传输速度有要求的地方,比如说:屏幕显示,这些地方使用的都是并行。

串行传输一般在远程地方更合适一些。

 

1.2.1 串行通信的连接方式

一共有三种:单工、半双工、全双工

  • 单工只能发送或者只能接收。
  • 能收发但是不能同时进行。
  • 能同时进行收发操作。
  • ​​​​​​​​​​​​​​

    我们的串口使用的是哪一种方式??半双工,虽然USART是全双工异步通信的设备,但是程序和硬件上不支持它这样做,所以选择的是半双工方式工作

    ​​​​​​​​​​​​​​1.2.2 同步和异步

    同步:使用同一个时钟(产生时钟频率的设备是一个)。

    异步:使用的时钟不是同一个,但是频率是一样的。

     

    ​​​​​​​1.3 USART特性 

     

            串口现在好用吗??接收数据要等待,如果没有数据过来不做其它事情,这样是不合理的,有什么办法可以处理这件事?中断 

    2.1 中断的简介

    2.1.1 中断是什么?

    中断是一种处理事件的方式,或者说是一种机制。

    在STM32中就是一种它提供给我们的机制,一种用于处理事件的方式。

    什么机制??程序在运行过程中如果发生了中断对应的事件,优先处理中断事件

    假设程序正在运行流水灯,此时如果有数据从电脑发送过来了,我要先去把数据接收到程序中。

         

    要产生中断必要的条件:

    1)程序一直在运行状态

    2)中断机制是开启状态

    3)产生中断的东西报备了

    4)中断产生后处理方式设计好了

    中断处理过程:异常(中断)中断源–>允许中断–>申请中断–> CPU 响应–>保护现场(栈)–> 跳转处理–>返回。

    ​​​​​​​2.1.2 中断有什么用??

    处理突发事件。

    为什么用中断处理突发事件,为了节约CPU资源,因为突发事件是不确定什么时候产生的。

    ​​​​​​​​​​​​​​2.1.3 中断如何使用?

    首先,确定中断源——串口接收

    然后,开启中断——串口

    申请中断??——有数据到达

    CPU响应??——数据到了

    保护现场??——现有程序停止

    处理——中断服务函数

    返回——继续执行原有程序

    2.2 串口中断

    2.2.1 查找串口中断

     

    从这里可以了解到,串口1的中断是37

    ​​​​​​​2.2.2 怎么开启?

     

     

    中断使能寄存器。

    ​​​​​​​2.2.3 优先级的概念

    优先级代表谁先谁后,在这里代表谁先执行,谁后执行,说的是中断,意思是多个中断一起触发谁先执行。

    但是它还包含另一层意思,意思是谁可以打断谁。如果有某个中断正在执行处理,但是我这个更加紧急,优先要处理我这个中断,这时候优先级设置要更高。

    总结:中断优先级表示了谁可以打断谁的执行,还有就是谁先谁后。

    因为优先级有三种:抢占、响应和自然。

  • 抢占优先级代表谁可以打断谁;
  • 响应优先级代表谁先谁后执行。
  • 自然优先级只有在抢占和响应一样,并且无法区分谁先谁后的时候起作用,自然优先级就是它的位置也就是编号。
  • 优先级数字越小优先级越高。

    怎么设置优先级???

     

    给谁设置优先级就指定其对应的下标,设置的8位数据就代表优先级,但是需要根据分组进行判定。

    注意:一个程序只能存在一种分组。

    在cortex-m3中定义了8个比特位用于设置中断源的优先级,这8个比特位可以有8种分配方式,如下:

  • 第0组:所有8位用于指定响应优先级(抢占:0,响应:0~255)
  • 第1组:最高1位用于指定抢占式优先级(0~1),最低7位用于指定响应优先级(0~127)
  • 第2组:最高2位用于指定抢占式优先级(0~3),最低6位用于指定响应优先级(0~63)
  • 第3组:最高3位用于指定抢占式优先级(0~7),最低5位用于指定响应优先级(0~31)
  • 第4组:最高4位用于指定抢占式优先级(0~15),最低4位用于指定响应优先级(0~15)
  • 第5组:最高5位用于指定抢占式优先级(0~31),最低3位用于指定响应优先级(0~7)
  • 第6组:最高6位用于指定抢占式优先级(0~61),最低2位用于指定响应优先级(0~3)
  • 第7组:最高7位用于指定抢占式优先级(0~127),最低1位用于指定响应优先级(0~1)
  • 分组没有设置,咋设置?

     

    ​​​​​​​2.2.4 串口中断允许

     

     

     

    ​​​​​​​2.2.5 编写中断服务函数

     

     

    配置完成,看完现象,现在总结一下。

    所谓中断是用于处理突发事件的,你首先要开启中断(CPU允许,自己开启),然后编写中断服务函数,当中断事件产生的时候,代码回自动进入到中断服务函数去执行,执行完返回原来的地方继续执行原有程序。

    注意:你不要在中断里面做过多停留。

     

    物联沃分享整理
    物联沃-IOTWORD物联网 » 串口数据收发原理与实现方法详解

    发表回复