Добрый день! Пытаюсь уже несколько дней подключить температурный датчик к Ардуино. Но результат нулевой... на выходе... Датчик работает по стандарту RS-485, протокол ModBus. Считывание происходит через Input Registers. Адрес устройства - 01, Скорость передачи данных - 57600, Тип данных - float, длина - 2, адрес 0х0000. Библиотеку использую вот эту: https://github.com/smarmengol/Modbus-Master-Slave-for-Arduino Скетч взял из примера: Код (C++): /** * Modbus master example 1: * The purpose of this example is to query an array of data * from an external Modbus slave device. * The link media can be USB or RS232. * * Recommended Modbus slave: * diagslave http://www.modbusdriver.com/diagslave.html * * In a Linux box, run * "./diagslave /dev/ttyUSB0 -b 19200 -d 8 -s 1 -p none -m rtu -a 1" * This is: * serial port /dev/ttyUSB0 at 19200 baud 8N1 * RTU mode and address @1 */ #include <ModbusRtu.h> // data array for modbus network sharing uint16_t au16data[16]; uint8_t u8state; byte i; /** * Modbus object declaration * u8id : node id = 0 for master, = 1..247 for slave * u8serno : serial port (use 0 for Serial) * u8txenpin : 0 for RS-232 and USB-FTDI * or any pin number > 1 for RS-485 */ Modbus master(0,0,9); // this is master and RS-232 or USB-FTDI /** * This is an structe which contains a query to an slave device */ modbus_t telegram; unsigned long u32wait; void setup() { master.begin( 57600 ); // baud-rate at 19200 master.setTimeOut( 5000 ); // if there is no answer in 2000 ms, roll over u32wait = millis() + 1000; u8state = 0; Serial.begin (9600); pinMode(9, OUTPUT); digitalWrite(9, LOW); } void loop() { switch( u8state ) { case 0: if (millis() > u32wait) u8state++; // wait state break; case 1: telegram.u8id = 1; // slave address telegram.u8fct = 4; // function code (this one is registers read) telegram.u16RegAdd = 0; // start address in slave telegram.u16CoilsNo = 2; // number of elements (coils or registers) to read telegram.au16reg = au16data; // pointer to a memory array in the Arduino master.query( telegram ); // send query (only once) u8state++; break; case 2: master.poll(); // check incoming messages if (master.getState() == COM_IDLE) { u8state = 0; u32wait = millis() + 100; } for(int i=0; i<16; i++) { Serial.println(au16data[i]); } Serial.println(); delay(1000); break; } } Помогите кто уже работал с такой задачей и протоколом. В интернете очень много разновидностей такой библиотеки... может мне нужно другую использовать. Возможно что-то с типами данных... так как au16data тип целый, а у мне нужно считать тип float. С уважением Дмитрий.
Нет такого протокола. Сможешь рассказать, что делает каждая строчка твоего кода? Если нет, то и обсуждать нечего. Почему сперва на уарте скорость выставляется 57600, а потом скидывается до 9600?
Спасибо за опечатку про RS-485.... исправил.... В первом случае это скорость передачи для ModBus Во втором случае это для вывода данных в порт монитора (поверьте если ее не использовать, то данные в виде чепухи выводятся все в одну строку) Какая строчка вас конкретно интересует?
На счет CRC суммы не могу точно сказать... так как в паспорте ничего нет, а у производителя только завтра можно узнать. А может быть поэкспериментировать с ней и без нее...? Если можно пришлите пожалуйста конкретно тестовую строку, какую нужно отправить в датчик.
Для того,чтобы написать конкретную строку мне необходим даташит на твой термометр, откуда я узнаю номер регистра где хранится температура, формат данных этой температуры и адрес устройства. На базе этих данных сформирую строку сCRC или без него. А формат мне нужен для того,чтобы знать чем строка заканчивается. Обычно символом возврата каретки,а может каким другим символом специфичным для производителя.
Адрес устройства - 01, Скорость передачи данных - 57600, Тип данных - float, длина - 2, адрес 0х0000.
Модбас изучил прежде, чем лезть в него? Ты точно уверен, что библиотека задаёт правильное смещение адресам регистров? И про интерфейс не услышал ответ.