Forum: PC-Programmierung Kommandos über Serielle Schnittstelle


von m.s. (Gast)


Lesenswert?

Hallo,

ich möchte für Testzwecke ein Gerät über eine serielle Schnittstelle 
steuern. Die Schnittstelle ist bereits konfiguriert.
Mir stellt sich dabei jedoch folgende Frage:

Als Befehl zu dem Gerät soll Beispielsweise der Befehl
! T R D CR  übermittelt werden, wobei CR für carriage return steht und 
das Fragezeichen dem Gerät sagt, dass die Nachfolgenden Zeichen ein 
Befehl sind, welcher das besagte Gerät einschalten soll.

Nun zur Frage:
Kann ich diesen Befehl einfach in ein Array schreiben und diesen an das 
Gerät senden?
Oder muss ich dabei noch etwas beachten?

Viele Grüße

von STK500-Besitzer (Gast)


Lesenswert?

m.s. schrieb:
> Als Befehl zu dem Gerät soll Beispielsweise der Befehl
> ! T R D CR  übermittelt werden, wobei CR für carriage return steht und
> das Fragezeichen dem Gerät sagt, dass die Nachfolgenden Zeichen ein
> Befehl sind, welcher das besagte Gerät einschalten soll.
Da ist kein Fragezeichen.

> Nun zur Frage:
> Kann ich diesen Befehl einfach in ein Array schreiben und diesen an das
> Gerät senden?
> Oder muss ich dabei noch etwas beachten?

Versuch's erst mal mit einem Terminalprogramm (z.B. Hterm).
Prinzipiell geht es aber, wie du es vorhast.

von m.s. (Gast)


Lesenswert?

STK500-Besitzer schrieb:
> Da ist kein Fragezeichen.

Ausrufezeichen, Sorry!

Wenn dies so funktioniert wäre die Frage, wie ich eine Baudrate von 
500.000 einstellen kann. Im Gerätemanager kriege ich nur 460.000 hin. 
Wahrscheinlich reicht es nicht, wenn im Programm selbst 500.000 als 
Baudrate definiert ist, richtig? Wie stelle ich diese ein?

von Mike (Gast)


Lesenswert?

>..wie ich eine Baudrate von 500.000 einstellen kann..

Nimm eine Baudrate von 115200. Das ist die höchste Baudrate die in der 
Regel von allen Geräten unterstütz wird und für eine Command-Shell ist's 
bei weitem schnell genug.

von m.s. (Gast)


Lesenswert?

Mike schrieb:
> Nimm eine Baudrate von 115200.

Hallo Mike,

im Geräte-Manager von Windows ist die höchste Wählbare Baudrate 921600. 
Sollte ich diese wählen?
Es wird aber darauf hingewiesen, dass das Gerät explizit eine Baudrate 
von 500.000 haben soll.

von Hauke Haien (Gast)


Lesenswert?

Klingt so, als ob sein Gerät schon auf 500baud steht. Das sollte aber 
z.b. mit einem FTDI USB-Seriell Wandler kein Problem sein. Einfach im 
Terminslprogramm einstellen, z.b. HTERM kann da auch frei konfiguriert 
werden.

Windows Einstellungen sind zumindest für virtuelle com Ports schnurz.

von Oleg (Gast)


Lesenswert?

m.s. schrieb:
> Als Befehl zu dem Gerät soll Beispielsweise der Befehl
> ! T R D CR  übermittelt werden, wobei CR für carriage return steht und
> das Fragezeichen dem Gerät sagt, dass die Nachfolgenden Zeichen ein
> Befehl sind, welcher das besagte Gerät einschalten soll.

Ich glaube aber nicht, daß zwischen zwei Zeichen jeweils ein Leerzeichen 
sein muß...

von m.s. (Gast)


Lesenswert?

Oleg schrieb:
> Ich glaube aber nicht, daß zwischen zwei Zeichen jeweils ein Leerzeichen
> sein muß...

Das war nur so geschrieben, um zu verdeutlichen, dass CR zusammenhängt.

Ich habe mit QT jetzt folgendes gemacht:

Initialisierung:
1
QSerialPort serial;
2
    serial.setPortName("COM3");
3
    serial.open(QSerialPort::ReadWrite);
4
    serial.setBaudRate(500000);
5
    serial.setParity(QSerialPort::NoParity);
6
    serial.setDataBits(QSerialPort::Data8);
7
    serial.setStopBits(QSerialPort::OneStop);
8
    serial.setFlowControl(QSerialPort::NoFlowControl);
Kann man die Baudrate so einfach auf 500.000 setzen? Es gibt beim 
compilieren kein Problem, aber das Programm funktioniert nicht.

Verbindung:
1
if (serial.isOpen() && serial.isWritable()){
2
3
4
    serial.write("?TRd\r");
5
    const QString data2 = serial.readAll();
6
    qDebug() << data2;
7
8
9
    qDebug() << "Erfolgreich" << endl;
10
}else
11
{
12
    qDebug() << "Fehler" << endl;
13
}

Ich komme zwar soweit, dass das innere der If-Abfrage erreicht wird, 
allerdings bekomme ich eine leere qDebug Ausgabe, obwohl eigentlich 
etwas Empfangen werden sollte.

Die COM-Port Nummer ist richtig und die Treiber sind ebenfalls richtig 
installiert. Das Gerät benötigt leider zwingend 500.000 baud. Verbunden 
ist es über einen normalen USB-Stecker.

Hat jemand eine Idee, wo der Fehler liegen könnte?

von Joachim B. (jar)


Lesenswert?

m.s. schrieb:
> Hat jemand eine Idee, wo der Fehler liegen könnte?

weder mit hterm noch mit hyperterminal kann ich unter windowsXP oder 
win7 500k wählen
aber
Beitrag "Re: Hterm 1M Baud"

oder wird man wohl zu Fuss programmieren müssen.
https://github.com/stephane/libmodbus/pull/227/commits/a87fd7815fa5c76d1a4b007f246e9176ae23075e

von Dirk B. (dirkb2)


Lesenswert?

m.s. schrieb:
> Hat jemand eine Idee, wo der Fehler liegen könnte?

Am ? oder ist es ein !

Kommt in jedem Fall eine Antwort?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

m.s. schrieb:
> Das Gerät benötigt leider zwingend 500.000 baud.

Das ist mindestens ungewöhnlich.

von m.s. (Gast)


Lesenswert?

Dirk B. schrieb:
> Kommt in jedem Fall eine Antwort?

Ja, es soll in jedem Fall eine Antwort kommen.
Das ! ist ein Befehl, auf welchen eine Bestätigung folgt.
Das ? ist eine Abfrage, auf welche eine Antwort kommt.

Rufus Τ. F. schrieb:
> Das ist mindestens ungewöhnlich.

Leider ja.

von STK500-Besitzer (Gast)


Lesenswert?

Joachim B. schrieb:
> weder mit hterm

Das dachte ich damals auch.
Bei htem (vom Hammer...) einfach eine Verbindung öffnen und die 
Wunschbaudrate in die Baudraten-Dropdown-Liste eintragen - geht.

von Joachim B. (jar)


Lesenswert?

STK500-Besitzer schrieb:
> Bei htem (vom Hammer...) einfach eine Verbindung öffnen und die
> Wunschbaudrate in die Baudraten-Dropdown-Liste eintragen - geht.

schrieb ich ja
Toralf W. schrieb:
> in HTerm kannst auch 1 MHz einstellen, einfach nicht die Auswahlbox
> nehmen, sonder per Hand dort eintragen was Du brauchst / willst, das
> geht.

Joachim B. schrieb:
> aber
> Beitrag "Re: Hterm 1M Baud"

von olaf (Gast)


Lesenswert?

> kann man die Baudrate so einfach auf 500.000 setzen? Es gibt beim
> compilieren kein Problem, aber das Programm funktioniert nicht.

Man..immer die Leute mit der Gnade der spaeten Geburt. :-)

Urspruenglich wurden in einem PC diverse Uart verwendet (z.B 16450) die 
haben ihre Baudrate durch das runterteilen von einer Quarzfrequenz 
erzeugt. Und aehnliches galt auf immer fuer die Gegenstelle im 
Mikrocontroller.
Deshalb haben auch nur so krumme Baudrate von 1200,2400....115200 
funktioniert. Die Hardware kann einfach nichts anderes!

Bei USB-RS232 Wandler kann das anders aussehen. Es gibt ja garkeine 
Baudrate bei der Verbindung PC-nach USB-Wandler. Die Baudrate wird erst 
im USB-RS232 Baustein neu erzeugt. Und da gibt es welche die koennen 
dann vollkommen beliebige Baudraten. (rationale Teiler) Die ueblichen 
FTDI gehoeren dazu. Aber das kann laengst nicht jeder Baustein! Moderne 
Microcontroller koennen das dann auch.

Jetzt muss man dem Wandler aber auch noch seine ungewoehnliche Baudrate 
mitteilen koennen. Da ist dann leider mal Windows im Vorteil. Dort wird 
die Baudrate direkt als Zahl uebergeben. Wenn das Terminalprogramm 
selbst die Eingabe von 1234Baud unterstuetzt dann funktioniert es. Hterm 
gehoert zu den Programmen wo es funktioniert.

Bei Linux sieht das etwas anderes aus. Da gibt es fuer die Baudraten 
spezielle Defines. Das sind dann ungewoehnliche Baudraten erstmal nicht 
vorgesehen und auch nicht moeglich. Allerdings wurde das Interface mal 
irgendwann erweitert und es gibt da einen ungewoehnlichen Weg der Port 
doch eine andere Baudarte mitzuteilen. Ich hab mal vor ein paar Jahren 
mein minicom fuer 250000Baud gepatcht. Da geht es also auch.

Grundvoraussetzung ist aber immer das de USB-RS232 Wandler das koennen 
muss!

Olaf

von test (Gast)


Lesenswert?

m.s. schrieb:
> const QString data2 = serial.readAll();

readALL() wartet bis ein CR kommt, oder will es ein LF/CR. Oder gibt es 
einfach den akktuellen Empfangsbuffer zurück? Sendet das Gerät Oberhaupt 
CR oder LF?

Sende einfach mal das Kommando und lasse dir alle Byte anzeigen die dir 
das Gerät zurück sendet. Bei deinem Code siehst du überhaupt nicht was 
da passiert.

von A. S. (Gast)


Lesenswert?

m.s. schrieb:
> Das Gerät benötigt leider zwingend 500.000 baud. Verbunden ist es über
> einen normalen USB-Stecker.

Irgend etwas stimmt nicht.

Bitte Gerät angeben (Datenblatt, Foto, ...).

Wie sind denn die anderen Daten der Schnittstelle?

Ob die eingestellte baudrate stimmt, mit Oszi oder Stoppuhr messen (Led 
dran, 100Mb-file per copy übertragen, Zeit stoppen, rechnen)

von HennesB (Gast)


Lesenswert?

m.s. schrieb:
> Hat jemand eine Idee, wo der Fehler liegen könnte?

Evtl. am "kleinen d" in "?TRd\n" (Initialer Post: "!TRD\n")?

von Äxl (Gast)


Lesenswert?

"\n" ist aber nicht CR, sondern "newline".
Ich würde es mit "\r" versuchen. Mal mit beiden Kombinationen "\r\n", 
usw.
mit "wem" musst du dich denn da auf der seriellen rumärgern? Evtl. hätt 
Schimmel jemand das gleiche "Problem" gehabt.
Forum eben. Schwarmwissen abrufen setzt aber auch ein gewisses Maß an 
Input voraus.
Also: welches Gerät? Datenblatt, Typ, Foto?

von Äxl (Gast)


Lesenswert?

Schimmel -> schon mal (iPhone)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Äxl schrieb:
> Schimmel -> schon mal

Auch am iPhone kann man die nutzlose Rechtschreibkorrektur abschalten.

von Bert3 (Gast)


Lesenswert?

Name, Typ des Geräts? Oder die Doku als Download...

500.000 baud ist echt sehr/zu ungewöhnlich

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.