Обмен данных ПК-ARDUINO с помощью VISA

VISA, TCP/IP, USB, CAN, GPIB и подобные протоколы
roccosiffredi
junior
junior
Сообщения: 51
Зарегистрирован: 18 апр 2012, 13:51
Версия LabVIEW: 2011
Контактная информация:

Обмен данных ПК-ARDUINO с помощью VISA

Сообщение roccosiffredi »

Добрый день, прошу помощи разобраться с настройкой обмена данными.

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

char direct[3];      //3
char st[6];            //6
char sp[2];            //2
char buffer[12];    //12

void setup() 
{
  Serial.begin(9600);

...

}
void loop()
{
  int k = 0;

...

  direct[0] = '\n';
  st[0] = '\n';
  sp[0] = '\n';

...

  while(Serial.available() > 0)                // Загоняем прочитанное в буфер
  {       
     buffer[k] = Serial.read();
     k++;
     delay(5);
  }
  buffer[k++] = '\n';                          // Закрываем массив

  if(k>0)                                      // Если буфер наполнен
  {       
     sscanf(buffer, "%[^','],%[^','],%[^',']", &direct, &st, &sp);      // Разбираем его на части отделенные запятой 
  }

  S = String(st).toInt();
  V = String(sp).toInt();

...

// Крутим вправо (RIGHT)/////////////////////
  if ((String)direct == "r" && rightStop == LOW)
  {
    digitalWrite(magn, LOW);
    for (i=0; i<S; i++)
    {
      digitalWrite(dirpin1, LOW);              // Выбираем направление
      digitalWrite(steppin1, LOW);
      digitalWrite(steppin1, HIGH);
      delay(V); 
    }
    digitalWrite(magn, HIGH);
  }
Главный вопрос, как правильно настроить VISA Configure serial port, в частности правильно прописать termination character. В обилие интернет информации при работе с ардуино редко где встречал в VISA Configure serial port выставление termination character, однако надежность моей программы без этого вызывает сомнение - во многих местах приходится ставить VISA Clear.

В коде описан процесс обмена на стороне ардуино. Сначала здесь: символ конца строки оставил стандарт для LabVIEW (\n). На форуме ардуино говорят, что это критичный момент и лучше использовать для закрытия пакета \0. Если конец \n, то в LabVIEW termination character будет 10, если \0 - то 0. Верно? Символ окончания строки говорит о конце пакета передачи, а для чего нужен символ возврата каретки и нужно ли его вообще использовать?
Например возьмем в коде
char direct[3];
direct[0] = '\n';
здесь у меня предусмотрена передача до 2х символов (например "r" или "sb") и + "\n". Т.е. в пакете максимум 3 символа. Этого достаточно для правильного формирования пакета?

Также хотел бы услышать мнение знающих Си о функции
sscanf(buffer, "%[^','],%[^','],%[^',']", &direct, &st, &sp);
прочитал, что функция довольно тяжелая, но проще описать комплект команд я не смог. Насколько это может быть критично?

Думаю для начала достаточно. Вопросы еще будут. Очень прошу помочь.
С уважением, Александр.
С уважением, Александр.
Formica
beginner
beginner
Сообщения: 27
Зарегистрирован: 01 фев 2013, 13:10
Версия LabVIEW: 11
Контактная информация:

Re: Обмен данных ПК-ARDUINO с помощью VISA

Сообщение Formica »

в ардуино есть serial monitor(ctrl+shift+M) - скетч там правильно работает?
сложно читать парсинг строки не видя что должно передоваться.
если St и sp в пределах 0-255, то используйте команду из 3 символов - [direct][st][sp].
sscanf(buffer, "%[^','],%[^','],%[^',']", &direct, &st, &sp); // Разбираем его на части отделенные запятой
передавайте команду через пробел, тогда sscanf(buffer, "%s%d%d", direct, &S, &V), S V - числа.
от "тяжести" функции зависит скорость работы программы, если скорость критична - нужно будет оптимизировать алгоритм

termination character, как я понимаю, имеет значения для приема данных LV. у Вас в скетче нет отправки данных по serial.
roccosiffredi
junior
junior
Сообщения: 51
Зарегистрирован: 18 апр 2012, 13:51
Версия LabVIEW: 2011
Контактная информация:

Re: Обмен данных ПК-ARDUINO с помощью VISA

Сообщение roccosiffredi »

Ясно, для передачи данных из LV в ардуино termination character не нужен. Он отвечает только за прием на стороне LV, одно заблуждение развеяно.
Есть 2 признака:
при запуске программы некоторое время (порядка 10 секунд) ничего не происходит, возможно устанавливается соединение, и лишь по истечение этого времени программа начинает делать что предусмотрено;
второй признак - как раз сериал монитор - я отправляю команду "a,200,2", как собственно и из LV, а ответа нет. Но все-таки рано или поздно ответ приходит. Если отправить команду спустя ~10 секунд после запуска монитора, то ответ приходит.

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

// ПРОВЕРКА КАСАНИЯ
  if ((String)direct == "a")
  {    

    // ДАТЧИК КАСАНИЯ.
    if (dat == HIGH)                           // Контакт
    {
      Serial.print(1, DEC);  
      delay(100);    
    }
    else                                       // Нет контакта
    {
      Serial.print(2, DEC);
      delay(100);      
    }   
  }

  // ПРОВЕРКА ГОДНОСТИ ПО ТОКУ
  if ((String)direct == "sb")
  {    

    // СИГНАЛ БРАКА.
    if (sb == HIGH)                            // Брак
    {
      Serial.print(3, DEC);     
      delay(100); 
    }
    else                                       // Годный
    {
      Serial.print(4, DEC); 
      delay(100);     
    }   
  }
Вот пример ответа от ардуино.

Почему st или sp в пределах 0-255? st, как я понимаю, массив из 6 символов, и каждый символ в пределе 0-255.
С уважением, Александр.
Formica
beginner
beginner
Сообщения: 27
Зарегистрирован: 01 фев 2013, 13:10
Версия LabVIEW: 11
Контактная информация:

Re: Обмен данных ПК-ARDUINO с помощью VISA

Сообщение Formica »

roccosiffredi писал(а):Ясно, для передачи данных из LV в ардуино termination character не нужен. Он отвечает только за прием на стороне LV, одно заблуждение развеяно.
Есть 2 признака:
при запуске программы некоторое время (порядка 10 секунд) ничего не происходит, возможно устанавливается соединение, и лишь по истечение этого времени программа начинает делать что предусмотрено;
второй признак - как раз сериал монитор - я отправляю команду "a,200,2", как собственно и из LV, а ответа нет. Но все-таки рано или поздно ответ приходит. Если отправить команду спустя ~10 секунд после запуска монитора, то ответ приходит.

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

// ПРОВЕРКА КАСАНИЯ
  if ((String)direct == "a")
  {    

    // ДАТЧИК КАСАНИЯ.
    if (dat == HIGH)                           // Контакт
    {
      Serial.print(1, DEC);  
      delay(100);    
    }
    else                                       // Нет контакта
    {
      Serial.print(2, DEC);
      delay(100);      
    }   
  }

  // ПРОВЕРКА ГОДНОСТИ ПО ТОКУ
  if ((String)direct == "sb")
  {    

    // СИГНАЛ БРАКА.
    if (sb == HIGH)                            // Брак
    {
      Serial.print(3, DEC);     
      delay(100); 
    }
    else                                       // Годный
    {
      Serial.print(4, DEC); 
      delay(100);     
    }   
  }
Вот пример ответа от ардуино.

Почему st или sp в пределах 0-255? st, как я понимаю, массив из 6 символов, и каждый символ в пределе 0-255.
1. delay тут не нужны
2. serial monitor сам по себе не тормозит. это значит тормоза в программе.
добавтьте строки serial.println('step1'); 2 и тд после циклов и сомнительных команд. и в функции Setup()
откройте serial monitor, нажмите кнопку рестарт на плате. сразу станет понятно где задержки.
roccosiffredi
junior
junior
Сообщения: 51
Зарегистрирован: 18 апр 2012, 13:51
Версия LabVIEW: 2011
Контактная информация:

Re: Обмен данных ПК-ARDUINO с помощью VISA

Сообщение roccosiffredi »

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

//ДШИ 1 ГОРИЗОНТАЛЬ////////////////////////
int dirpin1 = 10;
int steppin1 = 11;
int leftPin1 = 67;
int rightPin1 = 68;
int Stop1 = 54;
int Stop2 = 55;

//ДШИ 2 ВЕРТИКАЛЬ////////////////////////
int dirpin2 = 12;
int steppin2 = 13;
int downPin2 = 66;
int upPin2 = 65;
int Stop3 = 56;
int Stop4 = 57;

int speedPin1 = 63;           // pin1 скорости
int speedPin2 = 64;           // pin2 скорости
int datch = 9;                // pin касания
int magn = 53;                // pin столика
int stol = 69;                // pin кнопки стола
int diod = 62;                // pin диод касания

int rele = 52;                // pin реле
int brak1 = 50;               // pin брака1 по току
int brak2 = 51;               // pin брака2 по току
int signbrak1 = 48;           // pin1 сигнала брака по току
int signbrak2 = 49;           // pin2 сигнала брака по току

int rstate, lstate, ustate, dstate = 0;

int i, a, b, c, d, e, spPin1, spPin2, rval, lval, rightStop, leftStop, uval, dval, upStop, downStop, S, V, dat, sto, sstate, sb;

char direct[3];      //3
char st[6];          //6
char sp[2];          //2
char buffer[12];     //12


void setup() 
{
  Serial.begin(9600);
  Serial.println("step1setup");
  delay(1000);
step1setup приходит спустя 10 секунд. В остальном задержек не заметил.
С уважением, Александр.
roccosiffredi
junior
junior
Сообщения: 51
Зарегистрирован: 18 апр 2012, 13:51
Версия LabVIEW: 2011
Контактная информация:

Re: Обмен данных ПК-ARDUINO с помощью VISA

Сообщение roccosiffredi »

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

void setup() 
{
  Serial.begin(115200);

  Serial.println("step1");
  delay(1000);
}

void loop()
{
  Serial.println("step2");
  delay(1000);
}
Записал элементарный код, попробовал изменить номер порта, переставить драйвер для ардуино. Задержка так и преследует.
Причем сам код начинает работать сразу (на кнопки механическая реакция возникает сразу после загрузки скетча), проблема только с отправкой сообщений.
С чем может быть связано?
С уважением, Александр.
Formica
beginner
beginner
Сообщения: 27
Зарегистрирован: 01 фев 2013, 13:10
Версия LabVIEW: 11
Контактная информация:

Re: Обмен данных ПК-ARDUINO с помощью VISA

Сообщение Formica »

roccosiffredi писал(а): step1setup приходит спустя 10 секунд. В остальном задержек не заметил.
у меня приходит через 2-3 секунды после рестарта.
если остальные сообщения не тормозят, возможно скорость установки соединения зависит от используемой платы.
roccosiffredi
junior
junior
Сообщения: 51
Зарегистрирован: 18 апр 2012, 13:51
Версия LabVIEW: 2011
Контактная информация:

Re: Обмен данных ПК-ARDUINO с помощью VISA

Сообщение roccosiffredi »

Сейчас проверил: через ардуино уно задержка почти отсутствует. В работе использую мега2560. Её мне посоветовали приобрести после неудачной работы дуе. Сдается от этого не избавиться. Плохо, выход вижу один - 10 секундная задержка после VISA Configure serial port.
С уважением, Александр.
roccosiffredi
junior
junior
Сообщения: 51
Зарегистрирован: 18 апр 2012, 13:51
Версия LabVIEW: 2011
Контактная информация:

Re: Обмен данных ПК-ARDUINO с помощью VISA

Сообщение roccosiffredi »

При открытии монитора задержка присутствует, но при нажатии резет в это время сообщения приходят сразу. Возможно ли программно резетить?
С уважением, Александр.
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5463
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 87 раз

Re: Обмен данных ПК-ARDUINO с помощью VISA

Сообщение IvanLis »

roccosiffredi писал(а):Возможно ли программно резетить?
http://arduino.ru/forum/programmirovani ... mnyi-reset
roccosiffredi
junior
junior
Сообщения: 51
Зарегистрирован: 18 апр 2012, 13:51
Версия LabVIEW: 2011
Контактная информация:

Re: Обмен данных ПК-ARDUINO с помощью VISA

Сообщение roccosiffredi »

Я эту функцию пробовал. Правда где бы я ее не устанавливал сообщения либо не приходили, либо приходили не раньше 10 секунд.
С уважением, Александр.
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5463
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 87 раз

Re: Обмен данных ПК-ARDUINO с помощью VISA

Сообщение IvanLis »

roccosiffredi писал(а):Записал элементарный код, попробовал изменить номер порта, переставить драйвер для ардуино. Задержка так и преследует.
Причем сам код начинает работать сразу (на кнопки механическая реакция возникает сразу после загрузки скетча), проблема только с отправкой сообщений.
С чем может быть связано?
Я Arduino MEGA не программировал.
Но на ней четыре аппаратных порта, а у UNO всего один.
К ним по идее по номеру нужно обращаться: http://arduino.cc/en/Serial/Begin
Так что ройте в эту сторону.
roccosiffredi
junior
junior
Сообщения: 51
Зарегистрирован: 18 апр 2012, 13:51
Версия LabVIEW: 2011
Контактная информация:

Re: Обмен данных ПК-ARDUINO с помощью VISA

Сообщение roccosiffredi »

Насколько я понимаю для использования этих портов необходимы адаптеры USB-to-serial.
Причина такой длительной задержки оказалась в ПК - при смене ПК сообщения начали приходить мгновенно. Пробовал удалить драйверы в диспетчере и после перезагрузки заново ставить и IDE и драйверы.
Вообще все идет к смене либо компьютера, который вроде бы не плох, но я с ним уже порядком намучался, либо к переустановке системы, которую ставил сюда уже много раз. Может быть проблема в драйвере usb?
Заодно хотел бы спросить о надежности версии LabVIEW11 и VISA 5.2. Может удачнее будет использовать более ранние?
С уважением, Александр.
Formica
beginner
beginner
Сообщения: 27
Зарегистрирован: 01 фев 2013, 13:10
Версия LabVIEW: 11
Контактная информация:

Re: Обмен данных ПК-ARDUINO с помощью VISA

Сообщение Formica »

roccosiffredi писал(а):Насколько я понимаю для использования этих портов необходимы адаптеры USB-to-serial.
Причина такой длительной задержки оказалась в ПК - при смене ПК сообщения начали приходить мгновенно. Пробовал удалить драйверы в диспетчере и после перезагрузки заново ставить и IDE и драйверы.
Вообще все идет к смене либо компьютера, который вроде бы не плох, но я с ним уже порядком намучался, либо к переустановке системы, которую ставил сюда уже много раз. Может быть проблема в драйвере usb?
Заодно хотел бы спросить о надежности версии LabVIEW11 и VISA 5.2. Может удачнее будет использовать более ранние?
в диспетчере устройств можно посмотреть настройки СОМ порта, а также драйверы.
сравните настройки для 2 компьютеров.
насторойки для usb-com отличаются от обычных com(advanced кнопка)
roccosiffredi
junior
junior
Сообщения: 51
Зарегистрирован: 18 апр 2012, 13:51
Версия LabVIEW: 2011
Контактная информация:

Re: Обмен данных ПК-ARDUINO с помощью VISA

Сообщение roccosiffredi »

Добрый день, проблема с SerialMonitor решилась сменой компьютера. На новом материнская плата без rs232, возможно в этом было дело. Глубже не копал. Проблему отсутствия rs232 решил покупкой адаптера com-usb.
Одна проблема решилась, другая осталась - теперь виснет VISA Read на первой итерации. Выдает ошибку 1073807339. Связана вроде с тайм-аутом, его я пробовал менять в пределах 1000-100000 мс. До 4000 мс ошибка на всех итерациях, после - только на первой.

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

int datch = 9;                // pin касания

int dat, S, V;

char direct[3];      //3
char st[6];          //6
char sp[2];          //2
char buffer[12];     //12

void setup() 
{
  Serial.begin(9600);
  pinMode(datch, INPUT);
}

void loop()
{
  int k = 0; 
  dat = digitalRead(datch);                    // Переменная датчика касания
  digitalWrite(datch, HIGH);                   // Запуск обратной логики касания

  direct[0] = '\0';
  st[0] = '\0';
  sp[0] = '\0';

  while(Serial.available() > 0)                // Загоняем прочитанное в буфер
  {       
    buffer[k] = Serial.read();
    k++;
    delay(2);
  }
  buffer[k++] = '\0';                          // Закрываем массив

  if(k>0)                                      // Если буфер наполнен
  {       
    sscanf(buffer, "%[^','],%[^','],%[^',']", &direct, &st, &sp);      // Разбираем его на части отделенные запятой 
  }

  S = String(st).toInt();
  V = String(sp).toInt();

  // ПРОВЕРКА КАСАНИЯ
  if ((String)direct == "a")
  {    

    // ДАТЧИК КАСАНИЯ.
    if (dat == HIGH)                           // Контакт
    {
      Serial.print(1, DEC);
    }
    else                                       // Нет контакта
    {
      Serial.print(2, DEC);
    }   
  }
}
Изображение

В коде пробовал функцию Serial.println, которая автоматически добавляет в конце сообщения \n, но это приводило к отсутствию данных в некоторых операциях на приеме в VISA Read.
С уважением, Александр.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Коммуникация с приборами»