Arduino mega 2560 и RS485

echech
Offline
Зарегистрирован: 28.11.2014

Добрый день!

Помогите разобраться что не так...

Есть счетчик гейгера, работает через rs485. Купил модуль ttl to rs485 "C25B" и хочу на arduino mega получать данные с этого счетчика. Вот как я это подключил:А вот скетч:

#define SerialTxControl 10   //RS485 управляющий контакт на arduino pin 10
#define RS485Transmit    HIGH
#define RS485Receive     LOW
char bufferss[100];
byte numbers[] = {85, 170, 03};
void setup(void) {
  Serial.begin(9600);
  Serial1.begin(9600);
  pinMode(SerialTxControl, OUTPUT);
  pinMode(13, OUTPUT);
}
void loop(void) {
  
  digitalWrite(SerialTxControl, RS485Transmit);
  delay(100);
  for (int i = 0; i < 3; i++){
    Serial1.write(byte(numbers[i]));
  }
  digitalWrite(13, HIGH);
  delay(100);
  digitalWrite(13, LOW);
  digitalWrite(SerialTxControl, RS485Receive);  // читаем данные с порта
 
   
    int i = 0;
  if (Serial1.available()) {
    Serial.println("Serial1.available");
    //delay(700);
    while ( Serial1.available() && i < 99)
    {
      bufferss[i++] = Serial1.read();
    }
    bufferss[i++] = '\0';
  }
  delay(200);
  if (i > 0) {
    Serial.write(bufferss); // Выводим что приняли с других устройств
  }
  delay(1000);
 
}
 
Второй день борюсь с этим, помогите пожалуйста!
 
echech
Offline
Зарегистрирован: 28.11.2014
#define SerialTxControl 10   //RS485 управляющий контакт на arduino pin 10
#define RS485Transmit    HIGH
#define RS485Receive     LOW
char bufferss[100];
byte numbers[] = {85, 170, 03};
void setup(void) {
  Serial.begin(9600);
  Serial1.begin(9600);
  pinMode(SerialTxControl, OUTPUT);
  pinMode(13, OUTPUT);
}
void loop(void) {
  
  digitalWrite(SerialTxControl, RS485Transmit);
  delay(100);
  for (int i = 0; i < 3; i++){
    Serial1.write(byte(numbers[i]));
  }
  digitalWrite(13, HIGH);
  delay(100);
  digitalWrite(13, LOW);
  digitalWrite(SerialTxControl, RS485Receive);  // читаем данные с порта
 
   
    int i = 0;
  if (Serial1.available()) {
    Serial.println("Serial1.available");
    //delay(700);
    while ( Serial1.available() && i < 99)
    {
      bufferss[i++] = Serial1.read();
    }
    bufferss[i++] = '\0';
  }
  delay(200);
  if (i > 0) {
    Serial.write(bufferss); // Выводим что приняли с других устройств
  }
  delay(1000);
 
}

Сорри)

 

 

Ранее писал прогу(виндовс форм), для этого же счетчика  и знаю что отправлять нужно 3 байта а в ответ должно приходить 10. В данном случае ничего не приходит...

А сейчас хочется сделать так, чтобы ответ от счетчика отображать на дисплее.

echech
Offline
Зарегистрирован: 28.11.2014

Может я что-то не так объяснил? ответьте плз!

 

Radjah
Offline
Зарегистрирован: 06.08.2014

Сказал "пиши", так не жди, а диктуй. Продиктовал, сразу говори, чтобы слушал. За 0,1 секунды можно дохрена чего сделать.

Каст в 17 строке нахрен не нужен.

echech
Offline
Зарегистрирован: 28.11.2014

Спасибо! Завтра буду пробовать

echech
Offline
Зарегистрирован: 28.11.2014

Добрый день!

Вот осциллограмма сигнала:

Вот скетч:

#define SerialTxControl 10   //RS485 управляющий контакт на arduino pin 10
#define RS485Transmit    HIGH
#define RS485Receive     LOW
char bufferss[100];
byte numbers[] = {85, 170, 03};
void setup(void) {
  Serial.begin(19200);
  Serial1.begin(19200);
  pinMode(SerialTxControl, OUTPUT);
}
void loop(void) {
  
  digitalWrite(SerialTxControl, RS485Transmit);
  delay(2);
  for (int i = 0; i < 3; i++){
    Serial1.write(numbers[i]);
  }
  delay(2);
  digitalWrite(SerialTxControl, RS485Receive);  // читаем данные с порта
  
    int i = 0;
    
  if (Serial1.available()) {
    while ( Serial1.available() && i < 99)
    {
      bufferss[i++] = Serial1.read();
    }
    bufferss[i++] = '\0';
  }
  //delay(200);
  if (i > 0) {
    Serial.write(bufferss); // Выводим что приняли с других устройств
  }
  delay(500);
 
}
 

На осциллографе (слева) видно мой запрос, а справа ответ от датчика. В дуне не срабатывает Serial1.available..  я так понимаю, что проблема в уровне сигналов?

 

echech
Offline
Зарегистрирован: 28.11.2014

Теперь принимаю только 4 байта... добился этого за счет delay(3);. Но мне надо  10 байт)

echech
Offline
Зарегистрирован: 28.11.2014

Понял в чем проблема!

На дуню я должен получать "55 AA 13 49 00 00 00 0B 00 67" - 10 байт (протестил через usb to rs485)

А получаю я строку такого вида "55 AA 13 49 0B 67" - 6 байт.... В скетче пропадают "00"


55 AA 13 49 00 00 00 0B 00 67

Как в скетче учитывать "00"? 

Radjah
Offline
Зарегистрирован: 06.08.2014

0x00 - это конец строки. Делай Serial.print в HEX сразу после получения.

echech
Offline
Зарегистрирован: 28.11.2014

Так эти строки могу иметь значение, если я буду так делать, то я буду разрывать пакет данных.

Или я что-то не так понял?

Radjah
Offline
Зарегистрирован: 06.08.2014

Есть мнение, что Serial1.available() не реагирует на 0x00.

echech
Offline
Зарегистрирован: 28.11.2014

Спасибо!) Я разобрался. Помог Serial.readString(), он считал всю строку