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