Kommandos über Serielle Schnittstelle

Gast #5673762
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
Gast #5673771
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.
Gast #5673776
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?
Gast #5673790
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.
Gast #5673799
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.
Gast #5673926
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ß...
Gast #5673952
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?
#5674032
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"
Gast #5675934
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
Gast #5675951
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.
Gast #5676065
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)
Gast #5676131
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren