Проблема получения данных с серийного порта Arduino

Тема в разделе "Arduino & Shields", создана пользователем jkeeeng, 1 сен 2013.

  1. jkeeeng

    jkeeeng Нуб

    Доброго время суток!

    Работаю над небольшим проектом мониторинга состояний окружающей среды... Он состоит из 4-х Ардуин, 3 из которых занимаются сбором данных с различных сенсоров и по запросу передают по серийному порту на 4-ую Ардуину. Данные с сенсоров по серийному идут в формате состоящем из 2-4 чисел (в зависимости от датчика). Например "1234" без лишних запятых, букв и тд. Идут они раздельно с интерввалом в 5 секунд. Задача состоит в том чтоб считать эти данные также раздельно и целиком а не по-битно... Т.к. данные я получаю, но лишь один бит из нескольких в формате ASCII. Я перерыл весь интернет, перепробывал кучу всяких кодов, но все никак...может кто-то сталкивался или может помоч?
    Заранее благодарен!

    Вот пример кода:

    Serial.write('R'); //запрашиваем данные с датчика дождя
    if(Serial.available() > 0)
    {
    rain = Serial.read(); //считываем данные
    delay(50);
    lcd.setCursor(-4, 2); //выводим на дисплей
    lcd.print("Rain: ");
    lcd.print(rain);
    lcd.print(" ");
    delay(50);
    dataString += "\nrain,"; //отслылаем на сервер Pachube.com
    dataString += rain;
    }
    delay(2000);


    З.Ы. Данные с датчиков приходят в нормальном виде, но не распознаются правильно уже самой Ардуиной. Проверено используя Tera Term терминал напрямую к серийному порту 4-ой Ардуины...
     
  2. Unixon

    Unixon Оракул Модератор

    Этот код считывает один байт (символ) и тут же его показывает, не дожидаясь, пока прибудет остальная часть передаваемой строки. Что написали - то и получили, все верно работает.
     
  3. Megakoteyka

    Megakoteyka Оракул Модератор

    Если совсем в лоб, то так:
    Код (C):
    Serial.write('R');   //запрашиваем данные с датчика дождя
    if(Serial.available() >= 4)
    {
        // считываем 4 байта
    }
    Но если по дороге пропадет хотя бы один байт - вся система развалится и перестанет корректно работать. Чтобы этого не произошло, используйте протокол пакетной передачи - он всегда отличит начало очередного пакета и скажет, если пакет пришел битым.