8051微控制器环境中的8位ASCII到7位二进制

时间:2019-06-02 00:42:05

标签: serial-port byte 8051 8-bit 7-bit

我正在尝试在两个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位值(或更有效的值),以便魔术字节仅发送一次以开始数据传输?

此外,每个数据包始终具有相同的字节数。

0 个答案:

没有答案