Отправить файл через последовательный порт с Linux и C - PullRequest
3 голосов
/ 23 августа 2009

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

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

Ответы [ 5 ]

6 голосов
/ 23 августа 2009

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

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

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

2 голосов
/ 23 августа 2009

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

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

1 голос
/ 23 августа 2009

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

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

0 голосов
/ 18 ноября 2009

дешевый и грязный раствор: В Linux, Unix или OSX просто запустите 'screen -L '. На другом конце запишите вывод вашего файла в консоль в режиме raw. -L записывает его в файл, содержимое которого будет файлом, который вы передали с другого конца. Проверьте содержимое с помощью xxd, чтобы убедиться, что оно совпадает с тем, что было у вас в источнике.

0 голосов
/ 23 августа 2009

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

stty -F /dev/ttySx -a

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

stty -F /dev/ttySx cooked
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...