![]() |
![]() |
#171 |
Member
Регистрация: 10.03.2015
Сообщений: 40
Вес репутации: 0 ![]() |
![]()
Понятно. Чего-то у меня значит не то)
|
![]() |
![]() |
![]() |
#172 |
Senior Member
Регистрация: 20.09.2014
Сообщений: 145
Вес репутации: 0 ![]() |
![]()
Вы обрабатываете все 8 принимаемых символов или фильтруете 7 и берете только последний управляющий код?
Для защит от помех я бы принимал всю строку, сравнивал с шаблоном 7 символов и только потом 8 символ пускал в работу. |
![]() |
![]() |
![]() |
#173 | |
Member
Регистрация: 10.03.2015
Сообщений: 40
Вес репутации: 0 ![]() |
![]() Цитата:
Я нажимаю на кнопку "Вперед". Это кнопка большая W. Это ASCII = 0x57. По идее этот байт улетает в UART? Или туда уходит какой-то пакет байтов? Последний раз редактировалось cyberbot; 26.03.2015 в 16:05. |
|
![]() |
![]() |
![]() |
#174 |
Senior Member
Регистрация: 20.09.2014
Сообщений: 145
Вес репутации: 0 ![]() |
![]()
Да, веб морда при нажатии любой кнопки отправляет 8 символов:
7 символов tx_com= 8 символ код нажатой кнопки. Как только убрали палец с кнопки тут же улетает строка: tx_com=x |
![]() |
![]() |
![]() |
#175 |
Member
Регистрация: 10.03.2015
Сообщений: 40
Вес репутации: 0 ![]() |
![]()
Ага! Т.е. протокол какой-то связи все же есть!!!
А 7 символов - это какие символы? ASCII код пробела что ли? А как только я палец убираю - тоже по UART пакет передаётся из 7ми каких-то байт и 8го 'x'? Последний раз редактировалось cyberbot; 26.03.2015 в 21:17. |
![]() |
![]() |
![]() |
#176 |
Senior Member
Регистрация: 20.09.2014
Сообщений: 145
Вес репутации: 0 ![]() |
![]()
Уважаемый, ну я же написал какие символы шлет веб морда, повторяю:
Нажали клавишу вперед и держите, веб морда на уарт выдает строку: tx_com=W Вот прям такая строка из 8 символов уходит в уарт. Убрали палец с кнопки, веб морда выдает в уарт: tx_com=x Я подозреваю, что вы приняли первый байт и тут же начинаете его по условиям проверять, а уарт не ждет вас и принимает остальные байты и вы их теряете, вам нужно организовать буфер на 16 байт, принимать байты в прерываниях, потом в основном цикле проверять содержимое, как только та мне ноль = обрабатываете, обработали строку, запишите ноль чтоб не зациклить основную прогу. |
![]() |
![]() |
![]() |
#177 |
Member
Регистрация: 10.03.2015
Сообщений: 40
Вес репутации: 0 ![]() |
![]()
Да я приемник переписал уже по другому. Один фиг не работает с модулем 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); } |
![]() |
![]() |
![]() |
#178 |
Senior Member
Регистрация: 20.09.2014
Сообщений: 145
Вес репутации: 0 ![]() |
![]()
В скетчах ардуинок не соображаю, был бы голый ассемблер - само то.
Подпрограмма наполнения буфера (чтения уарт) - она у вас не в прерывании? Если нет, потеря байт всяко будет. Пошаговая отладка в ардуинках есть? или после компиляции сразу код на исполнение? и фиг его знает что там в мозгах мк происходит. В proteus смоделируйте вашу схему и работу мк. Данные сбрасывайте в озу, сразу будет видно где грабли. |
![]() |
![]() |
![]() |
#179 | ||
Senior Member
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1312 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
Вот так: Цитата:
Последний раз редактировалось stD; 27.03.2015 в 01:42. |
||
![]() |
![]() |
![]() |
#180 |
Member
Регистрация: 10.03.2015
Сообщений: 40
Вес репутации: 0 ![]() |
![]()
Эх, если б так всё просто было ))) У меня не получается в модуле терминала данные принять.
cat /dev/ttyUSB0 - в браузере секунд 20 крутится типа обновление страничики, потом ничего не происходит - не вижу в терминале ничего, аналогично и вывод в файл - файл создается, но в него ничего не пишется. Т.е. не могу я получить данные с ардуинки. |
![]() |
![]() |
![]() |
Здесь присутствуют: 5 (пользователей: 0 , гостей: 5) | |
|
|