roboforum.ru

Технический форум по робототехнике.


UART приём-передача файла

Раздел создан специально для людей которым интересна робототехника, но в силу разных причин они не знают с чего начать.
Задавайте ваши вопросы, какими бы простыми они не казались, постоянные посетители форума постараются ответить на них по мере своих сил.
Робот своими руками. Самодельный робот.

UART приём-передача файла

Сообщение MiBBiM » 03 фев 2009, 18:57

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

Re: UART приём-передача файла

Сообщение EdGull » 03 фев 2009, 18:59

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

Re: UART приём-передача файла

Сообщение avr123.nm.ru » 03 фев 2009, 19:01

Наверно z модем кокойнибудь. в примерах CVAVR например. http://www.hpinfotech.ro/html/download.htm

а может x или y модем подойдет ?
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: UART приём-передача файла

Сообщение MiBBiM » 03 фев 2009, 19:08

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

Re: UART приём-передача файла

Сообщение Vooon » 03 фев 2009, 22:09

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

Re: UART приём-передача файла

Сообщение MiBBiM » 06 фев 2009, 19:26

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

Re: UART приём-передача файла

Сообщение nest » 06 фев 2009, 20:02

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

Re: UART приём-передача файла

Сообщение zubr » 06 фев 2009, 21:29

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

Re: UART приём-передача файла

Сообщение MiBBiM » 06 фев 2009, 22:08

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

Re: UART приём-передача файла

Сообщение MiBBiM » 11 окт 2009, 13:10

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
Аватара пользователя
MiBBiM
 
Сообщения: 1866
Зарегистрирован: 29 окт 2007, 18:11
Откуда: Пермь
прог. языки: Brainfuck/Basic/Delphi/C++/Lisp/x86asm/JavaScript

Re: UART приём-передача файла

Сообщение MiBBiM » 18 окт 2009, 20:53

с гипертерминалом дельного что-то ничего не получилось, так что вводим эхозащищенную модификацию 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
Аватара пользователя
MiBBiM
 
Сообщения: 1866
Зарегистрирован: 29 окт 2007, 18:11
Откуда: Пермь
прог. языки: Brainfuck/Basic/Delphi/C++/Lisp/x86asm/JavaScript

Re: UART приём-передача файла

Сообщение MiBBiM » 25 окт 2009, 23:05

есть заморочка с 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
Аватара пользователя
MiBBiM
 
Сообщения: 1866
Зарегистрирован: 29 окт 2007, 18:11
Откуда: Пермь
прог. языки: Brainfuck/Basic/Delphi/C++/Lisp/x86asm/JavaScript


Вернуться в Новичкам или основы основ роботостроения.

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

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