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̲͒̾̇!͙͕̺͉̗̩̲̂̏̄̀