PCCar.ru - Ваш автомобильный компьютер

Вернуться   PCCar.ru - Ваш автомобильный компьютер > Всё Остальное > Arduino проекты

Ответ
 
Опции темы Поиск в этой теме
Старый 12.07.2010, 14:27   #1
CyberSubaru
Гуру
 
Аватар для CyberSubaru
 
Регистрация: 20.01.2010
Возраст: 43
Город: Владивосток
Регион: 25
Машина: Subaru Impreza GF/GG
Сообщений: 1,064
CyberSubaru has a spectacular aura aboutCyberSubaru has a spectacular aura aboutCyberSubaru has a spectacular aura about
Question Вопрос по Ардуино. Хелп плиз-((

Плата: фридуино на 168й меге.
Пишу программку общения с ком-портом.
Суть - в порт передаются команды типа ATS12345
Программка их парсит побайтно и в зависимости от команды выполняет те или иные действия.

Уперся я о непонятный камень:
код работает нестабильно.

в монитор порта вбиваю ATS
в 50% случаев (примерно)
код доходит до выполнения Serial.println("SET COMMAND /PIN ");
НО(!!!!)
Стабильно в цикле забивания массива выводит именно те байты, что передавались. Но if и switch работают по-китайски.

И еще нюанс такой: Serial.print как-то больше способствует корректной работе кода с массивом.

В чем может быть трабл? Уже идей никаких нет.


PHP код:
void setup() 

    
Serial.begin(115200); 
//  Serial.println("ECU READY"); 



int cmd[64];
int i;
int pin;
int maxdata;

void loop() 

  
  
maxdata=0;
  
   for(
i=0;i<64;i++) {cmd[i]=0;}
   
   
i=0;

   while (
Serial.available()>0
      {  
       
cmd[i]=Serial.read();
       
Serial.print(cmd[i],BYTE);   
       
i++;
       
maxdata++;
       } 
   
 
   if ((
cmd[0]==65)and(cmd[1]==84))
   {
     
// Serial.println("AT OK"); 

       
switch (cmd[2])
       {
       case 
73: {      //'I'
               
                
};
               break;
       
       case 
71: {        //'G'
                  
pin=cmd[3];
                };
                break;     
       
       case 
83:   {      //'S'
                        
Serial.println("SET COMMAND /PIN "); 
                         
pin=cmd[3];
                        
// Serial.println(pin,BYTE); 
                        // Serial.println(cmd[4],BYTE); 

                         
                         
switch (cmd[4])
                         {
                           case 
1pinMode(pinINPUT); break;
                           case 
2pinMode(pinOUTPUT); break;
                           case 
3digitalWrite(pin,cmd[5]);break;
                           case 
4analogWrite(pin,cmd[5]);break;
                         }  

                   };
               break;
       }
    }
 


__________________
Subaru Impreza GF H6 BMW Style PROJECT : - постройка.
Было: 2литра / PIII-650/SSD32GB/9.5"/SB X-FI/GPS/3G/OBD2/...
Строю: 3литра / I5-MOBILE/500/12"/SB X-FI/GPS/3G/OBD2/...
pccar
Drive2
-----
Impreza Lite: Allwinner A13 (DNS E76) - Cortex A8 1GHz
http://www.pccar.ru/showthread.php?t=18574
CyberSubaru вне форума   Ответить с цитированием
Старый 12.07.2010, 14:49   #2
ancc
Гуру
 
Регистрация: 17.03.2008
Возраст: 45
Город: Новокузнецк
Регион: 42
Машина: 2003\Lexus\RX330
Сообщений: 1,192
ancc is a splendid one to beholdancc is a splendid one to beholdancc is a splendid one to beholdancc is a splendid one to beholdancc is a splendid one to beholdancc is a splendid one to beholdancc is a splendid one to behold
По умолчанию

ваще seral.println Никогда не использовал. только serial.print.

и еще. массив cmd[i] очищается если ни одно из условий не выполняется или нет?

может жестко проверять при приеме данных из порта по маске команды и как только расхождение обнаружилось сразу массив очищать.
ancc вне форума   Ответить с цитированием
Старый 12.07.2010, 14:59   #3
ancc
Гуру
 
Регистрация: 17.03.2008
Возраст: 45
Город: Новокузнецк
Регион: 42
Машина: 2003\Lexus\RX330
Сообщений: 1,192
ancc is a splendid one to beholdancc is a splendid one to beholdancc is a splendid one to beholdancc is a splendid one to beholdancc is a splendid one to beholdancc is a splendid one to beholdancc is a splendid one to behold
По умолчанию

и еще. про serial.flush после каждого приема верной комманды не помешает вроде. Хотя тут я хз. вроде не надо.
ancc вне форума   Ответить с цитированием
Старый 12.07.2010, 15:11   #4
CyberSubaru
Гуру
 
Аватар для CyberSubaru
 
Регистрация: 20.01.2010
Возраст: 43
Город: Владивосток
Регион: 25
Машина: Subaru Impreza GF/GG
Сообщений: 1,064
CyberSubaru has a spectacular aura aboutCyberSubaru has a spectacular aura aboutCyberSubaru has a spectacular aura about
По умолчанию

Цитата:
Сообщение от ancc Посмотреть сообщение
ваще seral.println Никогда не использовал. только serial.print.

и еще. массив cmd[i] очищается если ни одно из условий не выполняется или нет?

может жестко проверять при приеме данных из порта по маске команды и как только расхождение обнаружилось сразу массив очищать.
да пока только что и вбиваю одно и тоже - ATS
так что обработка ИНАЧЕ смысла пока не имеет.
вот результат нескольких подряд вбитых "ATS1234":
Цитата:
AT

AT OK
S1234AT

AT OK
S1234AT

AT OK
S1234ATS1234ATS

AT OK
SET COMMAND /PIN


1234ATS

AT OK
SET COMMAND /PIN


1234ATS1234ATS1234ATS

AT OK
SET COMMAND /PIN


1234
добавил перевод каретки

Цитата:
Сообщение от ancc Посмотреть сообщение
и еще. про serial.flush после каждого приема верной комманды не помешает вроде. Хотя тут я хз. вроде не надо.
с ним вообще работает криво....
__________________
Subaru Impreza GF H6 BMW Style PROJECT : - постройка.
Было: 2литра / PIII-650/SSD32GB/9.5"/SB X-FI/GPS/3G/OBD2/...
Строю: 3литра / I5-MOBILE/500/12"/SB X-FI/GPS/3G/OBD2/...
pccar
Drive2
-----
Impreza Lite: Allwinner A13 (DNS E76) - Cortex A8 1GHz
http://www.pccar.ru/showthread.php?t=18574
CyberSubaru вне форума   Ответить с цитированием
Старый 12.07.2010, 15:26   #5
ancc
Гуру
 
Регистрация: 17.03.2008
Возраст: 45
Город: Новокузнецк
Регион: 42
Машина: 2003\Lexus\RX330
Сообщений: 1,192
ancc is a splendid one to beholdancc is a splendid one to beholdancc is a splendid one to beholdancc is a splendid one to beholdancc is a splendid one to beholdancc is a splendid one to beholdancc is a splendid one to behold
По умолчанию

выберете жестко формат комманды AT xxxxx <cr>
и по этой маске команды парсите. как только у вас расхождение команды с маской буфер очищаете и ничего в него не пишете пока первый символ "A" не появится. С этого момента начинаете писать в буфер и снова сличать с маской.
ancc вне форума   Ответить с цитированием
Старый 12.07.2010, 15:34   #6
CyberSubaru
Гуру
 
Аватар для CyberSubaru
 
Регистрация: 20.01.2010
Возраст: 43
Город: Владивосток
Регион: 25
Машина: Subaru Impreza GF/GG
Сообщений: 1,064
CyberSubaru has a spectacular aura aboutCyberSubaru has a spectacular aura aboutCyberSubaru has a spectacular aura about
По умолчанию

Цитата:
Сообщение от ancc Посмотреть сообщение
выберете жестко формат комманды AT xxxxx <cr>
и по этой маске команды парсите. как только у вас расхождение команды с маской буфер очищаете и ничего в него не пишете пока первый символ "A" не появится. С этого момента начинаете писать в буфер и снова сличать с маской.
Читайте, пожалуйста, внимательнее!
Цитата:
вот результат нескольких подряд вбитых "ATS1234"
Команды вбиваю в монитор порта (в ардуино который) - одну и туже.
Результат работы кода - разный.
Код элементарный - читаем байты с порта, пока есть данные, забиваем их в массив и далее смотрим, если первые два AT, то смотрим дальше. Вот это условие при одинаковых входных данных срабатывает не всегда. И Switch-case тоже срабатывает не всегда, при одинаковых входных данных.
Вопрос - почему такое может быть?
__________________
Subaru Impreza GF H6 BMW Style PROJECT : - постройка.
Было: 2литра / PIII-650/SSD32GB/9.5"/SB X-FI/GPS/3G/OBD2/...
Строю: 3литра / I5-MOBILE/500/12"/SB X-FI/GPS/3G/OBD2/...
pccar
Drive2
-----
Impreza Lite: Allwinner A13 (DNS E76) - Cortex A8 1GHz
http://www.pccar.ru/showthread.php?t=18574
CyberSubaru вне форума   Ответить с цитированием
Старый 12.07.2010, 15:38   #7
ancc
Гуру
 
Регистрация: 17.03.2008
Возраст: 45
Город: Новокузнецк
Регион: 42
Машина: 2003\Lexus\RX330
Сообщений: 1,192
ancc is a splendid one to beholdancc is a splendid one to beholdancc is a splendid one to beholdancc is a splendid one to beholdancc is a splendid one to beholdancc is a splendid one to beholdancc is a splendid one to behold
По умолчанию

а что мешает вам добавить немного обратной связи? выводите ваш буфер обратно (с целью отладки), будете знать что там у вас лежит.

и я бы посоветовал комманду заканчивать <cr> (ентер грубо говоря).
ancc вне форума   Ответить с цитированием
Старый 12.07.2010, 15:41   #8
CyberSubaru
Гуру
 
Аватар для CyberSubaru
 
Регистрация: 20.01.2010
Возраст: 43
Город: Владивосток
Регион: 25
Машина: Subaru Impreza GF/GG
Сообщений: 1,064
CyberSubaru has a spectacular aura aboutCyberSubaru has a spectacular aura aboutCyberSubaru has a spectacular aura about
По умолчанию

Цитата:
Сообщение от ancc Посмотреть сообщение
а что мешает вам добавить немного обратной связи? выводите ваш буфер обратно (с целью отладки), будете знать что там у вас лежит.

и я бы посоветовал комманду заканчивать <cr> (ентер грубо говоря).
Вы код программы читали? Складывается такое впечатление, что вместо помощи, Вы издеваетесь.
__________________
Subaru Impreza GF H6 BMW Style PROJECT : - постройка.
Было: 2литра / PIII-650/SSD32GB/9.5"/SB X-FI/GPS/3G/OBD2/...
Строю: 3литра / I5-MOBILE/500/12"/SB X-FI/GPS/3G/OBD2/...
pccar
Drive2
-----
Impreza Lite: Allwinner A13 (DNS E76) - Cortex A8 1GHz
http://www.pccar.ru/showthread.php?t=18574
CyberSubaru вне форума   Ответить с цитированием
Старый 12.07.2010, 15:53   #9
ancc
Гуру
 
Регистрация: 17.03.2008
Возраст: 45
Город: Новокузнецк
Регион: 42
Машина: 2003\Lexus\RX330
Сообщений: 1,192
ancc is a splendid one to beholdancc is a splendid one to beholdancc is a splendid one to beholdancc is a splendid one to beholdancc is a splendid one to beholdancc is a splendid one to beholdancc is a splendid one to behold
По умолчанию

да и не думал вообще-то. Подскажите вот у вас в программе:

((cmd[0]==65)and(cmd[1]==84))

я правильно понимаю что начало команды вы хотите увидеть обязательно в первом элементе массива?
ancc вне форума   Ответить с цитированием
Старый 12.07.2010, 16:01   #10
CyberSubaru
Гуру
 
Аватар для CyberSubaru
 
Регистрация: 20.01.2010
Возраст: 43
Город: Владивосток
Регион: 25
Машина: Subaru Impreza GF/GG
Сообщений: 1,064
CyberSubaru has a spectacular aura aboutCyberSubaru has a spectacular aura aboutCyberSubaru has a spectacular aura about
По умолчанию

Цитата:
Сообщение от ancc Посмотреть сообщение
да и не думал вообще-то. Подскажите вот у вас в программе:

((cmd[0]==65)and(cmd[1]==84))

я правильно понимаю что начало команды вы хотите увидеть обязательно в первом элементе массива?
верно.
потому что это и предполагается.
вот когда это условие срабатывает - необязательно срабатывает следующее условие проверки элементов массива, будто он где-то повреждается.
__________________
Subaru Impreza GF H6 BMW Style PROJECT : - постройка.
Было: 2литра / PIII-650/SSD32GB/9.5"/SB X-FI/GPS/3G/OBD2/...
Строю: 3литра / I5-MOBILE/500/12"/SB X-FI/GPS/3G/OBD2/...
pccar
Drive2
-----
Impreza Lite: Allwinner A13 (DNS E76) - Cortex A8 1GHz
http://www.pccar.ru/showthread.php?t=18574
CyberSubaru вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



Часовой пояс GMT +4, время: 08:19.


Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot