Что такое modbus со строны программирования?
- Войдите на сайт для отправки комментариев
Чт, 21/06/2018 - 21:40
есть библиотеки. но если нет необходимости использовать все функции этих либ, можно ли заменить на элементарное
byte data[8]; Serial.write(data,8)
предварительно заполнить data данными и crc ?
Можно, а чего нельзя-то? Вот с поглода назад Вам бы это запретили, а сейчас всё можно - время такое :(
Можно, а чего нельзя-то? Вот с поглода назад Вам бы это запретили, а сейчас всё можно - время такое :(
Это был сарказм.
Поищите по форуму фразу "я запретил" - узнаете много интересного.
Поищите по форуму фразу "я запретил" - узнаете много интересного.
а по делу, есть что-то дельное?
Первый ответ самый дельный
Поищите по форуму фразу "я запретил" - узнаете много интересного.
а по делу, есть что-то дельное?
Это не флуд, а ответ на Ваш вопрос.
По делу я Вам полностью ответил в посте №1 (что ещё можно добавить?), о чём начинаю сожалеть, т.к. сложилось ощущение, что Вы считаете меня чем-то Вам задолжавшим.
Поищите по форуму фразу "я запретил" - узнаете много интересного.
а по делу, есть что-то дельное?
Это не флуд, а ответ на Ваш вопрос.
По делу я Вам полностью ответил в посте №1 (что ещё можно добавить?), о чём начинаю сожалеть, т.к. сложилось ощущение, что Вы считаете меня чем-то Вам задолжавшим.
я прочитал, то что физически можно, я знал, меня интересует наличие подводных камней при таком использовании. у меня пока мало в этом опыта. вот и вопрос.
Всех приветствую, вопрос из этой же темы, поэтому новую создавать не стал.
Есть устройство которое через UART посылает данные, которые заканчиваются CRC16 Modbus. Я принимаю эти данные например 4 байта, два из которых CRC, но немогу пощитать CRC чтобы сравнить верный ли пакет. Пакет в HEX выглядит так 56 00 E3 10.
Использую функцию форуме Arduino.cc
Дописал для своего теста
При получении указанных выше данных, программа считает CRC только для первого байта V(ASCII) или 56(HEX). Думаю причина во втором байте, который NULL или 0x00.
Помогите, пожалуйста, а то знаний в этом вопросе нехватает.
Резервируйте память для char val[] в размере длины пакета, сейчас вы пишете неизвестно в какую область памяти. strlen тут использовать неверно.
Пакеты могут быть разной длинны, 4 байта самый короткий, самый длинный если не ошибаюсь 20 байт. Ну если strlen неверно тогда, жду предложений.
Есть ещё один код из сети, но там данные тоже String msg = "5600E310"; //like Modbus menssage: 56 00 E3 10 Тоже не могу понять как привети полученные данные к нужному виду.
получить указатель на строку и преобразовать в массив читая по два симвала до символа с кодом 0x00
Пакеты могут быть разной длинны, 4 байта самый короткий, самый длинный если не ошибаюсь 20 байт. Ну если strlen неверно тогда, жду предложений.
Значит резервируйте 20 байт. В функцию расчета передавайте длину принятого пакета за вычетом размера CRC (вы же не собираетесь CRC от CRC считать?)
Я или неправильно объяснил или не понимаю написанного, но вопрос в том чтобы преобразовать полученные из порта данные в строку типа "5600Е310"
А если знал, зачем спрашивал?
Ещё раз перечитал первый пост. Нет там ничего ни про какие камни.
Где? Вопроса, кроме как "можно ли?" так и не поступило.
Вы уж, постарайтесь спрашивать именно то, что Вас интересует. А то вон спросили про запреты, Вам ответили, а Вы про флуд раскричались, спросили про "можно ли", Вам ответили - опять не слава Богу.
В чём же Ваш вопрос-то?
Я или неправильно объяснил или не понимаю написанного, но вопрос в том чтобы преобразовать полученные из порта данные в строку типа "5600Е310"
то есть у вас вопрос не о расчете CRC. а о том, как собрать полученные байты в строку. В принципе sadman вам уже ответил, но если не понимаете = ищите выделенное в гугле - тема новичковая, на форумах разобрана тысячу раз.
Поищите по форуму фразу "я запретил" - узнаете много интересного.
Сорри за оффтоп , а куда делся главный "запрещатель" )) ?
Сорри за оффтоп , а куда делся главный "запрещатель" )) ?
Видимо, заработал пожизненный эцык с гвоздями.
Видимо, заработал пожизненный эцык с гвоздями.
раньше его это не останавливало - цифирьки менял в нике и воскресал. Так что тут, скорее, другое - в отпуск уехал или комп сломался :).. Думаю, мы его еще увидим :)
Я или неправильно объяснил или не понимаю написанного, но вопрос в том чтобы преобразовать полученные из порта данные в строку типа "5600Е310"
то есть у вас вопрос не о расчете CRC. а о том, как собрать полученные байты в строку. В принципе sadman вам уже ответил, но если не понимаете = ищите выделенное в гугле - тема новичковая, на форумах разобрана тысячу раз.
Я так понял Вы имеете ввиду это и судя по той теме если у меня есть массив byte msg[5]={0x48,0x65,0x6C,0x6C,0x6F}, то после преобразования я получу строку "Hello", а мне нужно "48656C6C6F"
Видимо, заработал пожизненный эцык с гвоздями.
раньше его это не останавливало - цифирьки менял в нике и воскресал. Так что тут, скорее, другое - в отпуск уехал или комп сломался :).. Думаю, мы его еще увидим :)
Просто его либка по работе с кнопкой перестала умещатся в ардуино. Вот и утратил интерес к платформе, теперь на форуме стм околачивается ;)
А это имеет смысл? Возможно, что библиотека имеет другую функцию, которая прямо байтовый массив жрет и можно обойтись без HEX-представления.
Я так понял Вы имеете ввиду это и судя по той теме если у меня есть массив byte msg[5]={0x48,0x65,0x6C,0x6C,0x6F}, то после преобразования я получу строку "Hello", а мне нужно "48656C6C6F"
вы пишете ерунду. Для расчета CRC вам нужен как раз массив byte msg[5]={0x48,0x65,0x6C,0x6C,0x6F},, а не строка "48656C6C6F". Ничего преобразовывать не нужно.
А это имеет смысл? Возможно, что библиотека имеет другую функцию, которая прямо байтовый массив жрет и можно обойтись без HEX-представления.
думаю, смысла в этом нет. Я вообще сомневаюсь. что библиотека жрет именно строку в символьном HEX - это было бы пяткой за левым ухом. Скорее всего там именно байтовый массив., который выводится как HEX только для печати.
Вообще, автор явно зря в какие-то дебри полез. У него уже есть почти готовый код, в котором только надо поправить вычисление длины сообщения
Я так понял Вы имеете ввиду это и судя по той теме если у меня есть массив byte msg[5]={0x48,0x65,0x6C,0x6C,0x6F}, то после преобразования я получу строку "Hello", а мне нужно "48656C6C6F"
вы пишете ерунду. Для расчета CRC вам нужен как раз массив byte msg[5]={0x48,0x65,0x6C,0x6C,0x6F},, а не строка "48656C6C6F". Ничего преобразовывать не нужно.
Есть ещё вот такой вариант кода, поэтому прошу не выражаться.
Есть ещё вот такой вариант кода, поэтому прошу не выражаться.
да как же тут не выражаться, если в этом коде для расчета CRC автор преобразует строки типа "4665ff34e4" как раз в массив байт (строчки 28-30)
У вас уже есть этот массив байт - и вы предлагаете сначала перевести его в строку, а потом этим кодом - обратно? Ну не ерунда ли?
Есть ещё вот такой вариант кода, поэтому прошу не выражаться.
да как же тут не выражаться, если в этом коде для расчета CRC автор преобразует строки типа "4665ff34e4" как раз в массив байт (строчки 28-30)
У вас уже есть этот массив байт - и вы предлагаете сначала перевести его в строку, а потом этим кодом - обратно? Ну не ерунда ли?
Если у Вас есть вариант перевода предлагайте может кому пригодиться, т.к. автор кода его где-то приминяет, а иначе это вопрос снят.
По поводу первого кода, да там strlen() всегда выдавала 1, поэтому CRC была только по первому байту. Сейчас тестовый код работает, только для полного счастья еще нужно посчитать количество байт в массиве, сейчас запись имеет вид
А хотелось бы
но т.к. массив зарезервирован как
То sizeof(val) возвращает 20.
Поэтому изучаю дальше.
для полного счастья еще нужно посчитать количество байт в массиве, сейчас запись имеет вид
А хотелось бы
мало ли что кому хотелось.
Конкретно можете сказать, чем вас не устраивает первая запись?
Если рассматривать приём данных, то там всё вроде пока в порядке. Но есть ещё и отправка данных, можно конечно создать нужное количество массивов и посылать взависимости от команды, но думаю у 328P может не хватить объема памяти на всё, что планируется в нее загрузить. Правильнее было бы сформировать массив внутри программы и отправить
Но если массив имеет зарезервированную днинну, то sizeof() её и возвращает.
Открою вам тайну - вы можете один и тот же массив использовать, как приемный буфер, так и отправной. Только запоминайте длину актуального фрагмента и используйте, где полагается.
Но если массив имеет зарезервированную днинну, то sizeof() её и возвращает.
Как не возвращает? Я думал, она "в хорошем смысле".
Правильнее было бы сформировать массив внутри программы и отправить
Похоже, что вы не понимаете элементарных вещей. Зачем под каждую длину данных отводить свой массив? Пользуйтесь одним и тем же. Да, его длина не будет совпадать с размером данных и sizeOF() вы использовать не сможете. Ну и что с того?
Вы разве в момеент отправки не знаете длину данных? А если знаете, что мешает вместо sizeof() указать реальную длину?
Заменить можно, при условии сохранения протокола. Просто выдать строку недостаточно. Нужно ещё соблюсти тайминги между посылками. А так, без библиотек слейвы работают замечательно.
Раскрытие этой тайны придает смысл расчету CRC по строке уже содержащей CRC?
Открою тебе страшную тайну, контрольная сумма строки вместе с CRC равна нулю.
Пруф в студию.