Отправить файл через последовательный порт с Linux и C



Я разрабатываю приложение, которое считывает данные с последовательного порта и отправляет их по TCP-соединению, и наоборот. К сожалению, при чтении данных с последовательного порта он никогда не останавливается. Он не обнаруживает метку EOF, ни EOL или какой-либо другой специальный символ.



Итак, как я могу обнаружить конец файла (или" конец соединения") через последовательный порт в C и Linux?

691   5  

5 ответов:

Зависит от того, насколько вы контролируете протокол, используемый для последовательного соединения. Если только файлы не содержат неявно какой-либо маркер конца файла (а как я понял ваш пост, это не так), вам нужно реализовать какой-то коммуникационный протокол для передачи файлов.

Одними из самых простых проколов, использовавшихся еще в дни BBS, были XMODEM и его производные. Они могут быть достаточно просты для вас, чтобы использовать.

Если у вас есть полноценный компьютер на другом в конце последовательной линии, вероятно, было бы гораздо проще просто установить PPP-соединение по последовательной линии и осуществлять связь по TCP/IP.

Последовательная ссылка передает только байты. Нет пакетного фрейма, нет проверки ошибок, поэтому вы не можете надежно отправлять файлы по raw-последовательному каналу. Вам нужно использовать какой-то протокол, например XMODEM, KERMIT и т. д.

Реализовать такой протокол нетривиально. Возможно, будет проще запустить TCP / IP по ссылке, если другой конец также является компьютером. Пожалуйста, проверьте SLIP или PPP.

Последовательный порт выдает "конец файла" в состоянии зависания, о чем сигнализируют внеполосные линии управления модемом (сброс DCD). Если вы подключены к нуль-модему, этого никогда не произойдет.

Используйте механизм фрейминга, как предлагалось в других ответах. Вам, возможно, не нужно идти всю свинью с чем - то вроде ZMODEM, хотя-просто префиксация файла с размером файла и контрольной суммой CRC32 должно сделать, если ссылка достаточно безошибочна и 8-битная чистая.

Проверьте конфигурацию последовательного порта:

stty -F /dev/ttySx -a

Установить вареную ссылку вместо сырой ссылки:

stty -F /dev/ttySx cooked

Дешевое и грязное решение: в linux, unix или osx просто запустите " screen-L ". На другом конце запишите выходные данные вашего файла в консоль, в режиме raw. - L записывает его в файл, содержимое которого будет файлом, который вы передали с другого конца. Проверьте содержимое с помощью xxd, чтобы убедиться, что они соответствуют тому, что вы имели в источнике.

Comments

    Ничего не найдено.