Arduino mega 2560 и RS485
- Войдите на сайт для отправки комментариев
Ср, 29/07/2015 - 12:03
Добрый день!
Помогите разобраться что не так...
Есть счетчик гейгера, работает через 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);
}
Второй день борюсь с этим, помогите пожалуйста!
#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. В данном случае ничего не приходит...
А сейчас хочется сделать так, чтобы ответ от счетчика отображать на дисплее.
Может я что-то не так объяснил? ответьте плз!
Сказал "пиши", так не жди, а диктуй. Продиктовал, сразу говори, чтобы слушал. За 0,1 секунды можно дохрена чего сделать.
Каст в 17 строке нахрен не нужен.
Спасибо! Завтра буду пробовать
Добрый день!
Вот осциллограмма сигнала:
Вот скетч:
#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.. я так понимаю, что проблема в уровне сигналов?
Теперь принимаю только 4 байта... добился этого за счет delay(3);. Но мне надо 10 байт)
Понял в чем проблема!
На дуню я должен получать "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"?
0x00 - это конец строки. Делай Serial.print в HEX сразу после получения.
Так эти строки могу иметь значение, если я буду так делать, то я буду разрывать пакет данных.
Или я что-то не так понял?
Есть мнение, что Serial1.available() не реагирует на 0x00.
Спасибо!) Я разобрался. Помог Serial.readString(), он считал всю строку