我正在尝试在两个8051微控制器之间通过串行发送数据,而我对这种数据包格式的旧数据概念有待改进:
Byte 1: Recipient
Byte 2: Sender
Bytes 3-n: Payload
Byte n: Checksum
这是因为接收方会认为接收方值开始了数据包,但是接收方值可能会出现在有效负载中的任何位置,从而使接收方感到困惑。
我曾考虑将整个数据包的数据分成一系列半字节,但这会使带宽需求增加一倍。
我现在正在以以下方式查看7位数据包:
Byte 0: Constant Sync value (magic number)
Byte 1: Recipient
Byte 2: Sender
Bytes 3-24: Payload
Byte 25: byte of 1st flipped bits
Byte 26: byte of 2nd flipped bits
Byte 27: byte of 3rd flipped bits
Byte 28: checksum
所以我的想法是针对每个传入的字节(字节1到24),将该字节与幻数进行比较,进位的值取决于该字节是否为幻数,然后进位转换为字节25、26和27连锁。然后在计算完校验和之后。
我认为我缺少一些东西(以后我会担心寄存器保护),但这是到目前为止我用于字符传输的代码。假设校验和是预先计算的,并且字节25-27预设为0。第一个字节已经在SBUF中,并且该函数将在字节发送之后触发下一个:
transmit:
cjne R1,#CHECKSUM_POINTER,notxe
sjmp endtxdf ;end operations if we reached checksum pointer
notxe:
inc R1 ;Process next value (first value printed in triggering function)
mov A,@R1
cjne A,#SYNCVAL,tsync
xrl A,#0FFh ;Next value is the magic number so carry is cleared and flip the byte
sjmp etsync
tsync:
setb C ;Next value isn't magic number so carry is set
etsync:
mov SBUF,A ;Send value out on serial line
;then move carry into 24-bit value (bytes 25 through 27)
mov A,byte_25
rrc A
mov byte_25,A
mov A,byte_26
rrc A
mov byte_26,A
mov A,byte_27
rrc A
mov byte_27,A
endtxdf:
;transmit interrupt ends
reti
我如何优化此代码片段,以允许将8位值转换为7位值(或更有效的值),以便魔术字节仅发送一次以开始数据传输?
此外,每个数据包始终具有相同的字节数。