Чтение данных из arduino в labview быстро, но получение нулей

Я пытаюсь прочитать некоторые данные из labview (это целые числа, разделенные запятой), однако, когда я ставлю ожидание в цикле while со временем менее 100 мс, индикаторы продолжают мигать, и я получаю ceros.введите изображение  описание здесь

Это мой код ардуино:

#include <OneWire.h>
#include <DallasTemperature.h>
#define Pin 2 
int ecg = 0;
OneWire ourWire(Pin); 
DallasTemperature sensors(&ourWire);
{
delay(1000);
Serial.begin(9600);
sensors.begin(); 
}
void loop()
{
  int corazon= analogRead(0);
sensors.requestTemperatures();
Serial.print(sensors.getTempCByIndex(0)); 
Serial.print(",");
Serial.println(corazon);
delay(1);
}

person Diana Laura    schedule 26.04.2017    source источник


Ответы (1)


Во-первых, у вас есть два параллельных цикла, и в каждом цикле вы читаете данные с одного и того же последовательного порта. Чтение данных из порта удаляет их из буфера последовательного ввода, поэтому каждый символ, поступающий в буфер, будет считываться только одним или другим циклом, а не обоими. Между циклами нет никакой синхронизации, поэтому будет случайным, какой персонаж куда пойдет. Каждый цикл большую часть времени будет считывать неполное сообщение, поэтому ваш код не сможет декодировать его в число, поэтому он возвращает ноль.

Во-вторых, как объясняется в мом ответе на ваш последний вопрос, не t используйте Bytes at Port, используйте настройку символа завершения чтения при настройке порта. Таким образом, каждый Serial Read будет возвращать одно полное сообщение. Если вы сделаете это, вам не понадобится функция ожидания в цикле — она будет работать настолько быстро, насколько это необходимо, чтобы не отставать от входящих данных.

Здесь здесь говорится, что Serial.println отправляет возврат каретки, а затем новую строку в конце данных. , поэтому вы хотите использовать новую строку (десятичное число 10) в качестве символа завершения. В любом случае это значение по умолчанию, поэтому, как только вы удалите повторяющийся цикл и Bytes at Port, он, вероятно, начнет работать.

В вашем примере кода я не вижу причин для двух параллельных циклов, но если вам действительно нужно сделать данные из Arduino доступными в двух разных циклах в LabVIEW, используйте метод связи, такой как очередь или уведомитель, чтобы передать его от одного к другому. В LabVIEW есть примеры и помощь по ним.

Кстати, первые два кадра структуры последовательности в вашем цикле не нужны - код все равно будет выполняться в этой последовательности из-за потока данных.

person nekomatic    schedule 26.04.2017
comment
Большое спасибо, как только я удалил байты в порту, он начал работать, и извините, я все еще учусь. - person Diana Laura; 19.05.2017