总体实现过程:1.数据接收块 2.接收数据处理块 3.数据发送块,4.进程通讯块
其中还有数据加密,电台译码,硬件操作指令选择等等
1. 数据协议= Head +Length+data1+data2+…+dataN+CheckSum
Length= data1+......+dataN 的数据数量个数
CheckSum(和校验)=Length+data1+….+dataN
Head=0x0B;
1.1.数据接收,API或者组件(MSComm我用这个,虽然非议很多),保证数据不丢失,就算是不完整的接收一个帧也不会丢掉。 只有当处理了一个完整的帧后才丢弃。
1.2.如果遇到Head 取 length+1长度数据校验,数量不够则返回,等待下一帧数据接收后处理。
1.3.扔掉数据的方法,每次循环找Head,直到找到一帧完整正确的帧,处理完后扔掉一帧数据,不是则每次只扔掉Head。
2. 完整数据解析,按照数据协议,进行解析处理。对要加密协议的转发。。
3. 发送部分,采用线程触发,沉睡100ms 是否收到应答,标志量IsSend=true,,IsReceive=true则不重发,IsReceive=false,则要重发,只重发一次。。
及时的开启,及时的结束。。
4. 进程通讯,将解析出来的协议通过串口消息,发给需要这个消息进程。FindWindow(1,2),找到窗体句柄SendMessage(1,2,3,4).发给目标窗体。。
将受到的进程消息发送给 Arm
其中难点在于,C++builder在处理这些时候有一定的不方便之处,毕竟语言是C++支持标准STL库的,语言难度还是相当的。。
后面的章节将会讲到我遇到和处理的问题,
难点1.。接收数据用队列处理是比较好的,我用vector,
难点2.。数据发送的时候用TThread线程类,自定义线程,要做到准确的时间检测表质量的变化,
难点3.。在与进程通讯的时候保证字符数据的完整性,和准确性,基于消息循环的处理,才不会丢失消息。。接错消息。