by lvd » 21 Jul 2007, 02:56
Mozg, +1! =)
Конкретизация как результат размышлений за некоторые время.
Со стороны спектрума имеется до 255 "соединений" (номера 1-255). По сериальному порту могут передаваться данные в пц - по одному из соединений, и приниматься с пц аналогично. Данные каждого соединения передаются пакетами длиной от 0 до 256 байт. Формат пакета:
+0.byte: номер соединения (1-255) или 0 - спец. случай
+1.byte: статус пакета (пакет с данными, закрытие соединения, открытие соединения, етц - требует конткретизации)
+2.byte: длина данных, если +1 позволяет передать данные, 0 - длина 256 байт
далее собственно данные.
со спека на пц передаются данные без какого-либо контроля, считается, что пц принимает все пакеты и байты не теряются.
с пц на спек 2 метода контроля:
1. на уровне контроллера сериального порта (для случая атм - это at89c51 с буфером приёма) "затыкается фонтан" (байты с пц) сигналом CTS.
2. спек анализирует ВСЕ принятые данные и пакеты. Если спеку некуда положить очередную порцию даных в очередном пакете в данном соединении (переполнение буфера, например), он запоминает этот факт для данного соединения, и посылает пц требование ПРЕКРАТИТЬ слать данные в данном соединении. В дальнейшем когда буфер освободится, посылает требование пц ПРОДОЛЖИТЬ посылку данных. Она продолжается с того же самого пакета.
Открывает и закрывает соединения исключительно спектрум.
Далее, уровнем выше. Данные в соединении. Они являются подмножеством протокола sock5, только не по сокетам как обычно, а по этим самым соединениям. Сначала спек передаёт запрос на открытие коннекта с заданным ойпи (или фкдн) и портом. пц отвечает что мол открыто, или что мол хренвам. Если открыто - то дальнейшие данные в данном соединении являются тем, что по тому сокету течёт. Предусмотрено закрытие соединения со стороны спека и информирование спека о закрытии соединения со стороны сервера или пц.
Собственно, всё.
Не предусмотрено методов контроля целостности по сериальному порту: считается, что байты не теряются и соотвественно не происходит рассинхронизации. Однако, можно считать, например, передачу пакета с номером соединения 0 (см. выше, 0 - спец. номер) сигналом к инициализации - все возмножно существующие соединения забываются. Таким образом, если произошла глобальная жопа, надо просто слать 0 до опупения (точнее, отослать более 256+3 нулей).
F̞͖̭̿̔ͯu̐̅cͬ̑ͩk̨̤̳͇̮̭̪̠̽̿̓̆ͭͩ ̷̩̰͎̩͓̘̾̀ͬ̊ͭ͛ͅda̝̺͙̬͎̝̾͟ ̰̜̝̯͉̯̖̓̎́ͨ̽ͫ͟f̟͇̭̀ͬͨͭ̐̚u̹̼̹̗̞͑̔͂͐̚cͭ̅̊̆̒̆ǩ̝̩̯́ͥ̔̍̑ḭ͓͍̳̬ͦ̽͂n͍͎͈̈̅ͩͬ ̊ͫ̂̾̑̈́f̲͚͉͓͗̋́ͧͦ̅ȗ͇̲̻͈̲̅̎͗͒ͭ͡c̬̟̠̹̯̈́ͩ͘ͅk̫̠̻̋͜a̲͒̾̇!͙͕̺͉̗̩̲̂̏̄̀