Я пытаюсь создать свой собственный беспроводной протокол 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