串口、总线通讯要把数据打包成帧、收到再解包。本课用 C 实现一组打包 / 解包函数,处理校验与字节序。
跟别的设备通讯,不能把数一甩就发,得按对方的格式打包成一帧。地址、功能码、数据各就各位,再加个校验。这活儿用位运算最顺手,C 写比梯形图清楚。
先备齐三样:从站地址、功能码、要发的数据。C 里就是三个寄存器,HD0 放地址、HD1 放功能码、HD2 放数据。每拍都就绪,等通讯指令来取。
报文头就是地址和功能码拼一块:地址挪到高八位,功能码占低八位。C 里地址左移八位,再按位或上功能码,一个十六位就出来了。移位加按位或,就是干这个的。
校验和最简单:地址加功能码,数据再分高低字节各加一遍,最后取低十六位。接收方照算一遍,对不上就知道传错了。这里是加法校验,换成 CRC 也一个套路。
头和数据拼好、校验算好,就置个 rdy 位告诉外界:这帧能发了。真正的发送交给通讯指令,C 只管把料备齐。算和发分开,各司其职,互不越界。
打包就四步:地址功能码拼头,高低字节算校验,结果写回寄存器,置 rdy 位等发。核心是移位和加减——位运算加算术,C 写最省心。解包就是反过来。