Ansteuerung eines Gerätes... virtueller COM-Port



  • Hallo, ich habe folgendes Problem:
    Ich habe ein Gerät an dem ich per Tasten verschiedene Werte einstellen kann, möchte jedoch dies am PC machen. verbunden ist das Gerät über eine USB-Schnittstelle welches einen virtuellen COM-Port immitiert. Die Treiber sind schon dafür installiert und es funktioniert mit dem mitgeliefertem Programm.
    Wenn ich das richtig verstehe muss ich mir über USB keine Gedanken machen, da es wie eine RS232 Schnittstelle funktioniert, durch den virtuellen COM-Port. Jedoch steht in den Doku eine Codeliste, wie ich jeden Befehl also mit welchem Code ansprechen kann.
    Aber ich bräuchte mal starthilfe bei dem Programm, also COM-Ports initialisieren, und wie ich die befehle lese Wert und schreibe Wert abfrage.

    Würde mich über jede Antwort sehr freuen.
    MfG NexXxuS



  • Nimm am besten eine fertige Klasse. Hier gibt's eine (und der Text dazu ist auch lehrreich):

    http://www.codeproject.com/KB/system/serial.aspx

    EDIT: Gilt natürlich nur für Windows (ich gehe immer so selbstverständlich davon aus, dass Windows gemeint ist... 🙄 ).



  • Standard-C++ kenn keine COM-Ports.
    Das heißt, dein Problem muss weitgehend Betriebssystem-spezifisch gelöst werden (wenns nicht grade ne OS-Unabhängige Bibliothek gibt die sowas kapselt).

    Benutzt du Windows oder Linux?



  • Ja ich brauche das für Win XP. Ich versuch mich mal durch den Link durchzu kämpfen. Vielleicht werde ich ja schlauer. Bin aber schon dankbar für eure Antworten, und würde mich über mehr Tipps freuen.



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • NexXxuS schrieb:

    Ja ich brauche das für Win XP. Ich versuch mich mal durch den Link durchzu kämpfen. Vielleicht werde ich ja schlauer. Bin aber schon dankbar für eure Antworten, und würde mich über mehr Tipps freuen.

    Der Link sollte eigentlich alles sein, was du brauchst, um mit deinem Gerät zu sprechen. Lies dir alles in Ruhe durch, lade dir die Dateien für die Klasse herunter, und versuche, damit eine Kommunikation herzustellen.

    Das mit dem virtuellen COM-Port hast du richtig verstanden. Wir setzen hier auch solche USB-to-Serial-Adapter ein. Du öffnest mit der Klasse einfach den COMx-Port, der verhält sich wie ein 'richtiger'.

    Probier einfach mal, und wenn irgendwelche Details nicht klappen, hast du hier eine ganz gute Anlaufstelle.



  • OK, ich danke erstmal für die Starthilfe. ich versuch das mal zu verstehen bei weiteren Fragen melde ich mich nochmal.

    Vielen Dank nochmal!

    Gruß NexXxuS



  • Hallo, also ich bin jetzt wieder etwas stehen geblieben...
    Ich habe jetzt unteranderem diesen Befehl gesendet:

    //Write Factor1 to 10000
    	std::stringstream ss;
    	ss << std::hex << 0x04 << 0x31 << 0x031 << 0x02 << 0x30 << 0x30 << 0x31 << 0x30 << 0x30 << 0x30 << 0x30 << 0x03 << 0x32 << std::endl; 
    
    	lLastError = serial.Write(ss.str().c_str());
    	if (lLastError != ERROR_SUCCESS)
    		return ::ShowError(serial.GetLastError(), _T("Unable to write factor1"));
    

    Dieser müsste den Faktor1 verändern: Die Hexa Zahlen sind so vom Hersteller generiert.

    Dannach kommt zwar noch das Aktivieren von diesem Wert, in dem Programm solls keine fehler geben aber der Faktor1 verändert sich nicht.
    Jetzt gibt es auch vom Hersteller von diesem Gerät auch einen HexaCode wie ich des abfragen kann ob einfach ein ungültiger Wert gesendet wurde oder einfach dieser HexaCode nicht stimmt, aber ich weiss nicht wie ich es abfragen soll. Es müsste etwas ähnliches mit serial.Read geben und wo ich dann auch Diesen HexaCode übergebe...

    Könnte mir mal da jemand helfen?

    MfG NexXxuS



  • NexXxuS schrieb:

    Es müsste etwas ähnliches mit serial.Read geben und wo ich dann auch Diesen HexaCode übergebe...

    Hab grad nicht so viel Zeit...

    Es gibt ja ein serial.Read. Du musst erst deinen Befehl zur Abfrage mit Write senden und im Anschluss mit Read alles einlesen, was so am Port anliegt (ist bei codeproject auch erwähnt).



  • Ja es ist etwas schwer, und des klappt nicht so wirklich, aber wenn du keine Zeit gerade hast ist ok. Vielleicht versuche ich bis dahin ob die Write methode geht...



  • Moin! 😉

    Ok, nochmal etwas ausführlicher:

    Es gibt keine Read-Methode, der du den Befehl deines Geräts zum Lesen eines Wertes übergeben kannst. Das funktioniert so, dass dein Gerät zwar irgendeinen bestimmten Get-Befehl hat, du diesen aber erstmal per Write senden musst. Im Anschluss musst du alles Lesen, was am COM-Port ankommt. Auf der codeproject-Seite wird das auch beschrieben. Nachdem dein Get-Befehl gesendet wurde, führst du folgenden Code aus:

    codeproject.com schrieb:

    // Read data, until there is nothing left

    DWORD dwBytesRead = 0;
    BYTE abBuffer[100];
    do
    {
    // Read data from the COM-port

    serial.Read(abBuffer,sizeof(abBuffer),&dwBytesRead);
    if (dwBytesRead > 0)
    {
    // TODO: Process the data

    }
    }
    while (dwBytesRead == sizeof(abBuffer));

    Sieh es dir am besten nochmal genau auf der Seite an. Die Puffergröße hängt natürlich davon ab, wie groß die Antwort des Geräts maximal sein kann (und darf ruhig großzügig gewählt werden, damit unter keinen Umständen über den Puffer hinausgeschrieben wird).

    Warum dein Befehl zum Setzen des Faktor1 nicht funktioniert hat, kann ich dir nicht sagen. Woran machst du das fest, wenn du bislang nicht einlesen konntest? Zeigt das Gerät etwas an?

    Jedenfalls sind typische Fehler einfach falsche Einstellungen der Kommunikation (Baudrate, Parität, Datenbits, abschließendes Zeichen für jeden Befehl wie z.B. Carriage Return...). Diese Werte solltest du also nochmal überprüfen. Am besten sehen, dass da alles stimmt, kannst du vielleicht beim Lesen. Du hast ja eine Doku zum Gerät und weißt, welche Antwort auf einen bestimmten Befehl folgen sollte. Bekommst du etwas Passendes, weißt du, dass wahrscheinlich Baudrate usw. stimmen. Bekommst du nur Datenmüll, musst du die Settings anpassen.



  • Ah ok, das ist klar, nur antwortet mir er trotzdem nicht. Ja das Gerät hat ein 2zeilöen Display so kann ich zumindest ablesen ob etwas sich verändert hat. Tut sich aber nichts. Wieso er nicht schreibt weiss ich nicht genau, die Werte stimmen aber überrein, habe die Baudrate, Databits, Stopbits und Parity auch im Gerät selber eingestellt. Also müssten die Einstellungen eigentlich stimmen. Habe jetzt das eigentlich alles überarbeitet, und die beiden Dateien aus Codeproject zusammengesetzt.
    Vielleicht hilft es dir ja wenn ich dir ja mal das ganze Programm schicke, wobei jetzt das Programm nicht zum stehen kommt. Weil ich bis auf des was du mir geschrieben hast noch einiges eingefügt habe, was auf codeproject, unter der Datei Listener war. Vielleicht fällt ja dir etwas auf bei der Gelegenheit.

    Als Antwort müsste ja eigentlich auch bei mir ein Hexa Wert rauskommen, den man mit Hilfe des Datenblattes entziffern kann, ob der Faktor1 geschrieben wurde, oder es Fehler gab.



  • Hm, was sagt denn die Doku, wie du einen Befehl abschließen musst? Du packst ein std::endl in deinen String, also ein Line Feed ('\n'). Ist das so gefordert?



  • Hab den Fehler gefunden... undzwar hat er es ganz einfach nicht ganz richtig den Befehl übertragen... man musste vor jede Hex Zahl ein char setzen.. char(0x04) erstt dann hat es funktioniert mit der übertragung, da das Symbol ja für die Steuerzeichen nicht anzeigbar sind.
    Beim Read befehl bin ich mir aber trotzdem noch net so sicher... Bis jetzt gibt er bei mir auch noch nichts aus in der Konsole.
    Aber vielleicht bastel ich da noch etwas rum! Vielleicht klappt es ja. 🙂
    Bis jetzt danke dass es soweit funktioniert!



  • NexXxuS schrieb:

    Bis jetzt danke dass es soweit funktioniert!

    Wofür? Du hast ja eigentlich alles selbst gemacht... 😃



  • Naja du hast mir wenigstens die Richtung gezeigt... 👍 Trotzdem Danke!


Anmelden zum Antworten