2014-11-14 3 views
0

Я пытаюсь отобразить значения, полученные из серийного, но Matlab не принимает результаты десятичных чисел. Я хотел бы получить A = 0.123 от устройства, значения умножаются на 1000, а затем отправляются через последовательный порт в matlab.Предотвращение MATLAB от округления чисел и установки десятичной точности

Сценарий MATLAB получает 123, но при том, что число делится, чтобы получить исходное значение, показывает MATLAB 0.

consRollKpTemp = typecast([uint8(mess(typei + 1)), uint8(mess(typei + 2)),uint8(mess(typei + 3)), uint8(mess(typei + 4))], 'int32'); 
disp(consRollKpTemp); 
consRollKp = consRollKpTemp/1000; 
disp(consRollKp); 

Который возвращает

consRollKpTemp: 
     123  
consRollKp: 
      0 

Я думал, что проблема была typecast(X,type) функция, которая

преобразует числовое значение в X в тип данных, указанный по типу.

, и я изменил его:

consRollKpTemp = typecast([uint8(mess(typei + 1)), uint8(mess(typei + 2)),uint8(mess(typei + 3)), uint8(mess(typei + 4))], 'single'); 

Но ничего не изменилось. Я пробовал предложения в this вопрос и here, но они не работали.

ответ

3

Проблема заключается в том, что вы используете int32 как тип, то есть у вас есть только целые числа и 0,23 правильно округляется до 0. Попробуйте бросить переменную consRollKp к double, прежде чем разделить его на 1000:

consRollKp = double(consRollKpTemp)/1000; 

Чтобы уточнить: использование typecast с single не будет работать. Typecast преобразует типы данных без, изменяя основные данные. Поскольку single является числом с плавающей запятой и uint8 и int32 являются целыми типами, то typecast между ними не приведет к желаемым результатам.

Попробуйте typecast к int32 (или, возможно, uint32) и на второй стадии использования dobule() или single(), чтобы преобразовать эту переменную к типу с плавающей точкой. Наконец, вы сможете разделить на 1000 и получить правильный результат.