Вот. 010300000002C410 теперь рассписываю 01. Адрес устройства. 03. Функция чтения 0000. Начальный адрес регистра 0002. Количество регистров,которое нужно считать Нужно считать 2 регистра, так как формат данных флоат С410. Контрольная сумма При пересылке учти ,что есть 8 байт данных в 16 ричном виде.
03 чтение аналогового вывода. 04 чтение аналогового ввода Это так трактуется в описании протокола. Я в своей практике применял и ту и другую функцию. Разницы не заметил. Что так,что этак регистр вытягивается.
И ещё. По опыту своему скажу. Все дешёвые адаптеры мне доверия не внушают. В ответственных проектах применяю промышленные. Например фирмы Овен АС4. с гальванической развязкой и автоматическим ре жимом, где не требуется сигнал приём/передача. Для своих личных нужд сделал его аналог,но без гальванической развязки. Вот его схема.
Да. Но ты должен быть убеждён в том,что твой термометр сконфигурирован именно на эту скорость. И ещё обрати внимание на количество контрольных бит. Обычно 1. Но некоторые производители делают 2. Потом невнимательные пользователи неделями голову ламают Почему прибор не отвечает?
Да, в паспорте указана именно скорость 57600. А про количество контрольных бит где прописывается в кодовой посылке?
что-то данные приходят все по 255.... вот скетч.... посмотрите пожалуйста.... видимо что-то не так делаю... Код (C++): byte data_in[8],data_out[8]; byte i; void setup() { Serial.begin(9600); Serial1.begin(57600); data_in[0] = 01; data_in[1] = 03; data_in[2] = 00; data_in[3] = 00; data_in[4] = 00; data_in[5] = 02; data_in[6] = 196; data_in[7] = 16; pinMode(9, OUTPUT); } void loop() { digitalWrite(9, HIGH); // Режим передачи данных for(i=0; i<8; i++) { Serial1.print(data_in[i]); } digitalWrite(9, LOW); // Режим чтения данных delay(500); for(i=0; i<8; i++) { data_out[i] = Serial1.read(); } for(i=0; i<8; i++) { Serial.print(data_out[i]); Serial.print(" "); } Serial.println(); delay(10000); }
Сейчас переговорил с изготовителем. Они подтвердили, что обязательно нужен CRC код. А так же по поводу контрольного бита : используется стандартно 8N1.
int incomingByte = 0; // для данных, приходящих через последовательный порт void setup() { Serial.begin(9600); // открывает последовательный порт,по умолчанию 8N1 } void loop() { // Отправляем данные, только если получили данные: if (Serial.available() > 0) { // Считываем входящий байт: incomingByte = Serial.read(); // Отображаем на Serial Monitor то, что получили: Serial.print("ОТВЕТ ТЕРМОМЕТРА"); Serial.println(incomingByte, HEX); } } Команду на термометр посылай так byte a[]={0x00,0x00,0x00,0x00}; тут запишешь команду и вставишь куда надо, я же не знаю от кнопки Serial.write(a,8); ее будешь запускать или еще как.В сетапе не забудь модуль на прием поставить. После переключения на передачу сделай делей 2-3 милисекунды . В конце передачи вкл.прием На форууме буду часа через 4. Пробуй
1) Может все таки Serial1.begin? Код (C++): // открываем последовательный порт на Serial Serial.begin(9600); // открываем последовательный порт на пинах 1 и 0 Serial1.begin(9600); И про кнопку я не понял? Просто в цикле разве нельзя? Код (C++): if (Status == 1) { digitalWrite(9, HIGH); // Режим передачи данных Serial.println(" Передача "); for(i=0; i<8; i++) { Serial1.print(data_in[i]); Serial.print(data_in[i],HEX); Serial.print(" "); } Serial.println(); Status = 0; } digitalWrite(9, LOW); // Режим чтения данных
На Вашей плате ардуино я вижу лишь один порт. О каком сериале1 Вы говорите? О сериале 1 или 2 говорят ,если на плате ардуино несколько портов. В цикле можно. Но я ведь не знаю Ваших задумок. От кнопки или ещё от какого то события.
На ардуино можно и без контрольной суммы. Ну прийдет 2 запроса из 10 неправильных с градусника и что? В теплице цветы завянут?