WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

2 8 bit zu einer 16 Bit zahl signed zusammensetzen

 

Help!

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.08.2011, 11:59     Titel: 2 8 bit zu einer 16 Bit zahl signed zusammensetzen
  Antworten mit Zitat      
Hallo Forum!!

Ich glaube mein Problem ist schnell erledigt:

Ich bekomme über einen Bus über fread 2 8 Bit zahlen, die aber eigentlich zusammen eine signed 16 Bit zahl ist. Das heist -1 ist 11111111 11111110. Das will ich als Dezimalzahl haben!! Ich hab alles probiert aber ich bekomme immer einen fehler. Weis einer, wie das geht?


DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 19.08.2011, 12:33     Titel:
  Antworten mit Zitat      
Was heißt alles probiert...hast du auch die Glaskugel befragt?

Wie kommst du darauf, dass -1 deine angebene Zahl im Dualsystem ist...soll das im 2er Komplement sein?
Private Nachricht senden Benutzer-Profile anzeigen
 
Kevin
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 93
Anmeldedatum: 18.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.08.2011, 12:35     Titel:
  Antworten mit Zitat      
Hi,
wenn ich nicht ganz neben mir bin, kann fread nur auf eine Datei, nicht aber auf einen BUS zugreifen.
(Das mit dem Komma steht da ja garnicht...ups)
Aber geht int16 nicht?

Gruß
Kevin
_________________

1000 Buchstaben? Warum nur 6?
Private Nachricht senden Benutzer-Profile anzeigen
 
Help!

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.08.2011, 19:23     Titel:
  Antworten mit Zitat      
Das Einlesen über fread funktioniert super. Ich hab jetz mal 2 Variablen nacheinander direkt gesendet. Heist bei Bytes availabe steht nun 2! Wenn ich das in die Variable lade, stehen die beiden Werte wunderbar drin aber das ist dann eine 2x1 Matrix. ICH WILL ABER verdammisch nochmal eine 1x1 int16 Zahl haben! Weil die kann ich mit keinem Befehl jetzt bin2dec oder mit mvl2dec in eine Dezimalzahl wandeln!
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 19.08.2011, 19:53     Titel:
  Antworten mit Zitat      
Was für ein Datentyp ist denn die 2x1 Matrix?

Code:

data = [11111111 11111110];
int16(bin2dec(sprintf('%d',data)))
 


Edit: Typecast noch hinzugefügt
Private Nachricht senden Benutzer-Profile anzeigen
 
Help!

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.08.2011, 21:24     Titel:
  Antworten mit Zitat      
Das funktioniert zwar so wie es da steht schon, aber der Datentyp ist ein anderer, wenn ich das mit fread einlesen:
Code:

    up=dec2bin(fread(serialObject,1)); %MSB
    down=dec2bin(fread(serialObject,1));%LSB
    low= [up down];
    voltage(count)=  int16(bin2dec(sprintf('%d',low)));
 

wenn ich mir im Debugmodus die Variable low genauer anschaue, steht da:
low: 1x16 char = 1111111111111110

gibt es da einen cast für?
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 19.08.2011, 23:10     Titel:
  Antworten mit Zitat      
Code:
voltage(count)=  int16(bin2dec(sprintf('%c',low)));
Private Nachricht senden Benutzer-Profile anzeigen
 
Help!

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.08.2011, 10:00     Titel:
  Antworten mit Zitat      
Nach einem Durchlauf ist das Ergebnis nun 32767 und das ist weit entfernt von -2. Das stimmt noch irgendwas nicht. Die Routine ignoriert, dass die Bitzahl ein Vorzeichen hat!
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 20.08.2011, 11:33     Titel:
  Antworten mit Zitat      
bin2dec interpretiert low als positive Zahl und int16 gibt keine Überläufe an.

Auf die schnelle ist mir jetzt nur das eingefallen...

Code:

low=char(['1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '0'])
up=low(1:8);% MSB
% bin2dec für das LSB kannst du dir ja sparen und setzt es stattdessen beim MSB ein
down=bin2dec(low(9:16));% LSB
 
% Umwandlung des MSB in Dezimal
msb = 0;
for i=1:7
    if str2num(up(i+1)) == 1
        msb = msb + 2^(15-i);
    end
end

% Vorzeichen prüfen und MSB und LSB zusammenrechnen
if str2num(up(1)) == 1
    % negative Zahl
    zahl = msb + down - 32768
else
    zahl = msb + down
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 20.08.2011, 19:38     Titel:
  Antworten mit Zitat      
Hallo Help,

Zitat:
Das Einlesen über fread funktioniert super.

Bitte poste doch Deinen FREAD Befehl. Üblicherweise läßt sich das Format definieren:
Code:
data = fread(fid, 1, 'int16');

Wenn Du aber zwei Bytes in einem Vektor hast, kann TYPECAST dies umformen:
Code:
data = uint8([255, 254]);
data_int16 = typecast(data, 'int16');
% Und wenn dann noch die Byte-Order geändert werden muss:
data_int16 = swapbytes(data_int16);
 

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.