прием передача данных SerialSoftware

Нет ответов
Anton_Kos87
Offline
Зарегистрирован: 07.03.2014

Добрый день помогите найти ошибку в сктче, имеются две ардуино из одной данные перекидываются на другую по max485 не могу найти ошибку в прием/передаче данных

 

Сервер:


#include <string.h>
#include <SoftwareSerial.h>

#define SSerialRX        5  //Serial Receive pin
#define SSerialTX        4  //Serial Transmit pin
#define SSerialTxControl 3   // RS485 Direction control
#define RS485Transmit    HIGH
#define RS485Receive     LOW
#define Pin13LED         13
SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX

// Обновляемые данные с контроллера насоса - по умолчанию 0, не изменять
char UnitID[10];
char Parameters[200];
char Command[10];

int ID00Temperature = 0; // Температура от устройства D00
int ID00Humidity = 0; // Влажность от устройства D00
int ID00Pressure = 0; // Давление от устройства D00
int ID00Altitude = 0; // Высота от устройства D00
int ID00Voltage = 0; // Напряжение от устройства D00

long previousMillis = 0;        // храним время последнего запроса данных
long interval = 2000;           // интервал между запросами (1000=1 секунда)


void setup()
{    
    // устанавливаем пины на входы|выходы
    pinMode(Pin13LED, OUTPUT);   
    pinMode(SSerialTxControl, OUTPUT); 

    Serial.begin(9600);
    Serial.println("Server Started RS485.");
    
    RS485Serial.begin(9600);
    Serial.println("Server Online.");
}

void setDataRS485(String command)
{
    digitalWrite(Pin13LED, HIGH);  // включаем светодиод пока данные передаются
    digitalWrite(SSerialTxControl, RS485Transmit); // Включение на передачу RS485
    RS485Serial.print(command + "\r\n");
    digitalWrite(Pin13LED, LOW);  // выключаем светодиод данные переданы
}

// Прием и применение данных
void getAndCommitDataRS485()
{
    digitalWrite(Pin13LED, HIGH);  // включаем светодиод пока данные принимаются
    digitalWrite(SSerialTxControl, RS485Receive); // Включение на прием RS485

    int i = 0; 
    char buffer[100];
    
   Serial.print(buffer); // Выводим что приняли с других устройств
   Serial.print("\0"); // Выводим что приняли с других устройств     
   
    if(RS485Serial.available())  //если есть данные - читаем
    {
        delay(100);
        //загоняем прочитанное в буфер
        while( RS485Serial.available() && i < 99) 
        { 
            buffer[i++] = RS485Serial.read();
        } 
        
        buffer[i++] = '\0';     //закрываем массив
    }
    
    if(i > 0)  //если буфер наполнен
    {
        Serial.print(buffer); // Выводим что приняли с других устройств в монитор порта
        Serial.print("\r\n");

        sscanf(buffer, "%s%s%s", &UnitID, &Command, &Parameters);  // Разбираем принятую строку на части (Адрес устройства - команда - параметры)
    }
    //--------------данные уже получили - теперь разбор------------------------//

    //Проверяем какому устройству пришли данные

    
    // если пришел ответ от "ID00 Data xx:xx:xx:xx:xx:"
    if((String)UnitID == "ID00" && (String)Command == "Data")
    {        
        //разбираем строку по знаку ":"
        String Str = String((String)Parameters);
        Str.toCharArray(buffer, 24);

        // http://arduino.ru/forum/programmirovanie/zapis-dannykh-s-datchika-dht11-...

        // Заносим параметры в свойства текущего контроллера для последующего отображения в веб
        D00Temperature = atoi(strtok(buffer,":"));
        Serial.print("ID00 Temperature: " + String(ID00Temperature) + "\n");
        
        D00Humidity = atoi(strtok(NULL,":"));
        Serial.print("ID00 Humidity: " + String(ID00Humidity) + "\n");
        
        D00Pressure = atoi(strtok(NULL,":"));
        Serial.print("ID00 Pressure: " + String(ID00Pressure) + "\n");
        
        D00Altitude = atoi(strtok(NULL,":"));
        Serial.print("ID00 Altitude: " + String(ID00Altitude) + "\n");
        
        D00Voltage = atoi(strtok(NULL,":"));
        Serial.print("ID00 Voltage: " + String(ID00Voltage) + "\n");
        
    }

    //обнуляем буферы данных
    UnitID [0] = '\0';
    Command [0] = '\0';
    Parameters [0] = '\0';
   
    digitalWrite(Pin13LED, LOW);  // выключаем светодиод данные приняты
}

void loop()
{
unsigned long currentMillis = millis();
  
  //проверяем не прошел ли нужный интервал, если прошел то
  if(currentMillis - previousMillis > interval) {
    
      previousMillis = currentMillis; // сохраняем время последнего переключения

      setDataRS485("ID00 SendData"); // Получить текущие значения состояний и датчиков
      Serial.println("ID00 SendData Zapros");
        delay(10);

        }
 // Смотрим ответ от устройств удаленных
        getAndCommitDataRS485();

        delay(100);    
}

в сериале почему то получаю твердые знаки в буфере

и клиент:

// Подключаем VCC на BMP085 к 3.3V (NOT 5.0V!)
// Подключаем GND к земле
// Подключаем SCL к i2c clock - А5
// Подключаем SDA к i2c data - А4

#include <SoftwareSerial.h>
#include <Wire.h>
//#include <BMP085.h>

#define SSerialRX        5  //Serial Receive pin
#define SSerialTX        4  //Serial Transmit pin
#define SSerialTxControl 3   //RS485 Direction control
#define RS485Transmit    HIGH
#define RS485Receive     LOW
#define Pin13LED         13
SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX

//BMP085 dps = BMP085(); 

int byteReceived;
int byteSend;

char UnitID[10];
char Parameters[200];
char Command[10];
char buffer[100];

long Temperature = 11, Pressure = 22, Altitude = 33;
int Humidity = 55;  // пока датчик не установлен кидаем присваиваем переменной 68 процентов влажности
int VoltageSensorValue = 44;  
float Voltage = 0; 

              //----- высчитывание напряжения питания -----//
const int VoltageSensorPin = A0; // Pin А0 для контроля напряжения
const float voltPerUnit = 0.004883;                 // 5V/1024 значений = 0,004883 В/значение

                   //----- "расчёт делителя" -----//
const float R1 = 2;                                 //R1 подключено к + сопротивление 2кОм
const float R2 = 1;                                 //R2 подключено к - сопротивление 1кОм
const float dividerRatio = (R1+R2)/R2;              //коэффициент для расчёта напряжения на входе делителя
const float voltRatio = voltPerUnit * dividerRatio; //коэффициент перевода измерений в напряжение
//---------------------------------------------------------

void setup(void) {
  Serial.begin(9600);
  Serial.println("ID00 Started serial.");
  //dps.init(MODE_STANDARD, 3200, true);  // Инициализация BMP180 с корректировкой высоты
  //dps.init();                           // Инициализация BMP180
  //Serial.println("ID00 Started BMP180.");
    digitalWrite(SSerialTxControl, RS485Receive); //Включение на прием RS485
    RS485Serial.begin(9600);                      // Скорость работы RS485
    Serial.println("ID00 Started RS485.");
    Serial.println("ID00 Online.");
}         
 
void getData485()
{
 int i = 0;
    if (RS485Serial.available()) // Если появились какие либо данные в RS485
    {        
      delay(100);
            while(RS485Serial.available() && i < 99) 
            { 
                buffer[i++] = RS485Serial.read();
            } 
           
            buffer[i++] = '\0';  //закрываем массив

            Serial.print(buffer); // Выводим что приняли с других устройств
            Serial.print("\0"); // Выводим что приняли с других устройств

       
        if(i > 0) //если буфер наполнен
        {
            Serial.print(buffer); // Выводим что приняли 
            Serial.print("\0"); // Выводим что приняли 
           
            
            sscanf(buffer, "%s%s", &UnitID, &Command); //разберем его на части отделенные запятой
        }
        
       //--------------данные уже получили - теперь разбор------------------------//

        if((String)UnitID == "ID00" && (String)Command == "SendData") //если ID00 - отдаем строкой все значения датчиков
        {
            digitalWrite(Pin13LED, LOW);  // включаем светодиод пока данные принимаются
            digitalWrite(SSerialTxControl, RS485Transmit); //включаем передачу
          
            //формируем строку с данными для ответа
            String im = "ID00 Data "                       
                      + String(Temperature*0.1) + ":"      // температуру множим на 0.1 для точности AA - темпиратура улицы (int) {+\- ХХ цельсия}
                      + String(Humidity) + ":"             // ВВ - Влажность улицы
                      + String(Pressure/133.3) + ":"       //давление сенсора переводим м мм.рт.ст /133,3 ССC.C - Давление мм.ртутного столба улицы 
                      + String(Altitude/100.0, 2) + ":"    // высчитываем высоту установки датчика в метрах DD - Высота устаноки датчика
                      + String(Voltage) + ":";             // напряжение питания контроллера ЕЕ.E - Напряжение питания контроллера    
 
            //передаем данные
            RS485Serial.println(im);
            Serial.println(im);                             // Выводим что передали данные в RS485  
            
            digitalWrite(SSerialTxControl, RS485Receive);   //Включаемся на прием
            digitalWrite(Pin13LED, HIGH);  // включаем светодиод пока данные принимаются
           
            //обнуляем буферы данных
            UnitID [0] = '\0';
            Command [0] = '\0';
            Parameters [0] = '\0';
        }
        else
        {
            //обнуляем буферы данных
         //   UnitID [0] = '\0';
           // Command [0] = '\0';
            //Parameters [0] = '\0';
            RS485Serial.flush();
            //это не ко мне обращаются идем дальше
          Serial.print(buffer);
         //   dataSending = 0; //восстанавливаем все процессы
        }

        //если вдруг произошёл обрыв связи
       Serial.print(buffer);
       // dataSending = 0; //восстанавливаем все процессы
        digitalWrite(Pin13LED, LOW);  // отключаем светодиод - данные не принимаются
  
    }
}

void loop(void) {
 // шаг 1 грузим показания с датчика BMP180
//  dps.getPressure(&Pressure);
//  dps.getTemperature(&Temperature);
//  dps.getAltitude(&Altitude); 
 
 // шаг 2 считываем с А0 напряжение и конвертируем его
   VoltageSensorValue = analogRead(VoltageSensorPin); 
 // рассчитаем в человеко-понятных вольтах  
   Voltage = VoltageSensorValue * voltRatio;  
 
 // шаг 3 смотрим что в сериале нет ли для нас команд
  getData485(); 
  delay(500);
   
}

в сериале получаю яяяяяюяюяюшшш

роверял различные другие скетчи с использованием SoftwareSerial для исключения проблемы в железе все работает выходит что ошибочка в скетче