прием передача данных 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 для исключения проблемы в железе все работает выходит что ошибочка в скетче