Столкнулся с проблемой "затыков" во время работы TCP. Стек использую софтовый, свой.
Иногда при работе TCP перестаёт происходить обмен данными между клиентом и сервером. В процессе изучения проблемы выяснилось, что фактически прекращается поток TCP. Стал изучать что да как и получил такие вот результаты:
Для наглядности эксперимента я отказался от GPRS и соеденил 2 SIM300D модема между собой. Получен CONNECT 9600. Один модем управляется Linux 2.6 + pppd, воторой ATMega128 и мой PPP/TCP. Устройство коннектится к FTP серверу и заливает туда файл, после предварительного прохода по директориям.
В один прекрасный момент обмен останавливается и ATMega128 "вешает трубуку" после неоднократного TCP Timeout.
Я повесил dumper на ноги RX/TX между AtMega & SIM300D и аналогично Linux делает дамп (pppd record file.name). В идеале дампы должны были получиться одинаковые. Но не тут-то было. Если со стороны ATmega в модем ушли одни данные, то со стороны Linux из модема вышло немного не то... В лучшем случае "обрезанное" с конца, в худшем с "битыми" битами, в результате чего не сошлась CRC и так далее. Эксперимент проводился неоднократно, и всегда результат был один.
Я по началу грешил на "кривую" обработку RST/CTS с моей стороны, но посидев и понаблюдав на них осцилом, так ни разу и не увил на них активности, да и от куда? Длина пакетов редко превышает 40 байт, а интервал между послыками в среднем 100ms и редко, когда идёт 2 пакета подряд в одном направлении, чаще туда-сюда.
Скорость порта 57600, фактическая скорость на ATMega ~57596 (кварц 7,3728 MHz).
Я не грешу на модем, потому как на макетке с FTDI и под управлением всё тем же Linux он работает как из пушки. (кстати у FTDI выходные уровни заданы самой FTDI, а именно 3.3В и Z состояние отсутсвует.)
Но всё таки? Что может быть? Что я делаю не так?