переосмысление протокола PPP / SLIP для беспроводной работы на микроконтроллерах 8051 - PullRequest
1 голос
/ 19 сентября 2019

Я пытаюсь создать свой собственный беспроводной протокол PPP / SLIP, и я не могу выяснить, неисправна ли радиостанция или мои мысли (представленные в виде псевдокода ниже) ошибочны.

Пакет данных выглядит следующим образом:

Byte 1: Special Start flag (same value that starts packet)
Byte 2: Most significant bit = direction packet is going
Byte 2: Remaining 7 bits: Slave the master communicates with.
Byte 3: Packet Sequence number
Byte 4-n: Data
Byte n+1: Checksum

Я написал весь код на ассемблере 8051, поскольку целевые чипы также основаны на 8051.Я настроил скорость данных, чтобы быть одинаковым во всей системе.Я проверил мой код сборки на симуляторе 8051 (ucsim).Я использую версию, которая была свежей по состоянию на 2 месяца назад.

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

Поскольку я новичок в совершенствовании своего собственного протокола SLIP / PPP, у меня есть несколько вопросов относительно моей настройки.

Моя мысль состоит в том, чтобы мастер проверил входящий порядковый номер из пакета, чтобы убедиться, что он не совпадает с последним, и, если он есть, отбросьте пакет.Кроме того, клиент сначала принимает любой пакет (для синхронизации), затем увеличивает локальный порядковый номер, затем отправляет запрос мастеру, затем следующий пакет, который он получает, должен соответствовать локальному порядковому номеру.

Я на правильном пути с этой мыслью?или у людей, которые изобрели SLIP / PPP, было другое мышление, когда речь шла о синхронизации и получении правильных пакетов фиксированной длины?

Для беспроводной работы в целом достаточно трех попыток?Примечание: когда моя система отправляет последовательные пакеты без перерыва, порядковый номер для каждого пакета в группе совпадает.

Я реализовал заполнение байтов вместе с таймаутом приема данных.

Предположим,тайм-аут случился.Должен ли я автоматически очистить флаг (это указывало, что полученный бит был escape-символом)?или мне следует подождать, пока получатель не отправит байт начального флага, а затем очистить флаг там?

Кроме того, будет ли какая-либо польза от добавления специального конечного байта в мой пакет или это не будет полезным?Все устройства в моей настройке знают, что при получении начального байта он прекращает получать пакет в байте контрольной суммы.

Так что смысл всего этого в том, что я пытаюсь использовать аналогичную логику в моем PPP / SLIPНастройка протокола, которую использовали люди, когда разрабатывали первый протокол PPP, который мы используем сегодня.

Это мой псевдокод.Все функции, кроме «Начать передачу», автоматически вызываются системой в приоритетной последовательности, когда происходит это событие.Последовательные функции имеют наивысший приоритет.

Timeout function:
    clear timer-run
    clear escape-bit
    set ignore-byte
    If packet-received is set then
      clear packet-received
      set packet-official
      ** If device is client then
        Increment sequence number (auto-roll over past 255)
      ** End if
    end if
  Exit Function

  Serial Function
    If byte received then clear receive-flag and run received
    If byte transmitted then clear transmit-flag and run transmitted
  Exit Function

  Begin Transmit Function
      Set packet-count to 3
      Set byte to start code
      clear escape-bit
      Output byte to serial
  Exit Function

  Transmitted Function
    If escape-bit set then
      clear escape-bit
      output saved transmit byte
      Exit Function
    end if
    Save old variables and load new bank
    If transmit-pointer is at end of packet then
      Decrement packet-count
      If packet-count = 0 then
        Enable Receiver
        ** If device is host then
        Enable Timeout timer
        ** End If
        Restore old variables
        Exit Function
      End if
      Set transmit-pointer to start of packet
      Set byte to start code
      goto Output-mode
    ELSE
      increment transmit-pointer
      load byte from current ram location (defined by transmit-pointer)
    End If
    If byte is Escape code then
      Set saved transmit byte to Special escape character
      Set escape-bit
    End If
    If byte is Start code then
      Set saved transmit byte to Special start character  
      Set escape-bit
      Set byte to Escape code
    End If
    Output-mode:
      Output byte to serial
      Restore old variables
  Exit Function

  Received Function
      Clear timer-run
      Save old variables and load new bank  
      Load received byte
      If escape-bit is set then
        clear escape-bit
        If received-byte is special start character then 
          set received byte to start code
          goto receive-2
        End If
        If received-byte is special escape character then
          set received byte to escape code
          goto receive-2
        End If
          goto receive-fail
      End If
      If received-byte is escape code then
        set escape-bit
        reset timer timeout
        set timer-run
        Restore old variables
        Exit function
      End if
      If received-byte is start code then
        reset receive-pointer
        clear ignore-byte
        reset timer timeout
        set timer-run
        Restore old variables
        Exit function
      End if
      receive-2:
      If ignore-byte is set then
        Restore old variables
        Exit Function
      End If 
      If receive-pointer is at checksum byte address then
          Validate checksum
          If checksum is correct then
              Set Packet-received flag 
          End if
          Restore old variables
          Exit Function
      End If
      If receive-pointer is at sequence byte address then
            If received-byte is not expected-sequence then
              set ignore-byte
              Restore old variables
              Exit Function
            End if 
      End If
      If receive-pointer is at beginning then
          reset checksum seed
      End If
      store byte in ram address (defined by receive-pointer)
      calculate checksum on received-byte and update checksum value variable
      reset timer timeout
      set timer-run
      Restore old variables
  Exit Function
...