一种嵌入式处理器串口通信方法和软件开发工具包

文档序号:1952531 发布日期:2021-12-10 浏览:5次 >En<

阅读说明:本技术 一种嵌入式处理器串口通信方法和软件开发工具包 (Embedded processor serial port communication method and software development kit ) 是由 周建国 钟东池 于 2021-11-12 设计创作,主要内容包括:本发明公开一种嵌入式处理器串口通信方法和软件开发工具包。该一种嵌入式处理器串口通信方法,包括发送端对通信指令进行封装;接收端进入中断工作状态;接收端建立包首状态机变量和数据状态机变量;分配协议缓存内存;接收端接收中断标志;通过包首状态机进行包首侦测,通过数据状态机接收数据至一维缓存数组;若接收端接收到的协议数据中的验证码正确;接收端将一维缓存数组接收到的整条协议数据复制到二维缓存数组中。本发明提出的技术方案旨在解决应用层准备要接收的指令,还没有传输完毕就被放弃,导致丢失该指令,和防止设备间串口通讯过程中受电磁干扰而出现数据中断、错误或者不完整,导致接收方接收到错误数据的问题。(The invention discloses an embedded processor serial port communication method and a software development kit. The serial port communication method of the embedded processor comprises the steps that a sending end encapsulates a communication instruction; the receiving end enters an interruption working state; a receiving end establishes a packet head state machine variable and a data state machine variable; allocating a protocol cache memory; the receiving end receives the interrupt mark; carrying out packet head detection through a packet head state machine, and receiving data to a one-dimensional cache array through a data state machine; if the verification code in the protocol data received by the receiving end is correct; and the receiving end copies the whole protocol data received by the one-dimensional cache array into the two-dimensional cache array. The technical scheme provided by the invention aims to solve the problems that the instruction to be received by an application layer is abandoned without being completely transmitted, so that the instruction is lost, and the problem that a receiving party receives wrong data due to data interruption, errors or incompletion caused by electromagnetic interference in the serial communication process between equipment is solved.)

一种嵌入式处理器串口通信方法和软件开发工具包

技术领域

本发明涉及嵌入式处理器串口通信技术领域,具体涉及一种嵌入式处理器串口通信方法和软件开发工具包。

背景技术

嵌入设备处理器串口外设硬件缓存往往只有一个字节或几个字节的buffer(缓冲寄存器),在实际通信应用中一个通信指令往往会有多个字节甚至数十上百字节,而且多个不同的应用指令可能不定时大量出现在实际应用(应用指的是该嵌入式设备(或嵌入式处理器)的各种功能,如要实时显示通过串口接收过来的时间,那么这个功能就是该设备其中一个应用),导致在实际应用中很容易出现几个问题:应用层读/接收缓存时,准备要接收的指令可能只传输了一半,还没有传输完毕就被应用程序放弃已传输那一半不完整的有效数据,导致丢失该指令;在两个设备间串口通讯过程中,可是由于发送设备或通讯线受电磁干扰而出现数据中断、错误或者不完整,导致接收方接收到错误数据,如果接收方不对指令加以分析与合成,那么就出现接收到错误的通讯指令,直接导致设备故障。

发明内容

本发明的主要目的是提供一种嵌入式处理器串口通信方法,旨在解决应用层读/接收缓存时接收的指令就被应用程序放弃,导致丢失该指令;和设备间串口通讯过程中发送设备或通讯线受电磁干扰而出现数据中断、错误或者不完整,导致接收方接收到错误数据的问题。

为实现上述目的,本发明提出的一种嵌入式处理器串口通信方法,包括如下步骤:

发送端对通信指令添加包首和包尾进行封装,其中,所述包尾包括验证码;

接收端初始化CPU串口,串口配置波特率,打开串口接收中断,设定优先级后进入中断工作状态;

接收端建立包首状态机变量和数据状态机变量,其中,所述包首状态机用于包首侦测与判断,所述数据状态机用于负责协议数据接收;分配协议缓存内存,分别建立一维缓存数组和二维缓存数组;其中,所述一维缓存数组用于临时缓存单条指令,所述二维缓存数组用于依次排列多个指令;

接收端接收中断标志,读取接收寄存器数据到缓冲寄存器;通过包首状态机进行包首侦测,包首侦测通过后,通过所述数据状态机接收协议数据至一维缓存数组,直到接收到包尾;

接收端判断接收到的协议数据中的验证码是否正确;

若是,接收端将一维缓存数组接收到的整条协议数据复制到二维缓存数组中依次缓存,把所述二维缓存数组作为二级缓存供应用层读出使用。

优选地,所述接收端接收中断标志的步骤之后,包括:

接收端获取预设的阈值时间;

接收端将所述阈值时间带入到生命周期状态机;所述生命周期状态机用于在接受到有效数据时重新计时,生命周期状态机进入下一状态;在计时到达阀值时间时,清除状态机和缓存。

优选地,所述接收端初始化CPU串口,串口配置波特率,打开串口接收中断,设定优先级后进入中断工作状态的步骤,包括:

接收端初始化CPU串口,串口配置波特率;

接收端初始化定时器,定时器确定定时时长;

接收端打开串口接收中断,打开定时中断,设定优先级后进入中断工作状态。

优选地,所述发送端对通信指令添加包首和包尾进行封装的步骤包括:

发送端对通信指令添加包首,其中,所述包首包括起步码和协议首字节,所述起步码为满足连续跳变电平的3个字节0xAA,所述协议首字节为0x06;

发送端对通信指令添加包尾进行封装。

优选地,所述包首状态机进行包首侦测,包首侦测通过后,通过数据状态机接收数据至一维缓存数组,直到接收到包尾的步骤,包括:

每接收数据的一个字节,判断该字节是否为起步码字节;

若是,则将包首状态机变量加1;

判断所述包首状态机变量是否等于3;

若否,则返回至所述每接收数据的一个字节,判断该字节是否为起步码字节的步骤;

若是,则继续接受第四个字节;

判断所述第四个字节是否为协议首字节;

若是,则包首侦测通过,通过数据状态机接收数据至一维缓存数组,直到接收到包尾。

优选地,所述通过数据状态机接收数据至一维缓存数组,直到接收到包尾的步骤,包括:

每接收一个字节,所述数据状态机变量加1;

并将接受到的数据按照字节顺序存在一维缓存数组中,直到接收到包尾。

优选地,所述判断接收到的协议中的验证码是否正确的步骤之后,还包括:

若否,则包首状态机变量和数据状态机变量均清零,一维缓冲数组数据清空。

优选地,所述将一维缓存数组接收到的整条协议复制到二维缓存数组依次缓存成协议队列,把所述二维缓存数组作为二级缓存供应用层读出使用的步骤之后,包括如下步骤:

对所述二级缓存的二维数组定义相应的闭环指针链表,并封装成FIFO数据结构;

将数组大小参数输入到FIFO数据结构中,以输出FIFO的实时利用率;

并根据FIFO的所述实时利用率来调节二维缓存数组大小。

优选地,所述根据FIFO的所述实时利用率来调节二维缓存数组大小的步骤之后,还包括:

设定FIFO状态标志,对写入端提供正在读、空闲、已有数据3种状态,对读出端提供正在写、空闲、已有数据3种状态;

在发现冲突时,根据主次放弃整条旧协议或者放弃整条当前的协议。

为实现上述目的,本发明还提供一种嵌入式处理器串口通信软件开发工具包,包括底层接收函数和协议栈函数;所述底层接收函数为将实现如上任一所述的嵌入式处理器串口通信方法中用于接收端完成一维缓存数组接收的算法封装成的用于串口中断的底层接收函数;所述协议栈为将实现如上任一所述的嵌入式处理器串口通信方法中为对接应用层的协议栈算法封装成的用于对接应用层的协议栈函数。

本发明的技术方案中,通过在发送端对通信指令添加包首和包尾进行封装,接收端通过中断程序接收,同时设置有包首状态机和数据状态机进行包首检测和数据检测和接收,通过验证码进行验证,而后将接收到的完整的协议复制到二级缓存,从而防止应用层准备要接收的指令可能只传输了一半,还没有传输完毕就被应用程序放弃已传输那一半不完整的有效数据,导致丢失该指令,和防止设备间串口通讯过程中,由于发送设备或通讯线受电磁干扰而出现数据中断、错误或者不完整,导致接收方接收到错误数据,接收方不对指令加以分析与合成,出现接收到错误的通讯指令,直接导致设备故障的问题。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图示出的结构获得其他的附图。

图1为本发明一种嵌入式处理器串口通信方法流程示意图;

本发明目的的实现、功能特点及优点将结合实施例,参照附图1做进一步说明。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

需要说明,本发明实施例中所有方向性指示(诸如上、下、左、右、前、后……)仅用于解释在某一特定姿态(如附图所示)下各部件之间的相对位置关系、运动情况等,如果该特定姿态发生改变时,则该方向性指示也相应地随之改变。

另外,在本发明中如涉及“第一”、“第二”等的描述仅用于描述目的,而不能理解为指示或暗示其相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括至少一个该特征。在本发明的描述中,“多个”的含义是至少两个,例如两个,三个等,除非另有明确具体的限定。

在本发明中,除非另有明确的规定和限定,术语“连接”、“固定”等应做广义理解,例如,“固定”可以是固定连接,也可以是可拆卸连接,或成一体;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通或两个元件的相互作用关系,除非另有明确的限定。对于本领域的普通技术人员而言,可以根据具体情况理解上述术语在本发明中的具体含义。

另外,本发明各个实施例之间的技术方案可以相互结合,但是必须是以本领域普通技术人员能够实现为基础,当技术方案的结合出现相互矛盾或无法实现时应当认为这种技术方案的结合不存在,也不在本发明要求的保护范围之内。

请参照图1,为实现上述目的,本发明提出的一种嵌入式处理器串口通信方法,其包括如下步骤:

S100,发送端对通信指令添加包首和包尾进行封装,其中,所述包尾包括验证码;

S200,接收端初始化CPU串口,串口配置波特率,打开串口接收中断,设定优先级后进入中断工作状态;

S300,接收端建立包首状态机变量和数据状态机变量,其中,所述包首状态机用于包首侦测与判断,所述数据状态机用于负责协议数据接收;分配协议缓存内存,分别建立一维缓存数组和二维缓存数组;其中,所述一维缓存数组用于临时缓存单条指令,所述二维缓存数组用于依次排列多个指令;

S400,接收端接收中断标志,读取接收寄存器数据到缓冲寄存器;通过包首状态机进行包首侦测,包首侦测通过后,通过所述数据状态机接收协议数据至一维缓存数组,直到接收到包尾;

S500,接收端判断接收到的协议数据中的验证码是否正确;

若是,则执行步骤S600,接收端将一维缓存数组接收到的整条协议数据复制到二维缓存数组中依次缓存,把所述二维缓存数组作为二级缓存供应用层读出使用。

本发明的技术方案中,通过在发送端对通信指令添加包首和包尾进行封装形成协议包,接收端通过中断程序接收,同时设置有包首状态机和数据状态机进行包首检测和数据检测和接收,通过验证码进行验证,保证获取的是完整的协议,而后将接收到的完整的协议复制到二级缓存,从而防止应用层准备要接收的指令可能只传输了一半,还没有传输完毕就被应用程序放弃已传输那一半不完整的有效数据,导致丢失该指令,和防止设备间串口通讯过程中,由于发送设备或通讯线受电磁干扰而出现数据中断、错误或者不完整,导致接收方接收到错误数据,接收方不对指令加以分析与合成,出现接收到错误的通讯指令,直接导致设备故障的问题。

更具体的,串口接收中断处理程序中,需建立两个静态接收状态机,仅在中断中使用,一个是包首状态机,负责包首侦测与判断,取值自然数0,1,2,3或4;一个是数据状态机,负责协议数据接收,取自然数1,1,2,3,4,5,6,……;S300步骤中接收端建立包首状态机变量和数据状态机变量的代码为:

staticu8sta_top=0;建立包首状态机变量;

staticu16sta_data=0;建立数据状态机变量;

更具体的,协议缓存内存分配,建立两个数组协议缓存数组,定义见下面两行代码:一个为一维数组,该数组作为局部变量存在中断程序中,用于临时缓存单条指令;另一个为二维数组,可以根据应用的实际需要设定二维数组的大小,作为全局变量交换数据。

u8ch_buffer[257];一维缓存数组;

u8ch_agreement[x][257];二维缓冲数组;

基于本发明的一种嵌入式处理器串口通信方法的第一实施例,本发明的一种嵌入式处理器串口通信方法的第二实施例中,所述步骤S400中的接收端接收中断标志的步骤之后,包括如下步骤:

S700,接收端获取预设的阈值时间;

S710,接收端将所述阈值时间带入到生命周期状态机;所述生命周期状态机用于在接受到有效数据时重新计时,生命周期状态机进入下一状态;在计时到达阀值时间时,清除状态机和缓存。

具体的,在串口接收数据处理中,引入了协议生命周期概念。生命周期可以是串口传输1个字节所需时间的3到5倍,我们把它固定成一个阈值时间,与状态机配合使用。一旦收到有效数据会则重新开始生命计时,状态机进入下一个状态,如果计时到达生命周期阈值依然没有新的数据到来,则重新清除状态机与缓存,也就是说该条指令可能因发送方原因判断为无效指令。状态机+生命周期组合应用后会使一条完整的通信协议在时间上有了要求与鉴别,避免了发送端异常或者传输电磁干扰带来的一些干扰数据误读,也避免不完整指令占用部分缓存与有效指令在一起导致正常指令受到破坏。

基于本发明的一种嵌入式处理器串口通信方法的第二实施例,本发明的一种嵌入式处理器串口通信方法的第三实施例中,所述步骤S200,包括:

S210,接收端初始化CPU串口,串口配置波特率;

S220,接收端初始化定时器,定时器确定定时时长;

S230,接收端打开串口接收中断,打开定时中断,设定优先级后进入中断工作状态。

基于本发明的一种嵌入式处理器串口通信方法的第一实施例,本发明的一种嵌入式处理器串口通信方法的第四实施例中,所述S100步骤中发送端对通信指令添加包首和包尾进行封装的步骤包括:

S110,发送端对通信指令添加包首,其中,所述包首包括起步码和协议首字节,所述起步码为满足连续跳变电平的3个字节0xAA,所述协议首字节为0x06;

S120,发送端对通信指令添加包尾进行封装。

具体的,其中包首分为起步码可和协议首字节,起步码为满足连续跳变电平的3个0xAA字节,极具辨识力与抗干扰能力,协议首字节为0x06,简称6号协议;包尾为验证码字节。

协议数据结构如下表:

更具体的,包尾包括验证码,验证码由发送数据生成:

首先对验证码之前的所有协议数据拼接构造k位二进制数D=dk-1…d2d1d0,其对应的多项式为

D(X)=∑di*Xi,i∊[0,k)①;

然后,定义一个默认常数P,取值为0x131,转换为多项式P=X8+X5+X4+1,验证码F由数据DmodP得到,mod是求余符号,由于串口通信是以字节为单位,那么验证码也是选择单字节,在计算时对数据D需要左移8位,得到验证码的公式:

F=(28D)%P②;式中:F为验证码,%为求余运算符。

如果表达式②中被除数可以整除部分设为Q,剩下部分为余数R,得到:

28D/P=Q/P+R/P③;

按照表达式③的思路,在编程计算时,为了提高处理器执行代码效率,我们可以在协议发送或接收的过程实时计算验证码,从协议中的第二个字节开始计算,前两字节组成数据D,代入公式计算出临时验证码,往后每发送或接收一个字节更新一次验证码的值,在计算时除得的商直接放弃,余数与下一个字节组成新的数据D,继续计算,直到最后一字节数据,再乘以28代入计算,得到的余数为最终验证码的值。

由于采用无进位的二进制加法,很容易得到F=R④;

验证码正确后,把缓存数组整条协议复制到全局缓存二维数组,根据二维数组排列依次缓存成协议队列,我们把协议队列作为二级缓存,二级缓存可供应用层读出使用。

基于本发明的一种嵌入式处理器串口通信方法的第一实施例,本发明的一种嵌入式处理器串口通信方法的第五实施例中,所述S400步骤中的所述包首状态机进行包首侦测,包首侦测通过后,通过数据状态机接收数据至一维缓存数组,直到接收到包尾的步骤,包括:

S410,每接收数据的一个字节,判断该字节是否为起步码字节;

若是,S420,则将包首状态机变量加1;

S430,判断所述包首状态机变量是否等于3;

若否,则执行步骤S440,返回至所述每接收数据的一个字节,判断该字节是否为起步码字节(0xAA)的步骤;

若是,则执行步骤S450,继续接受第四个字节;

并判断所述第四个字节是否为协议首字节;

若是,则执行步骤S460,包首侦测通过,通过数据状态机接收数据至一维缓存数组,直到接收到包尾。

具体的,利用包首状态机完成包首侦测,包首状态机每接收一个字节则包首状态机变量加1,等到包首完整侦测到,则启动数据状态机。包首状态机的存在避免了指令丢失;数据状态机依旧是根据数据长度接收,每收一个字节则+1处理,同时接收到的数据按字节顺序存在ch_buffer[]中,直到最后一个验证字节结束,然后进入下一步的协议移动与重新封装。

基于本发明的一种嵌入式处理器串口通信方法的第一实施例,本发明的一种嵌入式处理器串口通信方法的第六实施例中,所述S400步骤中的通过数据状态机接收数据至一维缓存数组,直到接收到包尾步骤之后,包括:

S470,每接收一个字节,所述数据状态机变量加1;

S480,并将接受到的数据按照字节顺序存在一维缓存数组中,直到接收到包尾。

具体的,每接收一个字节,所述数据状态机变量加1,用于记录接收的字节数量,从而根据数字长度字节进行判断是否接收完成,或接收的协议数据是否正确。

基于本发明的一种嵌入式处理器串口通信方法的第一实施例,本发明的一种嵌入式处理器串口通信方法的第七实施例中,所述S600的步骤之后,包括:

若否,则执行步骤S610,包首状态机变量和数据状态机变量均清零,一维缓冲数组数据清空。

具体的,状态机在在每接收一个字节都会伴随当前值的判断,指令代号字节可进行代号值范围判断,还有在数字长度字节,验证字节的位置都可以做相应的判断,如果一旦发现不对,就可以退出状态机,即状态机变量清零,一维缓存数组ch_buffer[]数据清空,判断该指令为无效指令或数据,等待下一个正确指令,这样可以在底层过滤很多干扰或异常数据,这些数据都不会在应用层上出现。

更具体的,S470步骤之后,包括:

S471,获取指令代号字节;

S472,判断所述指令代号字节是否在预设的代号值范围内;

若否,则执行步骤S610,包首状态机变量和数据状态机变量均清零,一维缓冲数组数据清空。

基于本发明的一种嵌入式处理器串口通信方法的第一实施例,本发明的一种嵌入式处理器串口通信方法的第八实施例中,所述S600的步骤之后,包括:

S800,对所述二级缓存的二维数组定义相应的闭环指针链表,并封装成FIFO数据结构;

S810,将数组大小参数输入到FIFO数据结构中,以输出FIFO的实时利用率;

S820,并根据FIFO的所述实时利用率来调节二维缓存数组大小。

具体的,为了便于应用层的读出,对二级缓存的二维数组定义相应的闭环指针链表,封装成FIFO数据结构,该结构可输入数组大小参数,可输出FIFO实时利用率,在实际应用中可以通过FIFO利用率来调节二维缓存数组大小,让实际应用的内存资源最优化,在利用率高时加大数组大小,在利用率低时减小数组大小。

基于本发明的一种嵌入式处理器串口通信方法的第一实施例,本发明的一种嵌入式处理器串口通信方法的第九实施例中,所述S820的步骤之后,包括:

S830,设定FIFO状态标志,对写入端提供正在读、空闲和已有数据3种状态,对读出端提供正在写、空闲和已有数据3种状态;

S840,在发现冲突时,根据主次放弃整条旧协议或者放弃整条当前的协议。

具体的,对二级缓存,当处理器因一些业务需要,在某个瞬间出现用于缓存协议的FIFO满的时候,就可能出现某条协议的FIFO缓存单元被读与写同时操作,也就是说可能一条协议(多个字节)被应用层读到一半时,还剩下一些字节尚未读取就被来自底层中断一级缓存数据覆盖,因为CPU执行搬运数据指令是单字节数据或单字数据操作的,读的过程指令与写的过程往往是一条for循环指令完成,所以在实际应用中,需要杜绝该现象,协议的主次根据预设的优先级确定。

在其中一个实施例中,所述S820的步骤之后,包括:

S850,把for循环指令一起封装,且一起放到中断任务中完成;

S860,读与写分别封装到两个中断任务中。

为了实现上述目的,本发明还提供一种嵌入式处理器串口通信软件开发工具包,包括底层接收函数和协议栈函数;所述底层接收函数为将实现如上任一所述的嵌入式处理器串口通信方法中用于接收端完成一维缓存数组接收的算法封装成的用于串口中断的底层接收函数;所述协议栈为将实现如上任一所述的嵌入式处理器串口通信方法中为对接应用层的协议栈算法封装成的用于对接应用层的协议栈函数。

具体的,由于目前各种嵌入式处理器底层驱动对串口没有做底层封装,连嵌入式操作系统也只是做一个简易的缓存,所以常规处理办法是应用层简单的校验或自动反复多次发送与等待应答验证,这样最多只能减少错误率,一旦出错则需重新操作或通过报错输出告知操作者重新操作,将算法输出封装成两个函数,一个为用于串口中断的底层接收函数,完成一级缓存接收,另一个为对接应用层的协议栈函数,可以方便使用。

更具体的,所述底层接收函数包括实现步骤S200-步骤S600的算法全部或其中一部分;所述协议栈函数包括实现步骤S710、以及步骤S800-步骤S860的算法全部或其中一部分。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在如上所述的一个计算机可读存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备进入本发明各个实施例所述的方法。

在本说明书的描述中,参考术语“一实施例”、“另一实施例”、“其他实施例”、或“第一实施例~第X实施例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料、方法步骤或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。

需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者系统不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者系统所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者系统中还存在另外的相同要素。

上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。

以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。

12页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:一种USB数据线切换控制电路和方法

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!