вот, 2 моих сообщения проигнорированы, поэтому отвечу так: могу. 10 раз можно было всё вычитать из книжек/сайтов - стандарт то открытый и пережеван всеми, а не ждать готовое.
Кодом вот так Serial1.begin(9600); Единица возле сериала говорит всем функциям записи чтения что выводить или вводить через порт 1
Может все таки что-то с CRC....надеюсь..... так как уже все возможное проверил... осталось невозможное... Завтра отзвонюсь производителю... узнаю их версию CRC а так пока вот такой скетч получился: Может кто-нибудь увидит что-то необычное.... Код (C++): int incomingByte = 0; byte i,Status; byte data_out = (0x01,0x03,0x00,0x00,0x00,0x02,0xC4,0x10); void setup() { Serial.begin(9600); Serial1.begin(57600); pinMode(9, OUTPUT); digitalWrite(9, LOW); Status = 1; } void loop() { digitalWrite(9, HIGH); // Режим передачи данных delay(3); Serial.println(" Передача "); Serial1.write(data_out); digitalWrite(9, LOW); // Режим чтения данных delay(5); if (Serial1.available() > 0) { Serial.println(" Прием "); delay(5); incomingByte = Serial1.read(); Serial.print("ОТВЕТ ТЕРМОМЕТРА "); Serial.println(incomingByte,HEX); } }
CRC 16 там. Сюда смотри: http://forum.amperka.ru/threads/crc16-как-считать-нетабличным-способом.16430/
Единственное,что мне не нравится в твоей программе-это то,что после команды передачи команды Ты сразу же переключаешь приемо передатчик на приём. Я не знаю,что там в библиотеке. По грамотному должно быть,что пока не освободится буфер передатчика ,следующая команда не должна выполняться. На всякий случай после команды передачи поставь детей 5 мс. Чтоб данные успели перебраться Посмотрел программу ИгоряК на Lua. В ней полином А001. По такому же полиному и я вычислил тебе контрольную сумму. Но ещё хочу повторить,что у твоего девайса может быть другой полином. Это ты можешь узнать только у производителя. Так,что пока не узнаешь-тормозим..
Обычно производитель даёт нормальный букварь на своё изделие, где расписана адресация всех регистров. Чёткое описание протокола и туториалы .
У Вас CRC неправильно посчитана: Попробуйте так: Код (C++): byte data_out[] = {0x01,0x03,0x00,0x00,0x00,0x02,0xC4,0x0B}; UPD. Скобки не те и массив неправильно определен, исправил выше.
По хорошему, переключение на прием должно выполняться в прерывании, по окончанию передачи. Сделайте задержку на 2 мс после передачи: Код (C++): Serial1.write(data_out,8); delay(2);
SergeiL написал, что контрольная сумма C410 вычислена не правильно, а правильная C40B. Скорее всего он прав. Дело в том,что эти две контрольные суммы,что та,что та вычислены правильньно,но моя контрольная сумма это чистый CRC-16, а другая сумма-это CRC-16(modbus). Где разница в алгоритме я честно говоря не знаю,да и не задавался целью.
Созвонился сегодня с производителем, тот прислал картинку, где он через программу работает с регистрами... так вот там при комбинации 01 04 00 00 00 02 CRC = 71CB У них с таким значением все работает.... у меня нет.... Но они подали идею... а где говорят гарантия, что все 8 значений ушли из буфера... а например последнее задержалось.... что-то типа прерывание или функция завершения передачи есть интересно в Ардуино? На днях(как получится, скорее всего на выходных) буду смотреть на осцилографе... как ходят данные.
Сейчас проверю по какой контрольной сумме они это просчитывали. И отпишусь. Не сомневайтесь -решим Вашу проблему.
Самое интересное, что данное значение CRC полностью совпадает с online калькуляторами CRC, но только байты поменены местами.... т.е. калькулятор мне показал на комбинацию 0104000002 CRC=CB71, у них же используется 71CB..... я тогда специально перепроверил с интернета с описания ModBus.... везде также получается одно... потом меняют местами старший с младшим....