Ich bekomme als input ein Array mit meiner Nachricht in dezimal. Ich mochte die Nachricht in SIMULINK nun zurück in ihre ursprüngliche Form als Array mit int haben. Da die direkte umwandlung nicht geht wollte ich das über Strings machen, allerdins funktioniert auf dem RPi str2num nicht und str2double konvertiert Dezimal nicht zurück.
Die Nachricht wird per Serial von einem Pi auf einen Arduino (bis hier hin läufts) und zurück geschickt.
Jede Hilfe wilkommen.
Ursprünliche Nachricht: [123.4567 765.4321 1 0]
als String (zwischenschritt): '123.4567 765.4321 1 0\n'
als uint8: [49 50 51 46 52 53 54 55 32 32 32 32 32 32 55 54 53 46 52 51 50 49 32 32 32 32 32 32 32 32 32 32 32 32 32 49 32 32 32 32 32 32 32 32 32 32 32 32 32 48 10]
Ich empfange die nachricht auf dem Pi auch wieder so wie als uint8. Als char umwandeln geht auch (sollte zumindest, SIMULINK will die Char nicht ausgeben), aber von da wieder als Zahl nicht. In MATLAB ist das kein Problem da läuft das mit str2num einfach.

댓글 수: 5

madhan ravi
madhan ravi 2024년 1월 5일
“Da die direkte umwandlung nicht geht” erklär das mit einem Beispiel. Wie umwandelst du? Zeig dein Model Bild.
Simon Schirk
Simon Schirk 2024년 1월 5일
Ich kann von der numerischen Darstellung nicht direkt auf die darstellung als double.
Beispiel:
Character: 0 / 7 @ A
Decimal value: 48 47 55 64 65
die Umwandlung geht nicht, da ich im Numerischen (Decimal) durch Zahlen auch Buchstaben etc. darstellen kann und das für Simulink schon Zahlen sind. Bei char(NACHRICHT IN DECIMAL) wandelt MATLAB die decimal Werte in ihren Character um. Da es sich bei mir nur um Zahlen (und Leerzeichen) handelt will ich es aber wieder ald Zahl (double im Array) haben.
madhan ravi
madhan ravi 2024년 1월 5일
편집: madhan ravi 2024년 1월 5일
Als ich verstanden habe. Im gegebenen Beispiel, die erwartete Antwort ist:
[0, 7] ?
char_array = [' 0 / 7 @ A']
char_array = ' 0 / 7 @ A'
wanted_array = str2double(regexp(char_array, '(\d*\.\d+)|\d*', 'match'))
wanted_array = 1×2
0 7
Okay, vielleicht war das ein schlecht gewähltes Beispiel.
Array_Char = ['123.4567 765.4321 1 0']
Array_Char = '123.4567 765.4321 1 0'
Wanted_Array = [123.4567 765.4321 1 0]
Wanted_Array = 1×4
123.4567 765.4321 1.0000 0
madhan ravi
madhan ravi 2024년 1월 5일
Klar, siehe meine Antwort unten.

댓글을 달려면 로그인하십시오.

 채택된 답변

madhan ravi
madhan ravi 2024년 1월 5일
편집: madhan ravi 2024년 1월 5일

1 개 추천

receivedData = [49 50 51 46 52 53 54 55 32 32 32 32 32 32 55 54 53 46 52 51 50 49 32 32 32 32 32 32 32 32 32 32 32 32 32 49 32 32 32 32 32 32 32 32 32 32 32 32 32 48 10];
% Konvertiere die uint8-Daten in eine char-Zeichenfolge
charString = char(receivedData);
% Teile die Zeichenfolge in separate Teile auf
messageCellArray = strsplit(charString, ' ');
% Konvertiere die Teile in Zahlen
numericArray = str2double(messageCellArray)
numericArray = 1×4
123.4567 765.4321 1.0000 0

댓글 수: 2

Simon Schirk
Simon Schirk 2024년 1월 6일
Ich habs gelöst bekommen. ich musste in Simulink ein paar kleine Umwege gehen, aber der Ansatz war gut. Danke
MessageReceivedChar = char(transpose(MessageReceived));
MessageReceivedStr = string(MessageReceivedChar);
begin = strfind(MessageReceivedStr, "*");
begin = begin(1,1)+1; %Counter reinsetzen
terminator = strfind(MessageReceivedStr, "~");
terminator = terminator(1,1)-1; %Counter reinsetzen
messageShortendUmweg = (MessageReceivedChar(begin:terminator));
xKoordinate = str2double(string(messageShortendUmweg(1:8)));
yKoordinate = str2double(string(messageShortendUmweg(9:16)));
MaehwerkStatus = str2double(string(messageShortendUmweg(17)));
Fahrtrichtung = str2double(string(messageShortendUmweg(18)));
NachrichtAusgelesen = [xKoordinate yKoordinate MaehwerkStatus Fahrtrichtung];
'*' und '~' begrenzen hierbei die Nachricht
madhan ravi
madhan ravi 2024년 1월 6일
Gut das du alles im Griff bekommen hast:)!

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

제품

릴리스

R2023a

질문:

2024년 1월 5일

댓글:

2024년 1월 6일

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!