COM Ports unter Windows 98 ansprechen



  • Hallo,

    ich habe schon etwas C++ Erfahrung, aber folgendes Problem überfordert mich ein bisschen:

    Ich will unter Windows 98 SE mit Hilfe von Visual C++ 6.0 eine Tischsteuerung über den COM Port steuern.

    Ich hab mich schon durch einige Dinge durchgelesen, aber bin irgendwie nie erfolgreich gewesen. Mein größtes Problem ist, dass ich nie einen kleinen konkreten Beispielcode finde mit welchem einfach mal paar Bytes rausgeschrieben werden.
    Es geht schon so los, dass wenn ich per CreateFile() ein Handle erzeugen will, dann ist er bei CreateFile("COM1: ", ...) erfolgreich, bei CreateFile("COM2: ", ...) jedoch nicht. Dabei hab ich aber zwei Com Ports aufm Mainboard.
    Außerdem weiß ich dann auch nicht, ob jetzt mit outp() setcommstate() oder sonst was am Besten gearbeitet wird.

    Ich bitte meine Naivität zu entschuldigen, aber ich hab damit bislang einfach noch garnichts zu tun gehabt. Ich würde z.B. einfach nur mal gerne die konkrete Bytefolge 0x37, 0x9C, 0xFF, 0xFF übergeben, um zu sehen, ob sich was bewegt.

    Über eine kurze Aufklärung wäre ich sehr dankbar

    P.S.: Die Tischsteuerung lässt sich mit dem (für meine Zwecke ungeeignetem Herstellertool (DOS) ansprechen, sie ist also nicht defekt und es muss theoretisch irgendwie möglich sein)
    P.P.S: Der COM Port mit der Aufschrift "COM2" wird aktuell für die Tischsteuerung verwendet



  • Mit "\\\.\\COM2" köntest du es mal versuchen.
    Bei Win XP funktuniert es beim öffnen des COM1. Ich kann ohne Fehnermeldung auf den Port schreiben, aber es ist kein Gerät angeschlossen. daher weiß ich nicht ob es erfolgreich ist

    http://msdn.microsoft.com/de-de/library/ms810467



  • Oder die schon hier oft genannte Klasse CSerial verwenden siehe http://www.codeproject.com/KB/system/serial.aspx



  • Ok, ich hab es jetzt mal mit der Klasse CSerial versucht, aber so wirklich weiter bringt mich das auch nicht. Ich hab jetzt mal folgenden Code geschrieben um die binäre Bytefolge 0x37, 0x64, 0xFF, 0xFF zu senden. Leider geht das aber so nicht (int kann nicht in const char* umgewandelt werden...), und ich weiß eben nicht wie genau ich das anstellen soll (sämtliche Beispiele oder sonst was senden immer nur char Bytefolgen, ich will aber binäre Bytefolgen senden). Ich denke die Lösung dazu ist einfach, aber ich komm einfach grad nicht drauf.

    #include <tchar.h>
    #include <windows.h>
    #include "Serial.h"
    
    int main (void)
    {
        CSerial serial;
    
        // Attempt to open the serial port (COM1)
        serial.Open(_T("COM1"));
    
        // Setup the serial port (9600,N81) using hardware handshaking
        serial.Setup(CSerial::EBaud9600,CSerial::EData8,CSerial::EParNone,CSerial::EStop1);
        serial.SetupHandshaking(CSerial::EHandshakeHardware);
    
        // The serial port is now ready and we can send/receive data. If
        // the following call blocks, then the other side doesn't support
        // hardware handshaking.
        serial.Write(0x37);
    	serial.Write(0x64);
    	serial.Write(0xFF);
    	serial.Write(0xFF);
    
        // Close the port again
        serial.Close();
        return 0;
    }
    


  • jojo_mojo schrieb:

    Leider geht das aber so nicht (int kann nicht in const char* umgewandelt werden...)

    Da hast du doch die Fehlerbeschreibung. Über die Schnittstelle können Zeichen oder Zeichenfolgen ausgetauscht werden. Du wandelst die Hex-Werte in Zeichen um und dann sollte es gehen.



  • Per (char) cast oder? Und ist es egal, dass ich jedes Byte mit einem erneutem .Write() schreibe, oder könnte man auch alle vier "auf einen Rutsch schreiben"?



  • vor vielen monden hat mynona etwas dazu geschrieben im dos/win32 konsole faq.

    http://www.c-plusplus.net/forum/39312

    ev. hilft das.

    ps: ist übrigens so lange her, dass hier die formatierung hinüber ist.
    du musst die entsprechenden operatoren leider händisch wieder herstellen



  • jojo_mojo schrieb:

    Per (char) cast oder? Und ist es egal, dass ich jedes Byte mit einem erneutem .Write() schreibe, oder könnte man auch alle vier "auf einen Rutsch schreiben"?

    Wie man das umwandelt steht auf diversen Seiten, die man mit Google findet. Ein direkter Cast ist mir nicht bekannt, es sollte aber über Stringstreams oder mit itoa funktionieren. Wenn ich mich aber recht entsinne, so gibt es von der Methode serial.write doch zwei Überladungen:

    281  	virtual LONG Write (const void* pData, size_t iLen, DWORD* pdwWritten = 0, LPOVERLAPPED lpOverlapped = 0, DWORD dwTimeout = INFINITE);
    282  	virtual LONG Write (LPCSTR pString, DWORD* pdwWritten = 0, LPOVERLAPPED lpOverlapped = 0, DWORD dwTimeout = INFINITE);
    

    Warum nimmst du nicht die zweite und übergibst einen LPCSTR. Die Arbeit mit CStrings ist doch einfacher als das Hantiere mit den chars....

    Ob du jetzt die Zeichen hintereinander oder zusammen sendest hängt ja auch davon ab, was auf der Empfängerseite erwartet wird.



  • sehr gut, danke euch schonmal allen!
    Werde das morgen gleich ausprobieren.
    Die Empfangsseite erwartet die vier Bytes quasi auf einen Packen.



  • So, jetzt hab ich mal bissl was gemacht und bin auch glaube kurz vor der Lösung des Problems.

    Hab mir jetzt ein Tool geholt, welches mir anzeigt, was auf den COM Port geschrieben wird.

    Jetzt wollte ich ja folge Bytefolge schreiben: 0x37 0x9C 0xFF 0xFF
    Realisiert habe ich das folgendermaßen:

    char a = 0x37, b = 0x9C, c = 0xFF, d = 0x00;
    char cBytefolge[] = {a, b, c, c, d};
    
    serial.Write(Bytefolge);
    

    Jetzt hab ich zwei Probleme:

    1. Es werden nur "kleine" Bytes geschrieben (z.B. 0x37), wenn große vorkommen (z.B. 0x9C) dann sendet er nichts. (hab schon unsigned char verwendet aber geht auch nicht)

    2. Ich muss ja 0x00 verwenden um zu zeigen wo der String aufhört. Ich will später jedoch durchaus auch mal das Byte 0x00 versenden, was ja dann aber nicht gehen würde, da der String dann ja abbricht.



  • Edit:
    Er schreibt auch Bytes bis 0xFF, jedoch gilt das nicht für das letzte Byte vor der 0x00 (in meinem Bsp. oben c = 0xFF). Er schreibt die Bytefolge nur (zumindest wird es mir so im Tool angezeigt) wenn dieser Wert <= 0x7F ist, ab 0x80 kommt nichts mehr.


Anmelden zum Antworten