прием передача данных SerialSoftware
- Войдите на сайт для отправки комментариев
Вс, 05/02/2017 - 15:27
Добрый день помогите найти ошибку в сктче, имеются две ардуино из одной данные перекидываются на другую по 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 для исключения проблемы в железе все работает выходит что ошибочка в скетче