roboforum.ru

Технический форум по робототехнике.
Текущее время: 30 ноя 2024, 14:35

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: UART приём-передача файла
СообщениеДобавлено: 03 фев 2009, 18:57 
Не в сети
Аватара пользователя

Зарегистрирован: 29 окт 2007, 18:11
Сообщения: 1866
Откуда: Пермь
прог. языки: Brainfuck/Basic/Delphi/C++/Lisp/x86asm/JavaScript
что-нибудь по-проще можете посоветовать?

_________________
Tomorrow will be. Better


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UART приём-передача файла
СообщениеДобавлено: 03 фев 2009, 18:59 
Не в сети
Аватара пользователя

Зарегистрирован: 28 дек 2004, 20:33
Сообщения: 10211
Откуда: Тольятти
Skype: Ed_Gull
прог. языки: Bascom AVR Basic
ФИО: Гуль Эдуард Викторович
переведи


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UART приём-передача файла
СообщениеДобавлено: 03 фев 2009, 19:01 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
Наверно z модем кокойнибудь. в примерах CVAVR например. http://www.hpinfotech.ro/html/download.htm

а может x или y модем подойдет ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UART приём-передача файла
СообщениеДобавлено: 03 фев 2009, 19:08 
Не в сети
Аватара пользователя

Зарегистрирован: 29 окт 2007, 18:11
Сообщения: 1866
Откуда: Пермь
прог. языки: Brainfuck/Basic/Delphi/C++/Lisp/x86asm/JavaScript
подойдет то, что проще реализовать :)
есть у меня вариант - просто конвертировать файл в хекс и передавать строку за строкой, но не кошерно ибо никакой проверки нет, да и совместимости с терминальными прогами - тоже. zmodem смотрю
P.S. делаю картридер для минибота :)

_________________
Tomorrow will be. Better


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UART приём-передача файла
СообщениеДобавлено: 03 фев 2009, 22:09 
Не в сети
Site Admin
Аватара пользователя

Зарегистрирован: 09 фев 2006, 15:36
Сообщения: 3339
Откуда: Москва
Skype: vooon341
прог. языки: Python, C, Bash, JavaScript, C++, PHP
ФИО: Владимир Ермаков
Кодировать в base64 + crc32?

_________________
Linux user | Firefox user


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UART приём-передача файла
СообщениеДобавлено: 06 фев 2009, 19:26 
Не в сети
Аватара пользователя

Зарегистрирован: 29 окт 2007, 18:11
Сообщения: 1866
Откуда: Пермь
прог. языки: Brainfuck/Basic/Delphi/C++/Lisp/x86asm/JavaScript
сделал первый набросок. заморочки со скоростью страшные :( полмегабайта записывает на карточку за 10 мин на скорости порта 115200 бод :o
алгоритм такой:
ББ: передаю 78байт данных + 2байта управления потоком(#10#13), ожидаю ответа устройства (2 байта), снова передаю до победного конца)
МБ: принимаю 78 байт, записываю в файл, отсылаю пакет готовности(2 байта + #10#13).
на стороне МБ обратного декодирования base64 пока нет.
такая скорость передачи - нормальное явление?

_________________
Tomorrow will be. Better


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UART приём-передача файла
СообщениеДобавлено: 06 фев 2009, 20:02 
Не в сети
Аватара пользователя

Зарегистрирован: 21 янв 2005, 12:16
Сообщения: 977
Откуда: Germany
прог. языки: asm
посмотреть в сторону нормальных имеющихся протокольчиков....
залезть в кишки , например , к старому fastlynx (из под бут-дискеты дистрибутив win95 передавал с компа-на-комп минут 20..40)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UART приём-передача файла
СообщениеДобавлено: 06 фев 2009, 21:29 
Не в сети

Зарегистрирован: 20 ноя 2008, 19:31
Сообщения: 431
Откуда: Чернобыль
прог. языки: асмемблер
ФИО: Валентин Семенович
Мой совет. Начни со старого доброго Xmodem'a
Потратишь всего 1-2 вечера. И получишь рабочий вариант. Потом с (небольшой вероятностью) начнешь улучшать.
Можешь сделать свой, а можешь на развалах поискать.

_________________
За здравый смысл у нас принимается мнение большинства.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UART приём-передача файла
СообщениеДобавлено: 06 фев 2009, 22:08 
Не в сети
Аватара пользователя

Зарегистрирован: 29 окт 2007, 18:11
Сообщения: 1866
Откуда: Пермь
прог. языки: Brainfuck/Basic/Delphi/C++/Lisp/x86asm/JavaScript
дык это и есть xmodem :) собственной сборки. посмотрю как улучшить, много времени тратится на приём пакета.

_________________
Tomorrow will be. Better


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UART приём-передача файла
СообщениеДобавлено: 11 окт 2009, 13:10 
Не в сети
Аватара пользователя

Зарегистрирован: 29 окт 2007, 18:11
Сообщения: 1866
Откуда: Пермь
прог. языки: Brainfuck/Basic/Delphi/C++/Lisp/x86asm/JavaScript
c xmodem от hyperterminal есть заморочка: на самом деле простокол не xmodem, a xmodem-crc; отличие заключается в подсчете последних двух байт: в первом используется контрольная сумма, во втором - crc16, причем полином пришлось подбирать долго :) итого получилось так:
Код:
Иннициализирующее значение  : $0000
Выходная XOR маска          : $0000
Входные данные              : не инвертируются
Выходной CRC перед XOR      : не инвертируется
Значение полинома           : $1021 (Зеркальное значение = $8408)
Полином                     : x^16 + x^15 + x^2 + 1
Значение для '123456789'    : $31C3

_________________
Tomorrow will be. Better


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UART приём-передача файла
СообщениеДобавлено: 18 окт 2009, 20:53 
Не в сети
Аватара пользователя

Зарегистрирован: 29 окт 2007, 18:11
Сообщения: 1866
Откуда: Пермь
прог. языки: Brainfuck/Basic/Delphi/C++/Lisp/x86asm/JavaScript
с гипертерминалом дельного что-то ничего не получилось, так что вводим эхозащищенную модификацию xmodem-crc.
управляющие символы:
Код:
   _eot = &H04         'End of Transmission
   _ack = &H06         'Acknowledge
   _nack = &H15        'Not Acknowledge
   _c = &H43           'ACII "C"
   _can = &H18         'Cancel Transmission

новый символ - _can означает отмену передачи/приема, отсылается только приемной строной. необходимость в нём может возникнуть в случае пропуска целого пакета (ситуацию можно отследить по двум packet number байтам). кстати, маркеры пакета и команды управления передачей полностью различны у передатчика (_sot,_eot) и приемника (_ack,_nack,_c,_can).
чуть изменился пакет:
Код:
[Start of Header] [Packet Number] [~Packet Number] (Packet Data,base64) [[16 bit CRC]] [End of Packet]
квадратные скобки - один байт
~Packet Number - дополнение Packet Number до 0xFF, т.е. Packet Number + ~Packet Number = 0xFF

данные передаются в base64, что автоматически не допускает возможность подмены управляющих символов последовательностью данных. далее, crc16 считается для пакета данных, а не их base64 представления, чтобы зря не терять точности обнаружения ошибок. символ конца пакета позволяет передавать сколь угодно малую порцию файла (нужно для экономии оперативной памяти на устройстве).
благодаря модификации удалось получить:
  • произвольный размер пакета (но из-за base64 кодировки обязательно кратный 4 байтам)
  • полная защита от эхо-эффекта
  • возможность прервать передачу
как это все работает:
  • приемник отсылает _c, символизирующий готовность принять данные. если передатчик не среагировал, то отправка повторяется ещё 2 раза. если же и на этот раз возникла ошибка, то операция прерывается.
  • передатчик отсылает пакет под номером 1.
  • приемник может ответить тремя способами:
    • _ack - пакет принят без ошибок, жду следующий
    • _nack - пакет повредился, нужен повтор
    • _can - прервать операцию
  • передатчик соотвественно команде либо отсылает новый пакет, либо повторяет предыдущий
  • допустим, номер пакета вышел за границы 0xFF, тогда следующий номер - 0x00
  • после последнего пакета передатчик отсылает символ _eot до тех пор, пока не получит _ack или _can

_________________
Tomorrow will be. Better


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UART приём-передача файла
СообщениеДобавлено: 25 окт 2009, 23:05 
Не в сети
Аватара пользователя

Зарегистрирован: 29 окт 2007, 18:11
Сообщения: 1866
Откуда: Пермь
прог. языки: Brainfuck/Basic/Delphi/C++/Lisp/x86asm/JavaScript
есть заморочка с base64: в баскоме функция кодирования работает только для нуль-терминированных строк. понятно, что как только в файле встречается байт 0x00, пакет формируется неверно.
поэтому написал кодировщик [[UUE]]
Код:
Sub Uue_encode_print()
'кодирование в uue
   Const _amount = 7                                        'размер пакета/3-1

   Local B_buf As Byte : Local L_buf As Long : Local L_buf2 As Long
   Local Index As Byte : Local I As Byte : Local K As Byte

   For I = 0 To _amount
      Index = I * 3
      'три последовательных байта
      Incr Index : L_buf = Packet(index) : Shift L_buf , Left , 8
      Incr Index : L_buf = L_buf + Packet(index) : Shift L_buf , Left , 8
      Incr Index : L_buf = L_buf + Packet(index)
      'преобразование тройки
      L_buf2 = L_buf
      For K = 3 To 0 Step -1
         Index = K * 6
         Shift L_buf2 , Right , Index
         B_buf = L_buf2
         B_buf = B_buf And &B00111111
         B_buf = B_buf + 32
         Printbin B_buf
         L_buf2 = L_buf
      Next
   Next
End Sub

_________________
Tomorrow will be. Better


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO