Com Schnittstelle ansteuern



  • Ich habe gesucht, und nichts gefunden.
    Ich benutze DEV-C++ und möchte ein einfaches Programm haben, was einfach nur H32 z.B. an den Comport sendet. Hat jemand hierfür vielleicht eine simple lösung oder tipp? Und bitte nicht mit "Google weiß es antworten, das bringt mich auch nicht weiter".



  • Ok, Du bist im falschen Forum.
    Das hier ist C++/CLI (ich spar mir den Rest).

    Diese Klasse hier sollte Dir weiterhelfen, falls Du für Windows entwickelst:
    http://www.codeproject.com/KB/system/serial.aspx

    BTW: DevC++ wird nicht mehr weiterentwickelt. Aktuelle Alternaiven sind Code::Blocks und Visual Studio 2008 Express. Beide sind gratis.

    Simon



  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET 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.



  • Das Problem ist, das ich einen Code habe der hinsendet, nur nun öffnet er garnicht erst den COM Port, ist WIN 2000 der Code lautet:

    #define STRICT
    #include <tchar.h>
    #include <windows.h>
    #include "Serial.h"
    
    int ShowError (LONG lError, LPCTSTR lptszMessage)
    {
    	// Generate a message text
    	TCHAR tszMessage[256];
    	wsprintf(tszMessage,_T("%s\n(error code %d)"), lptszMessage, lError);
    
    	// Display message-box and return with an error-code
    	::MessageBox(0,tszMessage,_T("H32"), MB_ICONSTOP|MB_OK);
    	return 1;
    }
    
    int WINAPI _tWinMain (HINSTANCE /*hInst*/, HINSTANCE /*hInstPrev*/, LPTSTR /*lptszCmdLine*/, int /*nCmdShow*/)
    {
        CSerial serial;
    	LONG    lLastError = ERROR_SUCCESS;
    
        // Attempt to open the serial port (COM1)
        lLastError = serial.Open(_T("COM1"),0,0,false);
    	if (lLastError != ERROR_SUCCESS)
    		return ::ShowError(serial.GetLastError(), _T("Ich kann den Port nicht oeffnen"));
    
        // Setup the serial port (9600,N81) using hardware handshaking
        lLastError = serial.Setup(CSerial::EBaud9600,CSerial::EData8,CSerial::EParNone,CSerial::EStop1);
    	if (lLastError != ERROR_SUCCESS)
    		return ::ShowError(serial.GetLastError(), _T("Ich kann die einstellungen nicht setzen"));
    
    	// Setup handshaking
        lLastError = serial.SetupHandshaking(CSerial::EHandshakeHardware);
    	if (lLastError != ERROR_SUCCESS)
    		return ::ShowError(serial.GetLastError(), _T("Unable to set COM-port handshaking"));
    
        // 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.
        lLastError = serial.Write("h32\n");
    	if (lLastError != ERROR_SUCCESS)
    		return ::ShowError(serial.GetLastError(), _T("Ich kann die Daten nicht senden"));
    
        // Close the port again
        serial.Close();
        return 0;
    }
    


  • Beschreib dein Problem genauer.
    Fehlermeldungen? Wo im Code ist das Problem.
    Benutze den Debugger.
    Simon



  • Hallo Simon, das Programm wird ganz normal ohne Fehlermeldung geschrieben. Der Comport ist instaliert, und es ist ein Gerät angeschlossen, das Programm sagt aber nur die 1. Fehlermeldung, sprich es ist nicht in der Lage den Comport zu öffnen, laut VISUAL Studio 2008 ist nichts falsch gelaufen.



  • Und welchen Wert hat lLastError?



  • Beim Compilieren gibt VS08 folgendes aus:

    "HelloWorld.exe": "C:\Dokumente und Einstellungen\p.scheibe\Desktop\Serial_demo\Serial\_Output\Release\HelloWorld.exe" geladen, Symbole wurden geladen.
    "HelloWorld.exe": "C:\WINDOWS\system32\ntdll.dll" wurde geladen
    "HelloWorld.exe": "C:\WINDOWS\system32\kernel32.dll" wurde geladen
    "HelloWorld.exe": "C:\WINDOWS\system32\user32.dll" wurde geladen
    "HelloWorld.exe": "C:\WINDOWS\system32\gdi32.dll" wurde geladen
    "HelloWorld.exe": "C:\Programme\Kaspersky\adialhk.dll" wurde geladen
    "HelloWorld.exe": "C:\WINDOWS\system32\advapi32.dll" wurde geladen
    "HelloWorld.exe": "C:\WINDOWS\system32\rpcrt4.dll" wurde geladen
    "HelloWorld.exe": "C:\WINDOWS\system32\secur32.dll" wurde geladen
    "HelloWorld.exe": "C:\WINDOWS\system32\shlwapi.dll" wurde geladen
    "HelloWorld.exe": "C:\WINDOWS\system32\msvcrt.dll" wurde geladen
    "HelloWorld.exe": "C:\Programme\Kaspersky\adialhk.dll" entladen.
    "HelloWorld.exe": "C:\WINDOWS\system32\shlwapi.dll" entladen.
    "HelloWorld.exe": "C:\WINDOWS\system32\msvcrt.dll" entladen.
    "HelloWorld.exe": "C:\WINDOWS\system32\advapi32.dll" entladen.
    "HelloWorld.exe": "C:\WINDOWS\system32\rpcrt4.dll" entladen.
    "HelloWorld.exe": "C:\WINDOWS\system32\secur32.dll" entladen.
    Das Programm "[2012] HelloWorld.exe: Systemeigen" wurde mit Code 1 (0x1) beendet.



  • Debugge doch mal.
    Oder schau wenigstens den Konsolen Output an, der zeigt den Wert von lLastError nämlich an.

    Und hey, wenn Du die Fragen nicht verstehst, dann schreib nicht einfach irgendwas rein, sondern frag danach. Ist das so schwer?

    Simon



  • Maiduba87 schrieb:

    Beim Compilieren gibt VS08 folgendes aus:

    "HelloWorld.exe": "C:\Dokumente und Einstellungen\p.scheibe\Desktop\Serial_demo\Serial\_Output\Release\HelloWorld.exe" geladen, Symbole wurden geladen.
    "HelloWorld.exe": "C:\WINDOWS\system32\ntdll.dll" wurde geladen
    "HelloWorld.exe": "C:\WINDOWS\system32\kernel32.dll" wurde geladen
    "HelloWorld.exe": "C:\WINDOWS\system32\user32.dll" wurde geladen
    "HelloWorld.exe": "C:\WINDOWS\system32\gdi32.dll" wurde geladen
    "HelloWorld.exe": "C:\Programme\Kaspersky\adialhk.dll" wurde geladen
    "HelloWorld.exe": "C:\WINDOWS\system32\advapi32.dll" wurde geladen
    "HelloWorld.exe": "C:\WINDOWS\system32\rpcrt4.dll" wurde geladen
    "HelloWorld.exe": "C:\WINDOWS\system32\secur32.dll" wurde geladen
    "HelloWorld.exe": "C:\WINDOWS\system32\shlwapi.dll" wurde geladen
    "HelloWorld.exe": "C:\WINDOWS\system32\msvcrt.dll" wurde geladen
    "HelloWorld.exe": "C:\Programme\Kaspersky\adialhk.dll" entladen.
    "HelloWorld.exe": "C:\WINDOWS\system32\shlwapi.dll" entladen.
    "HelloWorld.exe": "C:\WINDOWS\system32\msvcrt.dll" entladen.
    "HelloWorld.exe": "C:\WINDOWS\system32\advapi32.dll" entladen.
    "HelloWorld.exe": "C:\WINDOWS\system32\rpcrt4.dll" entladen.
    "HelloWorld.exe": "C:\WINDOWS\system32\secur32.dll" entladen.
    Das Programm "[2012] HelloWorld.exe: Systemeigen" wurde mit Code 1 (0x1) beendet.

    Und das ist übrigens nicht beim Kompilieren. Auch nicht beim Linken. Sondern zur Laufzeit (und das sogar noch im Debugger!!!)!!!
    Simon



  • Problem gelöst.



  • ...dass ich diesen Thread ausgrabe, aber dank google.de landete ich hier.

    Und zwar möchte ich einen Antriebssteuerung per RS232 ansprechen bzw. programmieren. Per Hyperterminal kein Problem, aber das ganze sollte nun in C ablaufen.

    Was ich bisher gelesen habe sagt mir, dass man nur mit "C" nicht weitkommt, wenn man WINxp und RS232 zusammenbringen möchte.
    Ok, habe von http://www.codeproject.com/KB/system/serial.aspx die Demo mit Sourcecode runtergeladen, aber wie binde ich das nun in meinen LCC32 ein?

    Die serial.h habe ich in den "include"-Ordner geschmissen und die wird beim kompilieren auch gefunden, aber dann erhalte ich weiterhin massig Fehlermeldungen wie zum Beispiel "no type specified. Defaulting to int" etc.

    Kann mir jemand eine kurze Anleitung schreiben, wie man die Geschichte von "codeproject.com" in seinen LCC32 (oder einen anderen Kompilier) einbindet?

    Und vielleicht hat ja jemand von euch dirket die Lösung für mein Problem: Ein Programm das Strings per COM-Schnittstelle versendet. 😕

    danke schon mal für die Hilfe 👍

    PS: Das ist der Code mit dem ich die Serial-Sache testen wollte.

    #define STRICT
    #include <tchar.h>
    #include <windows.h>
    #include "Serial.h"
    
    int WINAPI _tWinMain
              (
               HINSTANCE /*hInst*/,
               HINSTANCE /*hInstPrev*/,
               LPTSTR    /*lptszCmdLine*/,
               int       /*nCmdShow*/
              )
    {
        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("Hello world");
    
        // Close the port again
        serial.Close();
        return 0;
    }
    


  • Hallo.

    Schon mal nach SetCommTimeouts gegoogelt? Alle Register des 16550 vorhanden. Ausser Loopback.

    Gruß

    Lars



  • 😕

    Öhm sorry, aber ich versteh nur Bahnhof.

    SetCommTimeouts ist doch dafür verantwortlich wie lange zwischen jedem Senden gewartet wird? Was für Register 16550 und Loopback, ist der Satz ne Frage oder eine Feststellung ?

    Ich will doch nur die Serial.h-Geschichte korrekt in meinen LCC-Win32 integrieren, damit der oben stehende Code korrekt kompiliert wird 😞



  • Juhu,

    es tut. Zwar nicht mit der serial.h, aber mit der guten alten WinAPI. Und einen Zeilenumbruch / Return / Enter sendet man mit "\r\n" und nicht nur mit "\n"...bis ich das raus hatte.

    Schönen Tag noch!


Anmelden zum Antworten