关于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#数据编码程序

