|
34 / 34 / 4
Регистрация: 19.02.2013
Сообщений: 118
|
||||||||||||||||
| 21.02.2016, 11:16 | ||||||||||||||||
|
Попробовал:
если использовать
Если пробовать
Я всё-таки решил пойти по пути использования только рабочих бит. Т.е. АЦП выдаёт 10-битные значения (всё равно не меньше 2-х байт), а если использовать только средние 6 бит в каждом байте, то этого всё равно хватает. Таким образом, в каждом передаваемом байте первый бит всегда 1, а последний всегда 0. Тестовый код такой:
0
|
||||||||||||||||
| 21.02.2016, 11:16 | |
|
Ответы с готовыми решениями:
74
Чтение из COM порта, При чтении из порта зависает read()
Чтение из COM-порта |
|
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 901
|
||||||
| 06.06.2016, 15:22 [ТС] | ||||||
|
Скажите, а как вы в matlab ответ из байт собираете? ну вот допустим:
0
|
||||||
|
34 / 34 / 4
Регистрация: 19.02.2013
Сообщений: 118
|
||||||
| 06.06.2016, 16:11 | ||||||
|
Честно говоря, не совсем врубился что именно надо сделать,
В моём случае, я знаю которые байты служебные и просто их удаляю из массива. Т.е. в Вашем случае, если служебные байты с 1 по 3 и два последних, то можно сделать так.
0
|
||||||
|
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 901
|
||||||
| 06.06.2016, 16:20 [ТС] | ||||||
|
Это-то можно проще:
0
|
||||||
|
34 / 34 / 4
Регистрация: 19.02.2013
Сообщений: 118
|
||||||
| 06.06.2016, 16:34 | ||||||
|
Ну есть наверное и более правильный способ, но я делаю топорно.
В одном байте 8 бит. Каждый байт можно считать разрядом в числе. Тогда вес разряда =2^8*номер разряда (считая с 0). Например:
Res=3+2*256+7*256^2+25*256^3
1
|
||||||
|
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 901
|
|
| 06.06.2016, 20:00 [ТС] | |
|
Спасибо, попробую. А этот метод будет работать, если число с плавающей точкой или оно только для целых чисел годится? просто пока не уловил суть.
Добавлено через 19 минут воспользовался вашим кодом и вашим же входным вектором. и вот какое число у меня получилось: 419889667. разве может хоть 1 прибор выдать такой результат? что-то тут не так...
0
|
|
|
34 / 34 / 4
Регистрация: 19.02.2013
Сообщений: 118
|
||||||
| 06.06.2016, 20:31 | ||||||
|
Этот метод годится для натуральных чисел.
С плавающей точкой числа в памяти компьютера записаны тоже при помощи целых. Это установлено международным стандартом. Почти все приборы выдают свои числа посимвольно (1 байт = 1 цифра в ANSII кодировке). Я пошёл по собственной кодировке, чтобы сократить время передачи каждого сэмпла с АЦП. Я смог так сделать потому что и прибор сам прошивал. Кроме того в матлабе есть один баг - когда по ком-порту приходит байт из одних нулей он не отображается вообще никак. В таблице ansii это символ null, нет соответствующей буквы - символьный буфер не увеличивается, как следствие, принятым байт числится, а в принятых данных его просто нет. Поэтому настоятельно рекомендую использовать стандартную кодировку. попробуй считывать так:
0
|
||||||
|
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 901
|
|
| 07.06.2016, 11:01 [ТС] | |
|
Нет, так не пойдет. во втором входном параметре получил 9 (количество прочитанных байт), в первом - 0. в любом случае так читать нельзя, потому что, во-первых, matlab не знает, какие байты нам нужны, а какие нет, во-вторых, на хранение мантиссы и порядка в matlab отводится 8 байт, и опять же matlab не знает , где ставить точку. есть идея попробовать побайтово перевести ответ в двоичный вид, далее из всех байтов сформировать одну строку, и перевести обратно в десятичное число. буду пробовать.
0
|
|
|
34 / 34 / 4
Регистрация: 19.02.2013
Сообщений: 118
|
|
| 07.06.2016, 11:31 | |
|
м.б. давайте лучше плясать от того - что у вас за прибор.
Если смотреть хэлпик, то ключ %s интерпретирует полученные данные "как серии символов пока не найдёт пустое пространство", т.е пробел. Есть ключи для Floating-point number, чтобы попробовать их, у меня под рукой сейчас нет ком порта. Во всяком случае, я уверен, что то что вы хотите сделать - уже реализовано в матлабе. И надо бы знать наверняка в каком формате ваш прибор шлёт данные, и можно ли (и стоит ли) этот формат изменять. Если хочешь поэкспериментировать с форматом данных, так чтобы самому выбирать что придёт на вход, можно замкнуть 2-ю и 3-ю ноги ком-порта (советую резистором в 20 кОм, но я пробовал просто отвёрткой - и ничего не сжёг). Так во входной буфер будет поступать всё в точности то, что ты сам отошлёшь с ком-порта. А да, и можешь быть уверен, что базовые типы данных в матлабе абсолютно точно такие же как и на С или джаве, ли где угодно. И определены они тем документов что есть в статье по ссылке.
1
|
|
|
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 901
|
|
| 07.06.2016, 18:58 [ТС] | |
|
Еще раз здравствуйте. у меня несколько приборов, названия, думаю, ничего не скажут, но попробую по сути. 1 из них аналоговый, т.е. работает через ацп (газоанализатор). так вот, с него я считываю 1 регистр (вход ацп) я знаю, что ацп передает только положительные числа. соответственно нужных мне 2 байта. далее младший байт я беру как он пришел и прибавляю к нему старший байт, домноженный на 2 в степени 8 или 256. получаю требуемое число. кстати, все считываю через fread. все в порядке. далее у меня есть цифровые термометр (ттрм 138) он выдает ответ вещественным числом (в градусах с десятыми). так вот и хотелось бы обработать также, как обрабатывал прибор, с которого нужно было считать целые значения. но тут есть несколько подводных камней. как представляется вещественное число в matlab? насколько я знаю, на тип double отводится 8 байт. значит, чтобы корректно обработать поступившее число, мне его нужно допполнить четырьмя байтами справа? и умножать старший байт не на 256^2 а на 256^4? посути и вся задача, как из 4 байт получить вещественное число, при условии, что я знаю, как из 4 байт получить целое.
0
|
|
|
34 / 34 / 4
Регистрация: 19.02.2013
Сообщений: 118
|
|
| 07.06.2016, 22:56 | |
|
В матлабе есть тип данных и single, полный список типов данных тут.
Есть вероятность, что некоторые встроенные функции (вроде аппроксимации) определены только для double-типа. Чтобы всё работало, можно сделать приведение типов данных: double(Data); - возвращает те же данные (что и data(любого типа)), только преобразованные к double Если посмотреть хэлпик по функции fread(), то там есть третий возможный аргумент precision он определяет способ интерпретации полученных с прибора байт. Похоже, что тебе достаточно корректно считать данные и сделать приведение типов (если необходимо). Вдаваться в подробности, вроде того сколько бит под какое поле в double по идее не обязательно.
0
|
|
|
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 901
|
||||||
| 08.06.2016, 09:52 [ТС] | ||||||
|
а вот это уже интереснее:
1) допустим я указываю вторым аргументом к fread double, так тогда он мне переведет все число, как объяснить функции fread, что надо обработать с 4 по 7 байт, первые 3 и последние 2 выкинуть. 2. с помощью каких функций можно собрать число? я просто не врубаюсь, что вы имеете ввиду, вот допустим пишу:
0
|
||||||
|
34 / 34 / 4
Регистрация: 19.02.2013
Сообщений: 118
|
|
| 08.06.2016, 10:33 | |
|
Ностальгирую по юности.
Была у меня когда то похожая проблема. Под итожим. Считать интерпретируя, как float-point нет возможности, т.к. нужно считывать не с четвёртого а с третьего байта. Остаётся один вариант - комбинировать число из байт. У меня была аналогичная проблема на С++. Для её решения существуют так называемые объединения (union). В коде оно описывается в точности как класс, однако по сути это разные способы трактовки данных записанных в одной памяти. Т.е. если к классу мы обращаемся: MyClass.f1 - получаем доступ к первому полю класса, MyClass.f2 - ко второму полю класса (разная информация). То в объединении можно сделать так. MyUnnn.uint32=7845; res=MyUnnn.single - те же битики что и в uint, только они будут интерпретироваться как single. Byte=MyUnnn.char[2] - второй байт отдельно от остальных в char-интерпретации и.т.д. Вот только в матлабе union означает совсем другое. Немного покопавшись нашёл тему с точно таким вопросом, вроде бы там дали ответ. В худшем случае придётся разбираться в джаве.
1
|
|
|
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 901
|
||||||
| 08.06.2016, 13:04 [ТС] | ||||||
|
или читать 2 раза, например:
Добавлено через 51 минуту нет, через single тоже не работает. выдает какоето очень неправильное число в -7 степени. вообщем, проблема осталась. как из байтов 65 216 4 40 получить число 26.3? Добавлено через 1 час 21 минуту Ну хорошо, а подскажите, есть ли какой-либо способ считать с компорта то, что пришло в двоичном или 16-ричном формате? я просто вроде нашел проблему, но без исходных (не приведенных) тьипов ее не решить. все-таки matlab до java и C++ не дотягивает.
0
|
||||||
|
34 / 34 / 4
Регистрация: 19.02.2013
Сообщений: 118
|
|
| 08.06.2016, 14:32 | |
|
можно преобразовать твои целочисленные uint8 значения при помощи
dec2bin() dec2hex() но они возвращают текстовые строки
0
|
|
|
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 901
|
|
| 08.06.2016, 14:46 [ТС] | |
|
не пойдет. мне нужны коды, изначально приходящие на компорт. ведь это уже сам matlab преобразует их в 10 - ричный формат. и преобразует неправильно, применяя функцию hex2dec вместо hex2num.
0
|
|
|
34 / 34 / 4
Регистрация: 19.02.2013
Сообщений: 118
|
|
| 08.06.2016, 15:45 | |
|
Мне кажется, что если бы матлаб преобразовывал некорректно, не работало бы ничего ни у кого, а так, по крайней мере цифры из матлаба и из других терминальных прог совпадают.
Про Ваш термометр написано, что он использует протокол ОВЕН, Modbus ASCII/RTU Вот модбас, вот овен. На сколько я понял, у каждого есть несколько режимов, но везде такой принцип, что один байт информации кодируется двумя ASCII символами. Сама таблица ASCII вот. Для того чтобы такое правило выполнялось коды должны быть в пределах 0x30-0x39 (48-57-й символ) для цифр 0-9; и 0x41-0x46 (65-70-й) символ для букв A-F. Можно было бы попробовать по отображать и по инвертировать получаемые коды, но они все должны быть меньше 127 (или все больше). Так что, что делать с вашими циферками, пока не понятно. Но наверное стоит начать с того, который протокол используется у вас и в каком режиме. По идее, в комплекте к прибору должен идти паспорт или методичка какая то, где это всё есть. Модбас, по моему условно говоря популярный протокол, м.б. в интернете под него есть готовые матлабовские тулбоксы или м-файлы. Вот, возможно тут что-то найдёшь.
0
|
|
|
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 901
|
||||||
| 08.06.2016, 17:03 [ТС] | ||||||
|
Большое спасибо за желание помочь. Маленькая поправочка: когда я говорю, что matlab некорректно переводит из 16-ричной системы, я имею ввиду дробные числа. ему ничего не известно о данных, которые приходят на компорт, и он все воспринимает как целочисленные. если не верите, поэкспериментируйте так: пусть:
вы скорее всего работаете только с целочисленными данными в matlab, поэтому вам с этими плясками сталкиваться не приходилось. кстати, частично я решил свою проблему с помощью комбинаций num2hex и hex2dec, правда погрешность пдо 0.5 градуса из-за округления. на C++ c# java есть свои методы, "собирающие" из байтов число. в матлабе по ходу такого нет. а modbus протокол я хорошо знаю. почему я это говорю, потому что тестировал с помощью C# и там данные получал корректные.
0
|
||||||
|
34 / 34 / 4
Регистрация: 19.02.2013
Сообщений: 118
|
|
| 08.06.2016, 19:46 | |
|
Если в протоколе есть описание сколько бит под степень, знаки и мантиссу (и в каком порядке), могу присоветовать, как собрать байты вручную (на манер того, как с uint).
1
|
|
|
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 901
|
|
| 08.06.2016, 20:05 [ТС] | |
|
Обязательно расскажите!! это по сути и есть суть моего вопроса как собрать вручную, а документация на протокол и прибор у меня есть ))
0
|
|
| 08.06.2016, 20:05 | |
|
Чтение из com-порта Чтение из COM порта Чтение из com порта Чтение COM порта
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него.
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952
Инструкция внутри.
Сразу отвечу: А в PvP с ним. . .
|
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности.
Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
|
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version
Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
|
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер
На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
|
|
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/
TL DR
Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|