Страница 3 из 6

Re: Arduino Serial Commander

Добавлено: Вс апр 03, 2016 9:20 pm
Alex
а в каком месте, в файле upload нет никагого намека на цикл,есть
Обратите внимание на

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

if (modeWork == MODE_SERVER) {
…
и

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

  if (checkBuffer(START_FILENAME_MARKER)) {
    clearBuffer();
    name = true;
    modeWork = MODE_UPDATE;
  }  
Это штука вырубает всё, посмотрите в главном файле.
контроллер работает на частоте 16 мгц,что такого мы должны делать в обработчике что бы пропускать символы на 9600 и еще с буферизацией
Этот вопрос я задаю себе уже не первый месяц. :)

Re: Arduino Serial Commander

Добавлено: Пн апр 04, 2016 10:10 am
alexsis_76
кажись нашел.
Вообщем дело в следующем, когда вы запускаете обновления uart начинает набивать буфер принятыми символами, программа в это время занимается своими делами, буфер набивается от хвоста к голове, функция Serial.read() читает буфер и освобождает место для следующего символа,если программа почему либо задерживается (например слишком длинная функция, непозволительные задежки)буфер заполняется быстрее чем мы из него зачерпываем , когда он заполнился следующие символы пропадают,например задежки вызовов Serial.read(), после передачи начала обновления нужно ввести задежку достаточную для того что бы контроллер гарантированно успел закончить свои дела, сейчас доделаю обновления целой папкой , выложу исходники и подробное обьяснение, слишком не удобно писать по 1 файлу.

Re: Arduino Serial Commander

Добавлено: Вт апр 05, 2016 6:45 am
Alex
Если вы реально решили эту проблему, то это очень круто. Но, могу заметить, что я тоже исследовал эту теорию и ставил огромные задержки перед передачей каждого символа — не помогало.

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

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

Re: Arduino Serial Commander

Добавлено: Вт апр 05, 2016 10:30 am
alexsis_76
И еще: сбои происходят в начале передачи, а в конце всё в порядке, а алгоритм и там и там одинаковый, значит есть какой-то внешний фактор.
Да все сходится а Вашими изысканиями, вообщем так, начинается передача, 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в архиве , там же исходник командера на дельфи

Re: Arduino Serial Commander

Добавлено: Вс апр 10, 2016 1:35 pm
alexsis_76
Нашел еще одну штуку , в драйвере 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() глобальное запрещение прерываний.

Re: Arduino Serial Commander

Добавлено: Пн апр 11, 2016 7:36 am
Alex
На быстрых контроллерах (Дуе и 101) АСК работает без сбоев. Я портировал АМС на 101 и тандемный режим даже не понадобился — за всё время ни одной ошибки, даже при передаче таких гигантов, как scripts.js

Re: Arduino Serial Commander

Добавлено: Пн апр 11, 2016 10:15 am
alexsis_76
На быстрых контроллерах (Дуе и 101) АСК работает без сбоев. Я портировал АМС на 101 и тандемный режим даже не понадобился — за всё время ни одной ошибки, даже при передаче таких гигантов, как scripts.js
Ну да, но у меня нет быстрого контроллера ;) весь фокус в том что бы заработало на этом,завел на 115200,
правда пришлось увеличить буфер для входящих пакетов до 1 кб,в результате экспериментов, девайс утратил совместимость с родным командером, обновление файлами выкинул, заливает сразу всю папку,для оценки скорости добавлены часики, сейчас сижу записываю, пока хороше. буквально сейчас закончил заливаться файл размером 3,75 МБ, ушло 372 c, открылся без ошибок.

Re: Arduino Serial Commander

Добавлено: Пн апр 11, 2016 10:22 pm
Alex
Ну да, но у меня нет быстрого контроллера ;) весь фокус в том что бы заработало на этом,завел на 115200,
правда пришлось увеличить буфер для входящих пакетов до 1 кб,в результате экспериментов, девайс утратил совместимость с родным командером, обновление файлами выкинул, заливает сразу всю папку,для оценки скорости добавлены часики, сейчас сижу записываю, пока хороше. буквально сейчас закончил заливаться файл размером 3,75 МБ, ушло 372 c, открылся без ошибок.
Подобный энтузиазм и отношение к делу радует.

Re: Arduino Serial Commander

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

В результате экспериментов как я писал девайс напрочь утратил совместимость с Serial Commanderом, увеличился расход памяти под буфер, ну и наконец еще неприятный момент
файлы передаются без ошибок, почти всегда
из за того что частота кварца не дробная (16 мгц) uart контроллера работает не точно на указанных частотах,имеются погрешности смотрите стр 226 даташита, например для скорости 115200 погрешность составляет -3,5%,для 230400-8,5 т.е работа невозможна(проверял), что бы работать с нулевой погрешностью нужно брать дробную частоту (18.4320MHz)тогда все по нулям, из за этого при передачи длинных последовательностей происходит искажения символов см рисунок
477.gif
477.gif (2.29 КБ) 6083 просмотра
если это попадает в заголовок файла то он перестает читаться
избавится от этого можно уменьшением скорости передачи и соответственно увеличением времени загрузки.ну или кардинально поставив правильный кварц.
если кому интересно то завтра будут исходники

Re: Arduino Serial Commander

Добавлено: Ср апр 13, 2016 10:00 am
Alex
избавится от этого можно уменьшением скорости передачи и соответственно увеличением времени загрузки.ну или кардинально поставив правильный кварц.
Подождите секундочку, есть же простой способ проверки контрольной суммы переданного блока, который гарантирует правильность передачи и при этом способе вообще неважно какой там кварц.