Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с приемом файла по Xmodem от Гипертерминала
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
alux
Пытаюсь отправить тестовый текстовый файл через гипертерминал на прибор.
За основу взял исходник Xmodem.cpp
http://www.koders.com/cpp/fidF02ED33BDED10...s=xmodem.cpp#L1

Немного переделал: убрал обработку исключений, заменил функцию расчета CRC16 и исправил ошибки. В итоге SendFile() отправляет файл, а вот наоборот, никак не получается: получаю SOH, затем номер блока=1, затем его дополнение до единицы=254, и все... Дальше Гипертерминал получает запрос на повторную передачу и после 9 попыток связь обрывается. Делаю все по протоколу, вроде. Свои исходник прилагаю. Посмотрите, пожалуйста, что я не так делаю?
cf7k
Если я Вас правильно понял - Вы в приборе не можете принять то, что отсылает гипертерминал.
В плюсах я не силен, но могу предложить рабочий сырец, который у меня работает. Может поможет разобраться.

Метод XModem() вызывается в прерываниях по приходу символа и по окончании приема блока. Вызов SPSetRxMode - как раз выставляет, кто сгенерирует прерывания. (Они генерируются поочередно - на первый символ блока и на окончание приема блока).

Нажмите для просмотра прикрепленного файла

PS.Offtopic: а никто не подскажет альтернативу гипертерминалу, чтоб с расцветочкой работала (как Putty) и имела бы X-Modem? А то без веселой расцветочки (которые ESC-коды) как-то невесело получается... smile.gif
alux
Проблема решилась после того, как применил таймер для отсчета таймаута. Код немного усовершенствовал- добавил пару меток и goto. Хоть и говорят, что этого оператора нужно избегать, в данном случае он пришелся в самый раз.
alux
Здесь исправленный вариант X-modem. В предыдущем перепутаны байты при вычислении CRC16. Теперь все работает: и прием, и передача файлов через Гипертерминал.
alux
Обнаружилась одна проблема с передачей файла от девайса на PC по Xmodem. Почему-то всегда не отправляется второй пакет 128 байт. Объясню на примере: допустим, нужно передать файл, состоящий из 128 символов '1' , 128 символов '2' и 128 символов '3'. В результате в переданном файле 128 символов '1' и 128 символов '3'. Если файл состоит , например, из 390 байт, то Гипертерминал, как и положено, сообщает об успешной передаче 4 пакетов, но в результате в файле сохранено 3 пакета по 128 байт. Второй пакет отсутствует.
Версии все исчерпал. Посмотрите, пожалуйста, исходник, может что-нибудь упустил из виду... Хотя в протоколе все просто как дважды два.


PS. Вопрос снимается. В начале функции SendFile() нужно вставить следующее:
Код
    if(((ans = GetByteWithTimeout(DLY_60_SEC)) > 0) && ans == CRC)
    {
        bCRC = true;  
    }
    else
    {
        message(timeout_err);
        return false;      
    }
Теперь все работает.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.