Programmieren - alles kontrollieren 4.941 Themen, 20.715 Beiträge

Programmieren von seriell ( com port ) mit Matlab

lemec / 4 Antworten / Baumansicht Nickles

habe diese prog.geschrieben aber kann nicht AscII (Hex)befehl an meiner steuerkarte geben, kann nur zeichen eingeben (#,$...) .möchte aber hex wie 23 01 0D FF eingeben und anwort bekommen vielen dank für ihre hilfe, der französe...

s2 = serial(\'COM1\', \'BaudRate\', 19200,\'Parity\',\'none\',\'Terminator\',\'CR\',...
\'Databits\',8,\'StopBits\',1,\'Timeout\',1);
fopen(s2); % open session
%befehlsatz 1
fprintf(s2, \'HIER GIBT PROBLEME\'); % sends string
pause(0.1) % pause 0.1s for device to answer
idn = fscanf(s2) % reads the port
fclose(s2); % closes the session

bei Antwort benachrichtigen
Borlander lemec „Programmieren von seriell ( com port ) mit Matlab“
Optionen

Also mir erschließt sich das Problem nicht ganz...
Was spricht dagegen die Byte-Werte je 2 Hexadezimalzahlen entsprechen aus zu geben?

bei Antwort benachrichtigen
Andreas42 Borlander „Also mir erschließt sich das Problem nicht ganz... Was spricht dagegen die...“
Optionen

Hi!

Wenn ich das richtig verstehe, dann hat er dass Prpblem, dass er feste Bytefolgen an ein seriell angeschlossenenes Gerät senden muss, um gewisse Operationen anzustossen.

Eine dumme Implementierung der Steuersoftware, damit verschliesst sich der Hersteller die einfache Steuerung über ein Terminalprogramm - aber dafür kann lemec nichts. :-(

@lemec:

Ich kenne Matlab nicht. In anderen Programmiersprachen gibt es eine Funktion, um aus einem Bytewert ein zeichen zu generieren (auch mit im ASCII/ANSI-Code nicht anzeigbaren Zeichen): CHR$(xx) in Basic zum Beispiel.

Hier müsste man dann nur die Hex-Zahlencodes in Dezimalzahlen umrechnen (aus $FF wird dann 255).

OK, ich hab' mal Google angeworfen (matlab reference) und das hat sofort Onlinereferenzen der Befehle ausgeworfen.

Zumindest Funktionen zum Umrechnen von HEX-Strings in Imnteger gibt es: hex2dec.

Die Funktion sprintf ist nicht die geeignete, da sie keine Wandlung in einen Character durchführt, sondern gedacht ist formatierte Zahelnstrings zu erzeugen.

Schau mal setstr an, das scheint die Aufgabe von CHR$() zu übernehmen.

Bis dann
Andreas

Hier steht was ueber mein altes Hard- und Softwaregedoens.
bei Antwort benachrichtigen
lemec Nachtrag zu: „Programmieren von seriell ( com port ) mit Matlab“
Optionen

('HIER GIBT PROBLEME')zum Beispiel. nach einleitung der steuer karte smci21 die befehl 23 FF 5A 30 31 30 soll eingegeben sein ( damit lese ich bsp. die gespeicherten daten in die steuerkarte aus) aber nach mein prog. kann ich nur als zeichen # ÿ Z 0 1 0 (gem. ASCII-tabelle).alle Zch. kann man nicht einfach so bei Matlab eingeben, deswegen bitte sie darum mir eine andere einfache pro. zu geben oder meine zu korrigieren... ich will hex eingeben... es geht um steuerung von Schrittmotoren. vielen Dank
fprintf(s2, 'HIER GIBT PROBLEME'); % sends string

bei Antwort benachrichtigen
lemec Nachtrag zu: „ HIER GIBT PROBLEME zum Beispiel. nach einleitung der steuer karte smci21 die...“
Optionen

Mit dem folgenden Code kann ich 10 Sätze hintereinander schreiben, es handelt sich um Steuerbefehle. Damit lese ich bzw. starte ich Sätze die im EEPROM gespeichert sind. Das größte Problem liegt es daran dass, ich in jede Befehlsatz mind. 2,1 Sekunde eingeben muss (also bei 1 bis 2 s funktioniert es nicht bzw. wenn ich dabei auch die Antwort beobachte kommen Fehler Meldungen raus). Das soll nicht sein da die Sätze mit einem minimal Zeit von 0,1s hintereinander starten soll. Deshalb bitte ich sie um Hilfe: vielleicht könnte man einfacher schreiben bzw. anders schreiben?! ich würde sehr dankbar wenn sie mir das Programm Korrigieren .Oder mir ein völlig andere Programm (C, C++,…) geben damit ich mit der serielle Schnittstelle kommunizieren. Ich bin leider Biologe und Programmierung ist nicht meiner stärke (kenne nur Matlab).
Ich habe mit einem schnellen Rechner (PC) probiert ohne erfolg. Und ich glaube nicht dass, Matlab zu langsam sei. Es liegt auch nicht an der Steuerkarte da diese schnell genug ist.

s2 = serial('COM2', 'BaudRate', 19200,'Parity','none','Terminator','CR',...
'Databits',8,'StopBits',1,'Timeout',1);

fopen(s2); % open session
%befehlsatz 1
fprintf(s2, char(35,1,121,49,13)); % sends string
pause(2.1)
fprintf(s2, char(35,1,65,13)); % sends string
fclose(s2);

fopen(s2); % open session
%befehlsatz 2
fprintf(s2, char(35,1,121,50,13)); % sends string
pause(2.1)
fprintf(s2, char(35,1,65,13)); % sends string
fclose(s2);

fopen(s2); % open session
%befehlsatz 3
fprintf(s2, char(35,1,121,51,13)); % sends string
pause(2.1)
fprintf(s2, char(35,1,65,13)); % sends string
fclose(s2);

fopen(s2); % open session
%befehlsatz 3
fprintf(s2, char(35,1,121,52,13)); % sends string
pause(2.1)
fprintf(s2, char(35,1,65,13)); % sends string
fclose(s2);

fopen(s2); % open session
%befehlsatz 4
fprintf(s2, char(35,1,121,53,13)); % sends string
pause(2.1)
fprintf(s2, char(35,1,65,13)); % sends string
fclose(s2);

fopen(s2); % open session
%befehlsatz 5
fprintf(s2, char(35,1,121,54,13)); % sends string
pause(2.1)
fprintf(s2, char(35,1,65,13)); % sends string
fclose(s2);

fopen(s2); % open session
%befehlsatz 6
fprintf(s2, char(35,1,121,55,13)); % sends string
pause(2.1)
fprintf(s2, char(35,1,65,13)); % sends string
fclose(s2);

fopen(s2); % open session
%befehlsatz 7
fprintf(s2, char(35,1,121,56,13)); % sends string
pause(2.1)
fprintf(s2, char(35,1,65,13)); % sends string
fclose(s2);

fopen(s2); % open session
%befehlsatz 8
fprintf(s2, char(35,1,121,57,13)); % sends string
pause(2.1)
fprintf(s2, char(35,1,65,13)); % sends string
fclose(s2);

fopen(s2); % open session
%befehlsatz 9
fprintf(s2, char(35,1,121,49,48,13)); % sends string
pause(2.1)
fprintf(s2, char(35,1,65,13)); % sends string
fclose(s2);

fopen(s2); % open session
%befehlsatz 10
fprintf(s2, char(35,1,121,49,49,13)); % sends string
pause(2.1)
fprintf(s2, char(35,1,65,13)); % sends string
fclose(s2);

bei Antwort benachrichtigen