一种主从设备通信方法 【技术领域】
本发明涉及数据通信,尤指一种主从设备之间的数据通信方法。
背景技术
一般情况下,设备之间的通信协议有很多种,比如TCP等,这些通信协议比较复杂,而且还有误码、校验、重发等等机制,系统非常庞大,在通信信道容易被干扰的环境是这种通信协议最佳的应用场合。
其实,对于距离很近的设备之间进行通信时,由于两个通信设备相隔很近(一般在2米以内),通信信道稳定,很难受到外界干扰而造成误码,因此,并不需要校验、重发等复杂的通信机制来保障通信的可靠性和正确性。特别是对于主从设备之间的通信,由于主设备固定为命令发起者,从设备只是被动接收命令或数据,主从设备之间很少或没有信令的交互,在这样的应用中使用TCP等通信协议进行通信并不能为系统带来性能上的极大提高,而且使系统变得复杂庞大,为此,可以寻求一种相对较简单的通信机制来实现近距离的主从设备之间的数据通信。
在这种通信信道比较可靠的设备之间的通信时,往往会采用以下类似的通信协议,这种通信协议一般是在每个数据包的前面增加一个信令头(一般这个信令头的长度为4个字节),然后跟着这个信令的长度信息(一般也是4个字节),表示这个数据包的长度,最后还会用一个信令来表示数据包结束,如图1所示。类似的通信协议有以下的一些缺点:
1、加上信令头的目的,是为了表示数据包地开始,因为所传输的数据里出现与信令头相同的4字节数据的概率很低,因此这种通信机制还是不能在根本上避免通信出错的情况发生;
2、当出现一次通信错误,由于长度信息的存在,可能会造成比较困难的通信恢复;
3、这种通信协议对少量有效数据的通信效率比较低。
【发明内容】
本发明提供一种主从设备通信方法,以解决现有技术中通信机制复杂的问题。
本发明提供的主从设备通信方法,包括下列步骤:
A、主设备将需要发送给从设备的数据转换成字符串,并发送给从设备;
B、从设备将接收的字符串转换成主设备发送的数据。
所述字符串是以ASCII码定义的字符串。
根据本发明的上述方法,所述主设备将字符串打成数据包发送,每个数据包带有数据包结束标识;所述从设备根据接收到的数据包结束标识,接收一个完整的数据包后进行数据转换。
根据本发明的上述方法,所述主设备在发送的数据包中插入分隔符,用以区分不同的数据组;所述从设备分析接收的数据包中是否有约定的分隔符,若有,则将分隔符前后的数据进行转换。
所述分隔符为空格。
所述数据包结束标识为回车符。
所述从设备中设有一个字符串数组,将接收的字符串存入该字符串数组中;当收到一回车符时,读出该字符串数组中存储的字符串进行转换,并清空该字符串数组。
所述数据包为长度相同或不同的数据包。
采用本发明的方法,能够简单实现主从设备之间的通信,相对于现有技术,本发明方法的优点如下:
1、回车符保证了每个数据包的正确开始;
2、如果在某个数据包出现错误,其下一个数据包就已经正确的恢复通信;
3、在少量数据通信时,其效率比较高。
【附图说明】
图1为现有技术数据包格式示意图;
图2为本发明实施例中主设备数据转换流程图;
图3为本发明实施例中从设备接收数据流程图;
图4为本发明实施例中从设备数据转换流程图。
【具体实施方式】
本发明方法适用于相隔很近的两个主从设备,它们之间通过通信接口(串口或并口)相连接。假设主设备要向从设备发送16进制数据0x112233,其携带参数0x44,则在主设备需要进行数据转换,将16进制数据0x112233转换成ASCII码字符串再发送出去。为了使从设备能正确地将接收的字符串还原成主设备所发送的原始数据,需要预先在主从设备中约定表示信令结束的标识符,本实施例中采用回车符来代表一个信令的数据包结束;由于信令有可能带有一个或多个参数,参数与信令之间或参数之间需要加以分隔,因此,需要预先约定参数分隔符,本实施例中采用空格来进行分隔。根据上述约定,主设备将需要传送的数据转换成字符串的具体流程如图2所示,包括下列步骤:
首先将16进制数据0x112233转换成字符串,得到“112233”;
增加空格,并将参数0x44转换为参数字符串,得到“112233 44”;
增加回车符,表示该信令数据包结束,得到“112233 44\n”,其中“\n”表示回车符;
将该转换后的数据通过主设备与从设备之间的通信接口发送给从设备。
从设备接收数据流程图如图3所示,包括下列步骤:
S31:从设备不断检测与主设备的通信接口;
S32:若检测到有新的数据到来,则执行步骤S33;否则,返回步骤S31,继续等待主设备发来新数据;
S33:读取接收的数据信息;
S34:判断当前接收的数据是否为表示一个数据包结束的回车符,若否,执行步骤S35;若是,执行步骤S36;
S35:将当前接收的数据存储到一个在从设备中开辟的字符串数组中加以保存,返回步骤S31,等待数据包的下一个字符串从接口传送到从设备中;
S36:读取字符串数组中保存的数据,即当前数据包的全部字符串,准备进入字符串转换流程,将接收的字符串转换成16进制数据。
具体转换方法如图4所示,包括下列步骤:
S41:从字符串数组中读取一个数据包的数据;本实施例中,读到的数据为字符串“112233 44”,字符串长度为9(包括空格);
S42:判断该数据包各字符串之间是否存在空格,若有,则执行步骤S43,否则,转至步骤S44;
S43:以空格为分界,将接收的字符串分成若干串彼此分隔的字符串;本实施例中,得到两串字符串,第一串字符串为“112233”;第二串字符串为“44”;
S44:将各字符串转换成16进制数据,即可得到主设备发送的信令数据0x112233和0x44。
以上实施例中,数据包结束标识符可以在主从设备中预先约定为任意字符。字符串之间的分隔符也可以在主从设备中预先约定为任意字符。
本发明中,主设备需要发送的数据不局限于实施例中的16进制数据,可以为任意进制数据。
本发明转换后的字符串可以是ASCII码定义的字符串,但并不局限于此。