![]() |
|
|
#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 крутится типа обновление страничики, потом ничего не происходит - не вижу в терминале ничего, аналогично и вывод в файл - файл создается, но в него ничего не пишется. Т.е. не могу я получить данные с ардуинки. |
|
|
|
![]() |
| Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
| Опции темы | Поиск в этой теме |
| Опции просмотра | |
|
|