Arduino Serial Commander

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Serial Commander

Сообщение Alex » Вс апр 03, 2016 9:20 pm

а в каком месте, в файле upload нет никагого намека на цикл,есть
Обратите внимание на

Код: Выделить всё

if (modeWork == MODE_SERVER) {
…
и

Код: Выделить всё

  if (checkBuffer(START_FILENAME_MARKER)) {
    clearBuffer();
    name = true;
    modeWork = MODE_UPDATE;
  }  
Это штука вырубает всё, посмотрите в главном файле.
контроллер работает на частоте 16 мгц,что такого мы должны делать в обработчике что бы пропускать символы на 9600 и еще с буферизацией
Этот вопрос я задаю себе уже не первый месяц. :)
alexsis_76
Сообщения: 791
Зарегистрирован: Пт янв 22, 2016 10:08 am
Благодарил (а): 6 раз
Поблагодарили: 63 раза

Re: Arduino Serial Commander

Сообщение alexsis_76 » Пн апр 04, 2016 10:10 am

кажись нашел.
Вообщем дело в следующем, когда вы запускаете обновления uart начинает набивать буфер принятыми символами, программа в это время занимается своими делами, буфер набивается от хвоста к голове, функция Serial.read() читает буфер и освобождает место для следующего символа,если программа почему либо задерживается (например слишком длинная функция, непозволительные задежки)буфер заполняется быстрее чем мы из него зачерпываем , когда он заполнился следующие символы пропадают,например задежки вызовов Serial.read(), после передачи начала обновления нужно ввести задежку достаточную для того что бы контроллер гарантированно успел закончить свои дела, сейчас доделаю обновления целой папкой , выложу исходники и подробное обьяснение, слишком не удобно писать по 1 файлу.
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Serial Commander

Сообщение Alex » Вт апр 05, 2016 6:45 am

Если вы реально решили эту проблему, то это очень круто. Но, могу заметить, что я тоже исследовал эту теорию и ставил огромные задержки перед передачей каждого символа — не помогало.

И ещё раз хочу обратить ваше внимание: после начала передачи контроллер ни на что не отвлекается, только принимает символы.

И еще: сбои происходят в начале передачи, а в конце всё в порядке, а алгоритм и там и там одинаковый, значит есть какой-то внешний фактор.
alexsis_76
Сообщения: 791
Зарегистрирован: Пт янв 22, 2016 10:08 am
Благодарил (а): 6 раз
Поблагодарили: 63 раза

Re: Arduino Serial Commander

Сообщение alexsis_76 » Вт апр 05, 2016 10:30 am

И еще: сбои происходят в начале передачи, а в конце всё в порядке, а алгоритм и там и там одинаковый, значит есть какой-то внешний фактор.
Да все сходится а Вашими изысканиями, вообщем так, начинается передача, uart начинает набивать буфер символами, программа в это время занимается своими делами, прерывания асинхронны с работой программы, как я писал за один вызов uploadWorks() из буфера извлекается один символ, размер буфера 64 байта или 512 бит, там умещается символы начала передачи и небольшой фрагмент файла,в результате задержек в выполнении кода, к тому времени когда программа на читать читать символы из буфера последний уже полон и дальнейшая запись туда не возможна, устройство теряет символы причем в самом началепередачи, когда мы начнем вычитывать символы из буфера, все восстанавливается.
И ещё раз хочу обратить ваше внимание: после начала передачи контроллер ни на что не отвлекается, только принимает символы.
Да потом заметил, просто там все не так очевидно, я там вставил цикл,так понятнее.
Но, могу заметить, что я тоже исследовал эту теорию и ставил огромные задержки перед передачей каждого символа — не помогало.
я в начале тоже так делал-не помогало,
вообщем план такой
в файле upload вводим такую конструкцию
if(fff==false){
if (Serial.available() > 0)

incomingByte = getBuffer(Serial.read());
if (checkBuffer(START_MARKER)) {
clearBuffer();
digitalWrite(3, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
fff=true;
}
}
а остальное заключаем в while цикл
нужно ждать START_MARKER, затем когда START_MARKER прибыл запускаем основной цикл обработки
в программе командера делаем так
WriteFile(hPort,'STR',3,Sended,nil); // сигнал устройству приготовится
Sleep(3000);//задежка ??
// */ Поехали*/
WriteFile(hPort,'FAA',3,Sended,nil) ; // начало имени файла
сначала передаем START_MARKER
заием пауза 3 сек за это время девайс должен распознать START_MARKER и войти в цикл програмирования
затем дальше,у меня вроде пока без ошибок , сейчас доделаю обновление скопом, а то все это очень долго , файл upload dв архиве , там же исходник командера на дельфи
Вложения
Serial flesher.rar
(722.94 КБ) 186 скачиваний
alexsis_76
Сообщения: 791
Зарегистрирован: Пт янв 22, 2016 10:08 am
Благодарил (а): 6 раз
Поблагодарили: 63 раза

Re: Arduino Serial Commander

Сообщение alexsis_76 » Вс апр 10, 2016 1:35 pm

Нашел еще одну штуку , в драйвере SPI пока идут транкзации по шине все прерывания запрещаются
// Before using SPI.transfer() or asserting chip select pins,
// this function is used to gain exclusive access to the SPI bus
// and configure the correct settings.
inline static void beginTransaction(SPISettings settings) {
if (interruptMode > 0) {
uint8_t sreg = SREG;
noInterrupts();

#ifdef SPI_AVR_EIMSK
if (interruptMode == 1) {
interruptSave = SPI_AVR_EIMSK;
SPI_AVR_EIMSK &= ~interruptMask;
SREG = sreg;
} else
#endif
{
interruptSave = sreg;
}
}
соответственно и прерывание uart тоже, завтра посмотрим что с этим делать
инструкция noInterrupts();в Arduino.h определена как #define noInterrupts() cli()
cli() глобальное запрещение прерываний.
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Serial Commander

Сообщение Alex » Пн апр 11, 2016 7:36 am

На быстрых контроллерах (Дуе и 101) АСК работает без сбоев. Я портировал АМС на 101 и тандемный режим даже не понадобился — за всё время ни одной ошибки, даже при передаче таких гигантов, как scripts.js
alexsis_76
Сообщения: 791
Зарегистрирован: Пт янв 22, 2016 10:08 am
Благодарил (а): 6 раз
Поблагодарили: 63 раза

Re: Arduino Serial Commander

Сообщение alexsis_76 » Пн апр 11, 2016 10:15 am

На быстрых контроллерах (Дуе и 101) АСК работает без сбоев. Я портировал АМС на 101 и тандемный режим даже не понадобился — за всё время ни одной ошибки, даже при передаче таких гигантов, как scripts.js
Ну да, но у меня нет быстрого контроллера ;) весь фокус в том что бы заработало на этом,завел на 115200,
правда пришлось увеличить буфер для входящих пакетов до 1 кб,в результате экспериментов, девайс утратил совместимость с родным командером, обновление файлами выкинул, заливает сразу всю папку,для оценки скорости добавлены часики, сейчас сижу записываю, пока хороше. буквально сейчас закончил заливаться файл размером 3,75 МБ, ушло 372 c, открылся без ошибок.
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Serial Commander

Сообщение Alex » Пн апр 11, 2016 10:22 pm

Ну да, но у меня нет быстрого контроллера ;) весь фокус в том что бы заработало на этом,завел на 115200,
правда пришлось увеличить буфер для входящих пакетов до 1 кб,в результате экспериментов, девайс утратил совместимость с родным командером, обновление файлами выкинул, заливает сразу всю папку,для оценки скорости добавлены часики, сейчас сижу записываю, пока хороше. буквально сейчас закончил заливаться файл размером 3,75 МБ, ушло 372 c, открылся без ошибок.
Подобный энтузиазм и отношение к делу радует.
alexsis_76
Сообщения: 791
Зарегистрирован: Пт янв 22, 2016 10:08 am
Благодарил (а): 6 раз
Поблагодарили: 63 раза

Re: Arduino Serial Commander

Сообщение alexsis_76 » Вт апр 12, 2016 2:14 pm

Вообщем все получилось, девайс поддерживает полный набор скоростей,устранены недостатки Serial Commandera, а именно
Устранение бага с передачей файлов
Добавление режима передачи бинарных файлов
Добавление режима работы с директориями
файлы передаются без ошибок, почти всегда, но в данном случае механизм возникновения другой от меня не зависящий и от них можно избавится совсем
передаются файлы любых форматов
работает

В результате экспериментов как я писал девайс напрочь утратил совместимость с Serial Commanderом, увеличился расход памяти под буфер, ну и наконец еще неприятный момент
файлы передаются без ошибок, почти всегда
из за того что частота кварца не дробная (16 мгц) uart контроллера работает не точно на указанных частотах,имеются погрешности смотрите стр 226 даташита, например для скорости 115200 погрешность составляет -3,5%,для 230400-8,5 т.е работа невозможна(проверял), что бы работать с нулевой погрешностью нужно брать дробную частоту (18.4320MHz)тогда все по нулям, из за этого при передачи длинных последовательностей происходит искажения символов см рисунок
477.gif
477.gif (2.29 КБ) 5425 просмотров
если это попадает в заголовок файла то он перестает читаться
избавится от этого можно уменьшением скорости передачи и соответственно увеличением времени загрузки.ну или кардинально поставив правильный кварц.
если кому интересно то завтра будут исходники
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Serial Commander

Сообщение Alex » Ср апр 13, 2016 10:00 am

избавится от этого можно уменьшением скорости передачи и соответственно увеличением времени загрузки.ну или кардинально поставив правильный кварц.
Подождите секундочку, есть же простой способ проверки контрольной суммы переданного блока, который гарантирует правильность передачи и при этом способе вообще неважно какой там кварц.
Ответить