8-разрядный двоичный код от 7 до 7 бит в среде микроконтроллера 8051 - PullRequest
0 голосов
/ 02 июня 2019

Я пытаюсь отправить данные по последовательному каналу между двумя микроконтроллерами 8051, и моя старая идея данных этого формата пакета нуждается в улучшении:

Byte 1: Recipient
Byte 2: Sender
Bytes 3-n: Payload
Byte n: Checksum

Это потому, что получатель будет думать, что значение Recipient запускает пакетно значение получателя может появиться в любом месте полезной нагрузки, что может привести к путанице в получателе.

Я рассмотрел разделение данных всего пакета на серию кусков, но это удвоило бы требования к пропускной способности.

Сейчас я смотрю на 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-битные значения (или что-то более эффективное), чтобы магический байт отправлялся только один раз для начала передачи данных?

Кроме того, каждый пакет всегдатакое же количество байтов.

...