掌桥专利:专业的专利平台
掌桥专利
首页

串口异步通信的发送方法及接收方法、存储介质

文献发布时间:2023-06-19 16:08:01



技术领域

本发明涉及芯片间的一种串口异步通信协议,尤其是涉及复杂ECU控制器中多芯片间的串口异步通信方法,具体为一种串口异步通信的发送方法及串口异步通信的接收方法。

背景技术

随着电力电子技术发展,自动化智能化迅速发展,类似汽车这种产品动辄几十个ECU,使得整车对零部件的管理越来越困难,不同ECU之间的CAN通信拓扑越来越复杂。因此把多个ECU集成到一个控制器上,做多合一产品是现在汽车行业零部件厂商发展趋势,对应的原来多个ECU之间的CAN通信也就可以转成多合一产品中的芯片间串口通信或者SPI通信。

SPI通信需要4根线,占用芯片引脚多,且有主从概念,因而对于整车芯片之间的通信来说,控制比较复杂且不便利。而串口通信只需要2跟线,占用芯片引脚少,且没有主从概念,应用性好。

串口通信又分为同步通信和异步通信,串口同步通信在发送数据前,要发送同步时钟,实现起来颇为复杂,实际较少使用;串口异步通信在节省芯片资源基础上,协议简单,实现容易,因此是最常见的芯片间通讯方式。但是传统串口异步通信协议一帧数据少,只有7位数据位,且只有一位奇偶校验位,因此存在通信效率低、误码诊断覆盖率低等缺点。

因此,如何提供一种一帧通信数据量大且误码诊断覆盖率高串口异步通信的发送方法及接收方法是业界亟待解决的技术问题。

发明内容

为了解决现有技术中一帧通信数据量小且误码诊断覆盖率低的技术问题,本发明提出了串口异步通信的发送方法及接收方法、存储介质。

本发明提出的串口异步通信的数据发送方法,发送方将需要发送的数据按照Nbyte*8 bit为一帧数据的形式进行打包,所述N大于等于1;再将打包后的每一帧数据发送出去;

所述打包过程包括:

将需要发送的数据填充在每一帧数据的第0 byte至第N-2 byte的第1 bit至第7bit;

对需要发送的数据进行校验,并将校验结果填充在第N-1 byte的第1 bit至第7bit;

为每一帧数据中的第0 byte的第0 bit进行赋值,为每一帧数据中的第1 byte至第N-1 byte的第0 bit进行赋值,使得每一帧数据中的第0 byte的第0 bit的值与第1 byte至第N-1 byte的第0 bit的值不同。

进一步,所述N为8的倍数。

进一步,所述填充过程包括:

定义一个数据类型为UnitN的一维数组;

将1个或多个信号均采用按位与和移位的方式填充到所述一维数组的对应元素中。

进一步,当一个信号中的数据长度超过N bit时,采用左移或右移的方式取所述信号中的高位或低位分别存在不同元素的对应位置。

进一步,所述校验采用校验和的方式进行。

进一步,每一帧数据中的第0 byte的第0 bit赋值为1,每一帧数据中的第1 byte至第N-1 byte的第0 bit赋值为0。

本发明提出的串口异步通信的数据接收方法,所述数据由上述技术方案述的串口异步通信的数据发送方法发送,包括:

预先准备一帧数据长度的两倍长度作为缓存的长度;

根据发送时第0 byte的第0 bit的值从缓冲中找到一帧数据的起始byte;

自起始byte开始到第N-2 byte的第0 bit去掉后,组成一帧N byte数据;

通过第N-1 byte的第1 bit至第7 bit对N byte数据进行校验;

若校验通过则进行映射的信号更新。

进一步,所述缓存通过一个一维数组来接收发送过来的数据。

本发明提出的计算机可读存储介质,用于存储计算机程序,所述计算机程序运行时执行上述技术方案所述的串口异步通信的数据发送方法。

本发明提出了一种高效、数据有效位多、误码诊断覆盖率高、信号映射灵活的串口异步通信协议。在一个具体实施例中,本发明提出了一种以8个byte为一帧的通信方式,一帧总共有7*7=49个bit为有效数据段,每个byte的最后一位bit按照10000000格式,用来作为起始byte位置的标识。相比较于传统串口异步通信协议的一帧数据只有7个数据位且只有一位奇偶校验位的方式来说,可看出本专利提出的通信协议大幅度增加了数据有效位、提升了错误码诊断覆盖率、且方便接收方进行正确的数据排序。

附图说明

下面结合实施例和附图对本发明进行详细说明,其中:

图1是现有技术的一帧数据示意图。

图2是本发明的一帧数据示意图。

图3是本发明的填充练流程图。

图4是本发明的一个具体实施例的信号填充示意图。

图5是本发明的接收解析流程图。

具体实施方式

为了使本发明所要解决的技术问题、技术方案及有益效果更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。

由此,本说明书中所指出的一个特征将用于说明本发明的一个实施方式的其中一个特征,而不是暗示本发明的每个实施方式必须具有所说明的特征。此外,应当注意的是本说明书描述了许多特征。尽管某些特征可以组合在一起以示出可能的系统设计,但是这些特征也可用于其他的未明确说明的组合。由此,除非另有说明,所说明的组合并非旨在限制。

由于串口通信协议没有主从概念,2个相互通信的电子控制单元(ECU)需要配置成相同的波特率,发送方和接收方需要按照相同的协议对数据分别进行打包与解包,本发明主要是对两个相互通信的电子控制单元之间的通信协议进行了改进,即对发送协议和接收协议进行了改进,使得串口异步通信的数据量更大,并且达到误码覆盖率更高的效果。因此之后将按照发送协议与接收协议进行本专利通信协议的具体说明。电子控制单元(ECU)又称“行车电脑”、“车载电脑”等。它和普通的电脑一样,由微控制器(MCU)、存储器(ROM、RAM)、输入/输出接口(I/O)、模数转换器(A/D)以及整形、驱动等大规模集成电路组成。

本发明的串口异步通信的数据发送方法,发送方将需要发送的数据按照N byte*8bit(N字节*8比特)为一帧数据的形式进行打包,再将打包后的每一帧数据发送出去。由于数据是从第0byte开始,因此N大于等于1,即本发明一帧数据至少能发送2byte*8bit(2字节*8比特)。

如图2所示,下面描述具体的打包过程。先将需要发送的数据填充在每一帧数据的第0 byte至第N-2 byte的第1 bit至第7 bit,假设N为8,那么一帧数据可包含的实际数据量为7*7bit。

然后对需要发送的数据进行校验,并将校验结果填充在第N-1 byte的第1 bit至第7 bit。

最后为每一帧数据中的第0 byte的第0 bit进行赋值,为每一帧数据中的第1byte至第N-1 byte的第0 bit进行赋值,使得每一帧数据中的第0 byte的第0 bit的值与第1 byte至第N-1 byte的第0 bit的值不同,这样来标识起始byte的起始位。接着就可以将打包好的这一帧数据发送出去。

在一个具体实施例中,每一帧数据中的第0 byte的第0 bit可以赋值为1,每一帧数据中的第1 byte至第N-1 byte的第0 bit可以赋值为0。

如图3所示,上述过程中,填充信号对应的数据时,可以定义一个数据类型为UnitN的一维数组,N为8的整数倍,然后再将1个或多个信号采用按位与和移位的方式填充到该一维数组的对应元素中。例如当数据打包是按照8byte*8bit为一帧的形式打包时,则定义一个unit8的含有8个元素的一维数组。

当一个信号中的数据长度超过N bit时,采用左移或右移的方式取信号中的高位或低位分别存在不同元素的对应位置。

在一个具体实施例中,校验可以采用校验和的方式进行。

本发明的N具体可以取8的倍数,鉴于目前芯片普遍的能力,本发明的一个实施例中,一帧数据至少能发送8byte*8bit,在一些能力较好的芯片当中,N也可以取16,即一帧数据发送16byte*8bit。

基于上面的技术方案,描述本发明的一个具体的发送协议。

当N为8时,本发明每次发送的一帧数据最多可发送7*7=49位长度数据,先将需要发送的数据按照上述规定的协议格式进行填充,假如此帧数据位未填满(49位数据位),则以0填充。然后根据填充的数据位算出这帧数据的校验和CheckSum,可以使用简单的将前面每7个byte对应的数据位相加,也可以使用其它的加密方式,本发明以简单的将前每7个byte相加为列;最后再对每个byte的最后一个Bit位进行填充,第0个byte最后一位填充1,第1~7个byte最后一位填充0,这样做的目的是为了方便接收方按顺序找出正确的起始byte。这样就完成了一帧总共64位数据的打包,将打包后的数据传给底层串口通信SCI模块发送即可,SCI模块为串行通信模块,SCI模块的内部含有波特率发生器,它将总线频率进行分频,以产生串行通信需要的波特率。

下面以图4所示的信号映射为例,按照本发明图3的流程进行发送帧的数据填充计算。其中信号Signal1的数据类型为uint8,信号Signal2的数据类型为uint16,信号Signal3的数据类型为uint8。

1)定义一个数据类型为uint8维数为8的一维数组uint8 TxArray[8]。

2)将需要发送的信号进行数据段(Data段,即49位长度数据)的数据填充,数据的数组填充可使用移位加上按位与的方法进行信号的数据填充。

TxArray[0]=(Signal[1]&0x7F)<<1;

TxArray[1]=(Signal[2]&0x07FF)>>4<<1;

TxArray[2]=((Signal[2]&0x000F)<<4)+((Signal[3]&0x07)<<1)。

CheckSum的计算为TxArray[7]=(TxArray[0]+TxArray[1]+TxArray[2])<<1。

3)进行每个byte最后一个bit位的填充,byte0的bit0填充1,byte1~7的bit0填充为0,即TxArray[0]=TxArray[0]|0x01、TxArray[1~7]=TxArray[1~7]&0xFE,此操作是为了让接收方能准确找到起始byte。

通过上述3个步骤即可完成发送帧的所有bit位填充。

本发明的串口异步通信的数据接收方法,所接收的数据由上述技术方案的串口异步通信的数据发送方法发送。

如图5所示,本发明的串口异步通信的数据接收方法需要预先准备一帧数据长度的两倍长度作为缓存的长度。具体的缓存通过一维数组来接收发送过来的数据。

根据发送时第0 byte的第0 bit的值从缓冲中找到一帧数据的起始byte。接着自起始byte开始到第N-2 byte的第0 bit去掉后,组成一帧N byte数据,通过第N-1 byte的第1 bit至第7 bit对N byte数据进行校验,若校验通过则进行映射的信号更新。

当发送的一帧数据为8byte*8bit时,对应的接收协议如下。

底层SCI模块接收数据时,需要将接收数据缓存长度定义为16个byte,因为发送方是按照每帧8个byte长度进行发送,串口异步通信的接收方与发送方不会进行同步处理,因此接收方放到缓存里的第0个byte并不一定是发送方发的一帧数据中第0个byte,为了完整找到一帧数据,接收方需要将接收缓存扩充到发送方的2倍。

具体实现方式为:

1)先从缓存中的数据找到bit0为1的那个byte作为起始byte;

2)在缓存中从起始byte往后数7个byte与起始byte组成完整的一帧8byte数据;

3)将8个byte中的每个byte最后一位去掉,得到完整的数据位,将第0~6byte的数据相加得到的数值取低7位,与第7个byte中的数值进行对比,如果相同则判定CheckSum校验通过,并使用第0~6byte数据进行映射的信号更新;如果不相同则判定CheckSum校验失败,则不进行信号更新。

在一个具体实施例中,接收协议以图4所示的信号协议为例,按照图5的流程进行接收帧的信号解析。

1)找出按顺序排列的完整一帧:将接收数据缓存长度定义为16个byte,定义一个数据类型为uint8元素为16的一维数组uint8 RxBuffer[16],从其中找出bit0为1的byte作为起始位置byte0,往后数7个byte,将这8个byte赋值给数组uint8 RxArray[8];

2)取出完整的Data段数据:将RxArray数组中的每个元素右移一位,此操作为去除标识起始byte的bit0位,即执行RxArray[0~7]>>1,将结果赋值给RxArray_Data[0~7];

3)进行校验和CheckSum的判断:

(RxArray_Data[0]+RxArray_Data[1]+RxArray_Data[2])&0x7F是否等于RxArray_Data[7]。若不相等则判断为此次通信无效,不进行信号的赋值;若相等则判断为此次通信有效,并执行如下的第4)步,进行信号的赋值;

4)最后进行信号的赋值:Signal1=RxArray_Data[0]、Signal2=(RxArray_Data[1]<<4)+ (RxArray_Data[2]>>3)、Signal3=RxArray_Data[2]&0x07。

通过上述4个步骤即完成接收帧的错误码诊断以及信号赋值。

将图1和图2进行对比,图1为传统串口异步通信协议,一帧数据只有7个数据位,且只有一位奇偶校验位,一帧传递数据量少,且误码诊断覆盖率低。图2为以8个byte为一帧的通信方式,一帧总共有7*7=49个bit为有效数据段,每个byte的最后一位bit按照10000000格式,用来作为起始byte位置的标识,可以明显看出本发明的一帧数据的数据量更大,并且误码诊断覆盖率高。在一些能力较高的芯片中,本发明还可以以16byte为一帧的通信方式,或者是32byte为一帧的通信方式,进一步提高串口的一帧通信数据量,同时校验码也可以做到广泛的覆盖率。

本发明还保护对应的计算机可读存储介质,该计算机存储介质用来存储计算机程序,计算机程序运行时执行本发明上述技术方案的串口异步通信的数据发送方法。当然该计算机程序在运行时还可以执行本发明上述技术方案的串口异步通信的数据接收方法。

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

技术分类

06120114717671