26.03.2015, 11:12 | #171 |
Member
Регистрация: 10.03.2015
Сообщений: 40
Вес репутации: 0 |
Re: Модуль "CyberBot-2"
Понятно. Чего-то у меня значит не то)
|
26.03.2015, 13:28 | #172 |
Senior Member
Регистрация: 20.09.2014
Сообщений: 145
Вес репутации: 0 |
Re: Модуль "CyberBot-2"
Вы обрабатываете все 8 принимаемых символов или фильтруете 7 и берете только последний управляющий код?
Для защит от помех я бы принимал всю строку, сравнивал с шаблоном 7 символов и только потом 8 символ пускал в работу. |
26.03.2015, 15:44 | #173 | |
Member
Регистрация: 10.03.2015
Сообщений: 40
Вес репутации: 0 |
Re: Модуль "CyberBot-2"
Цитата:
Я нажимаю на кнопку "Вперед". Это кнопка большая W. Это ASCII = 0x57. По идее этот байт улетает в UART? Или туда уходит какой-то пакет байтов? Последний раз редактировалось cyberbot; 26.03.2015 в 16:05. |
|
26.03.2015, 17:55 | #174 |
Senior Member
Регистрация: 20.09.2014
Сообщений: 145
Вес репутации: 0 |
Re: Модуль "CyberBot-2"
Да, веб морда при нажатии любой кнопки отправляет 8 символов:
7 символов tx_com= 8 символ код нажатой кнопки. Как только убрали палец с кнопки тут же улетает строка: tx_com=x |
26.03.2015, 21:13 | #175 |
Member
Регистрация: 10.03.2015
Сообщений: 40
Вес репутации: 0 |
Re: Модуль "CyberBot-2"
Ага! Т.е. протокол какой-то связи все же есть!!!
А 7 символов - это какие символы? ASCII код пробела что ли? А как только я палец убираю - тоже по UART пакет передаётся из 7ми каких-то байт и 8го 'x'? Последний раз редактировалось cyberbot; 26.03.2015 в 21:17. |
26.03.2015, 21:36 | #176 |
Senior Member
Регистрация: 20.09.2014
Сообщений: 145
Вес репутации: 0 |
Re: Модуль "CyberBot-2"
Уважаемый, ну я же написал какие символы шлет веб морда, повторяю:
Нажали клавишу вперед и держите, веб морда на уарт выдает строку: tx_com=W Вот прям такая строка из 8 символов уходит в уарт. Убрали палец с кнопки, веб морда выдает в уарт: tx_com=x Я подозреваю, что вы приняли первый байт и тут же начинаете его по условиям проверять, а уарт не ждет вас и принимает остальные байты и вы их теряете, вам нужно организовать буфер на 16 байт, принимать байты в прерываниях, потом в основном цикле проверять содержимое, как только та мне ноль = обрабатываете, обработали строку, запишите ноль чтоб не зациклить основную прогу. |
26.03.2015, 23:36 | #177 |
Member
Регистрация: 10.03.2015
Сообщений: 40
Вес репутации: 0 |
Re: Модуль "CyberBot-2"
Да я приемник переписал уже по другому. Один фиг не работает с модулем CyberBot2 )))
Что характерно, если послать с терминала строку WWWWWWWW, то у меня светодиод загорается. Но я не понимаю, почему он не загорается, если отослать две строки по WWWW. Почему? Ведь буфер я вычитаю если получу только второй пакет. А первый пришел и по идее там сидеть должен! Код ниже привел. Изначально хотел сделать управление двигателями, но сейчас пока все свелось к просто корректному включению и выключению светодиода. Если стабильно будет это получаться, то двигатели сделать будет просто. Код:
//setup const int LEDpin = 13; //пин вывода сигнала на светодиод const long UART_Speed = 57600; //Скорость UART const byte Byte_forward = byte('W'); //команда: вперед const byte Byte_back = byte('S'); //команда: назад const byte Byte_left = byte('A'); //команда: влево const byte Byte_right = byte('D'); //команда: вправо const byte Byte_stop = byte('x'); //команда: стоп const byte all_delay = 1; //задержка выполнения повтора программы, [мс] byte Din[8] = {0, 0, 0, 0, 0, 0, 0, 0}; byte Data = 0; byte ctrl = B00000000; //управляющий регистр //ctrl[0]: =1 - в структуре собранного пакета обнаружены ошибки //ctrl[1]: =1 - получены данные void setup() { pinMode(LEDpin, OUTPUT); Serial.begin(UART_Speed); } void loop() { if (Serial.available() > 7) { int i; for (i = 0; i < 8; i++) { //загрузка и проверка структуры пакета Din[i] = Serial.read(); if (Din[i] != Byte_forward && Din[i] != Byte_back && Din[i] != Byte_left && Din[i] != Byte_right && Din[i] != Byte_stop) { ctrl |= 1<<0; } } if ((ctrl & (1<<0)) == 0) { //если пакет правильный ctrl |= 1<<1; //пакет собран и он без ошибок Data = Din[0]; //данные полученные по UART } ctrl &= ~(1<<0); } if ((ctrl & (1<<1)) != 0) { //если получена команда switch (Data) { case Byte_forward: _forward(); break; case Byte_back: _back(); break; case Byte_left: _left(); break; case Byte_right: _right(); break; case Byte_stop: _stop(); break; default: break; } ctrl &= ~(1<<1); //сбрасываем бит регистра управления после отработки пришедшего пакета } delay(all_delay); } void _forward() { digitalWrite(LEDpin, HIGH); } void _back() { digitalWrite(LEDpin, HIGH); } void _left() { digitalWrite(LEDpin, HIGH); } void _right() { digitalWrite(LEDpin, HIGH); } void _stop() { digitalWrite(LEDpin, LOW); } |
26.03.2015, 23:55 | #178 |
Senior Member
Регистрация: 20.09.2014
Сообщений: 145
Вес репутации: 0 |
Re: Модуль "CyberBot-2"
В скетчах ардуинок не соображаю, был бы голый ассемблер - само то.
Подпрограмма наполнения буфера (чтения уарт) - она у вас не в прерывании? Если нет, потеря байт всяко будет. Пошаговая отладка в ардуинках есть? или после компиляции сразу код на исполнение? и фиг его знает что там в мозгах мк происходит. В proteus смоделируйте вашу схему и работу мк. Данные сбрасывайте в озу, сразу будет видно где грабли. |
27.03.2015, 01:09 | #179 | ||
Senior Member
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1311 |
Re: Модуль "CyberBot-2"
Цитата:
Вот так: Цитата:
Последний раз редактировалось stD; 27.03.2015 в 01:42. |
||
27.03.2015, 06:32 | #180 |
Member
Регистрация: 10.03.2015
Сообщений: 40
Вес репутации: 0 |
Re: Модуль "CyberBot-2"
Эх, если б так всё просто было ))) У меня не получается в модуле терминала данные принять.
cat /dev/ttyUSB0 - в браузере секунд 20 крутится типа обновление страничики, потом ничего не происходит - не вижу в терминале ничего, аналогично и вывод в файл - файл создается, но в него ничего не пишется. Т.е. не могу я получить данные с ардуинки. |
Здесь присутствуют: 4 (пользователей: 0 , гостей: 4) | |
|
|