关于PID闭环控制中上位机与下位机通讯代码的解析分享(三)


现在我们来看看一个用于解析下位机数据帧的函数代码
protocol_frame_parse
是一个静态函数,用于解析下位机数据帧的类型(命令)。
*data
是一个指向帧数据的指针,data_len
是帧数据的大小。
frame_type
用于存储帧类型的变量。
need_to_parse_len
是待解析的数据长度。
header_oft
存储帧头的偏移量。
checksum
用于计算校验和的变量。
在函数的开头,通过调用recvbuf_get_len_to_parse
函数获取待解析的数据长度,如果长度小于9(无法同时找到帧头和帧长度),则直接返回frame_type
。
如果还未找到帧头,则需要进行查找。调用recvbuf_find_header
函数来查找帧头的偏移量header_oft
。如果找到帧头,则将parser.found_frame_head
置为1,更新parser.r_oft
的值为帧头偏移量,然后再次根据新的起始位置调用recvbuf_get_len_to_parse
函数来确认是否可以计算帧长。如果不能计算帧长,则直接返回frame_type
。如果在未解析的数据中仍未找到帧头,则丢弃已解析过的数据,更新parser.r_oft
的值。
计算帧长,并确定是否可以进行数据解析。如果parser.frame_len
为0,则调用get_frame_len
函数计算帧长。如果待解析的数据长度小于帧长,则直接返回frame_type
。
计算帧长,并确定是否可以进行数据解析。如果parser.frame_len
为0,则调用get_frame_len
函数计算帧长。如果待解析的数据长度小于帧长,则直接返回frame_type
。
在帧头位置确认且未解析的数据超过帧长时,可以计算校验和。如果数据被分为两部分,即一部分在缓冲区尾部,一部分在缓冲区头部,则需要分别计算两部分的校验和。如果数据帧可以一次性取完,则直接计算校验和。
以下是相对应的上位机C#数据编码程序