<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[CreateFile schlägt fehl - serielle schnittstelle (kein zugriff)]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich versuche grade mal auf die serielle Schnittstelle zugriff zu nehmen. Ich habe von <a href="http://winapi.net" rel="nofollow">winapi.net</a> aus dem Tutorial den Code genommen, aber es funktioniert leider nicht. Hier der Code (CreateFile schlägt mit Fehlercode 5 fehl (ERROR_ACCESS_DENIED).</p>
<pre><code class="language-cpp">bool init  (int nPort, int nBaud, int nBits, int nStopp, int nParity) 
{
   char szPort[15];
   /*
   if (INVALID_HANDLE_VALUE != hComm)  
       return (TRUE);
*/

    // Aus einer &quot;1&quot; in nPort schreiben wir so &quot;COM1&quot; in szPort z.B..
   wsprintf (szPort, &quot;\\\\.\\COM%d&quot;, nPort);

   hComm = CreateFile (szPort, // COM-Port ffnen
                       GENERIC_READ|GENERIC_WRITE, // wir wollen lesen und schreiben
                       0,
                       0,
                       OPEN_EXISTING,
                       0,
                       NULL); // nicht OVERLAPPED, wir holen uns den Port exclusiv

   if (hComm == INVALID_HANDLE_VALUE) // hat es geklappt? Bei Fehler ist hier Schluss!
   {
		int lasterror = -1;
		char error [200 +1];
		lasterror = GetLastError ();
		(void)sprintf (error, &quot;Fehler beim ffnen des COM-Ports (%d)&quot;, lasterror);

      MessageBox (NULL, error, &quot;CreateFile&quot;, NULL);
      //return false;
   }

   // Alte Timeouts merken. Bei Fehler ist hier Schluss!
   if (!GetCommTimeouts(hComm, &amp;timeouts_alt)) 
   {
      //Close ();
      MessageBox (NULL, &quot;Fehler beim ffnen des COM-Ports!\nGetCommTimeouts()&quot;, 
                  NULL, NULL);
      return false;
   }

   // Eine Struktur vom Typ COMMTIMEOUTS erzeugen und neue Timeouts setzen
   COMMTIMEOUTS timeouts; 
   timeouts.ReadIntervalTimeout         = 200;
   timeouts.ReadTotalTimeoutMultiplier  = 200;
   timeouts.ReadTotalTimeoutConstant    = 200;
   timeouts.WriteTotalTimeoutMultiplier = 200;
   timeouts.WriteTotalTimeoutConstant   = 200;

   // Neue Timeouts setzen. Bei Fehler ist hier Schluss!
   if (!SetCommTimeouts(hComm, &amp;timeouts)) 
   {
      //Close ();
      MessageBox (NULL, &quot;Fehler beim ffnen des COM-Ports!\nSetCommTimeouts()&quot;, 
                  NULL, NULL);
      return false;
   }

   DCB dcb; 
   memset (&amp;dcb, 0, sizeof(dcb)); 

   // Die bestehenden Parameter holen. Bei Fehler ist hier Schluss!
   if (!GetCommState (hComm, &amp;dcb)) 
   {
      //Close ();
      MessageBox (NULL, &quot;Fehler beim ffnen des COM-Ports!\nGetCommState()&quot;, 
                  NULL, NULL);
      return false;
   }
</code></pre>
<p>edit: cpp-Tags korrigiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/91196/createfile-schlägt-fehl-serielle-schnittstelle-kein-zugriff</link><generator>RSS for Node</generator><lastBuildDate>Wed, 22 Apr 2026 06:55:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/91196.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 05 Nov 2004 21:18:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to CreateFile schlägt fehl - serielle schnittstelle (kein zugriff) on Fri, 05 Nov 2004 21:29:05 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich versuche grade mal auf die serielle Schnittstelle zugriff zu nehmen. Ich habe von <a href="http://winapi.net" rel="nofollow">winapi.net</a> aus dem Tutorial den Code genommen, aber es funktioniert leider nicht. Hier der Code (CreateFile schlägt mit Fehlercode 5 fehl (ERROR_ACCESS_DENIED).</p>
<pre><code class="language-cpp">bool init  (int nPort, int nBaud, int nBits, int nStopp, int nParity) 
{
   char szPort[15];
   /*
   if (INVALID_HANDLE_VALUE != hComm)  
       return (TRUE);
*/

    // Aus einer &quot;1&quot; in nPort schreiben wir so &quot;COM1&quot; in szPort z.B..
   wsprintf (szPort, &quot;\\\\.\\COM%d&quot;, nPort);

   hComm = CreateFile (szPort, // COM-Port ffnen
                       GENERIC_READ|GENERIC_WRITE, // wir wollen lesen und schreiben
                       0,
                       0,
                       OPEN_EXISTING,
                       0,
                       NULL); // nicht OVERLAPPED, wir holen uns den Port exclusiv

   if (hComm == INVALID_HANDLE_VALUE) // hat es geklappt? Bei Fehler ist hier Schluss!
   {
		int lasterror = -1;
		char error [200 +1];
		lasterror = GetLastError ();
		(void)sprintf (error, &quot;Fehler beim ffnen des COM-Ports (%d)&quot;, lasterror);

      MessageBox (NULL, error, &quot;CreateFile&quot;, NULL);
      //return false;
   }

   // Alte Timeouts merken. Bei Fehler ist hier Schluss!
   if (!GetCommTimeouts(hComm, &amp;timeouts_alt)) 
   {
      //Close ();
      MessageBox (NULL, &quot;Fehler beim ffnen des COM-Ports!\nGetCommTimeouts()&quot;, 
                  NULL, NULL);
      return false;
   }

   // Eine Struktur vom Typ COMMTIMEOUTS erzeugen und neue Timeouts setzen
   COMMTIMEOUTS timeouts; 
   timeouts.ReadIntervalTimeout         = 200;
   timeouts.ReadTotalTimeoutMultiplier  = 200;
   timeouts.ReadTotalTimeoutConstant    = 200;
   timeouts.WriteTotalTimeoutMultiplier = 200;
   timeouts.WriteTotalTimeoutConstant   = 200;

   // Neue Timeouts setzen. Bei Fehler ist hier Schluss!
   if (!SetCommTimeouts(hComm, &amp;timeouts)) 
   {
      //Close ();
      MessageBox (NULL, &quot;Fehler beim ffnen des COM-Ports!\nSetCommTimeouts()&quot;, 
                  NULL, NULL);
      return false;
   }

   DCB dcb; 
   memset (&amp;dcb, 0, sizeof(dcb)); 

   // Die bestehenden Parameter holen. Bei Fehler ist hier Schluss!
   if (!GetCommState (hComm, &amp;dcb)) 
   {
      //Close ();
      MessageBox (NULL, &quot;Fehler beim ffnen des COM-Ports!\nGetCommState()&quot;, 
                  NULL, NULL);
      return false;
   }
</code></pre>
<p>edit: cpp-Tags korrigiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/645796</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/645796</guid><dc:creator><![CDATA[fluxy]]></dc:creator><pubDate>Fri, 05 Nov 2004 21:29:05 GMT</pubDate></item><item><title><![CDATA[Reply to CreateFile schlägt fehl - serielle schnittstelle (kein zugriff) on Fri, 05 Nov 2004 21:33:43 GMT]]></title><description><![CDATA[<p>fluxy schrieb:</p>
<blockquote>
<p>(CreateFile schlägt mit Fehlercode 5 fehl (ERROR_ACCESS_DENIED).</p>
</blockquote>
<p>Dieser Fehler tritt u.a. dann auf, wenn schon ein anderes Programm den COM-Port benutzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/645802</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/645802</guid><dc:creator><![CDATA[Christoph]]></dc:creator><pubDate>Fri, 05 Nov 2004 21:33:43 GMT</pubDate></item><item><title><![CDATA[Reply to CreateFile schlägt fehl - serielle schnittstelle (kein zugriff) on Fri, 05 Nov 2004 21:45:29 GMT]]></title><description><![CDATA[<p>aha was mache ich denn wenn ich die daten von einem programm lesen will, welches auf den port von der gegenseite schreibt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/645807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/645807</guid><dc:creator><![CDATA[fluxy]]></dc:creator><pubDate>Fri, 05 Nov 2004 21:45:29 GMT</pubDate></item><item><title><![CDATA[Reply to CreateFile schlägt fehl - serielle schnittstelle (kein zugriff) on Sat, 06 Nov 2004 19:03:41 GMT]]></title><description><![CDATA[<p>Wie ist das eigentlich mit WindowsXP und 2000? Ich habe gehört da soll der Zugriff geblockt werden oder so. Im C Standard gab es doch früher auch Funktionen für die Schnittstellen ich glaube die heisse _inp und _outp, die nur assamblercode ausführen....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/646324</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/646324</guid><dc:creator><![CDATA[fluxy]]></dc:creator><pubDate>Sat, 06 Nov 2004 19:03:41 GMT</pubDate></item><item><title><![CDATA[Reply to CreateFile schlägt fehl - serielle schnittstelle (kein zugriff) on Sat, 06 Nov 2004 19:38:56 GMT]]></title><description><![CDATA[<p>fluxy schrieb:</p>
<blockquote>
<p>Im C Standard gab es doch früher auch Funktionen für die Schnittstellen ich glaube die heisse _inp und _outp, die nur assamblercode ausführen....</p>
</blockquote>
<p>Ich kenne den C-Standard nicht auswendig, aber die Unterstriche vor den Funktionsnamen sprechen stark dafür, dass es keine Standardfunktionen waren. Außerdem ist Standard-C plattformunabhängig, daher können _inp und _outp IMHO nicht im Standard gestanden haben.</p>
<blockquote>
<p>aha was mache ich denn wenn ich die daten von einem programm lesen will, welches auf den port von der gegenseite schreibt?</p>
</blockquote>
<p>Ein Port ist eine begrenzte Resource, die nur ein Programm gleichzeitig in Anspruch nehmen kann.</p>
<p>Willst du die Daten mitschneiden, die über das Kabel gehen? Das kann z.B. <a href="http://www.sysinternals.com/ntw2k/freeware/portmon.shtml" rel="nofollow">Portmon</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/646338</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/646338</guid><dc:creator><![CDATA[Christoph]]></dc:creator><pubDate>Sat, 06 Nov 2004 19:38:56 GMT</pubDate></item><item><title><![CDATA[Reply to CreateFile schlägt fehl - serielle schnittstelle (kein zugriff) on Sat, 06 Nov 2004 21:02:48 GMT]]></title><description><![CDATA[<p>nein ich will mich ein wenig mit Mikrocontroler arbeiten. Jemand den ich kenne macht nur eine Platine fertig, mit welcher man z.B. externe Schaltungen über einen Computer steuern kann. Das ganze verfügt über 8 analoge Ein-/Ausgänge und über eine serielle und eine parallele Schnittstelle, über die Daten zum PC gesendet werden können.</p>
<p>ich wollte einfach mal eine Verbindung aufbauen und die Daten von der seriellen Schnittstelle lesen, aber wie es scheint ist das gar nicht so einfach.</p>
<p>Ich habe also eigentlich 2 Programme. Einmal das Programm, welches den Mikrocontroler steuert (wird übertragen) und einmal mein Programm, welches von der Schnittstelle liest.</p>
<p>Gruß Sebastian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/646364</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/646364</guid><dc:creator><![CDATA[fluxy]]></dc:creator><pubDate>Sat, 06 Nov 2004 21:02:48 GMT</pubDate></item><item><title><![CDATA[Reply to CreateFile schlägt fehl - serielle schnittstelle (kein zugriff) on Mon, 08 Nov 2004 07:17:43 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6944">@fluxy</a>,</p>
<p>&quot;Access denied&quot; kommt, wenn schon ein anderes Programm den Port hat (siehe posting von @cd9000).<br />
Außerdem fehlt in Deinem Prog noch die Baudrateneinstellung. Die Timeouts liegen auch völlig daneben, lies mal in der MSDN die Beschreibung.</p>
<p>So klappts:</p>
<pre><code class="language-cpp">// DOS32-Programm zum Senden/Empfangen von Bytes über COM (9600-8N1)
// Alle empfangenen Bytes werden zurückgesendet.
// OS: W95, W98, W98SE, WinME, WinNT, Win2000, WinXP
// Note: Keine Fehlerbehandlung implementiert!
#include &lt;windows.h&gt;
#include &lt;stdio.h&gt;

#define COM_BUFFER_SIZE 256       // Read- und Write-Buffer-Size
#define BD_RATE         CBR_9600 // 9600 Baud
#define HELP_STRING TEXT(&quot;Aufruf mit: progname &lt;COM-Port-Nummer&gt;\r\n&quot;)

// Hauptprogramm: Aufruf mit: progname &lt;COM-Port-Nummer&gt;
int main (int argc, char **argv)
{
	DCB           dcb;    
	DWORD         iBytesWritten;
	BOOL          bRet      = true;
	DWORD         dwRead    = 0;
	DWORD         dwSetMask = EV_RXCHAR | EV_ERR; 
	DWORD         dwEvtMask; 
	OVERLAPPED    o;
	COMMTIMEOUTS  ct;
	unsigned char InString[COM_BUFFER_SIZE + 1];
	TCHAR         szCOM[6];

	if (argc == 2 &amp;&amp;                              // progname + COM-Port-Nummer ?
		  atoi (argv[1]) &gt; 0 &amp;&amp; atoi (argv[1]) &lt; 5) // COM1 ... COM4?
		wsprintf (szCOM, TEXT(&quot;COM%s&quot;), argv[1]);   // String &quot;basteln&quot; ...
	else
	{ 
		printf (TEXT(&quot;\r\nERROR:\t %s&quot;), HELP_STRING);
		return (1); // und tschüß ...
	}

	memset (&amp;o, 0, sizeof (OVERLAPPED)); // Struktur mit 0en füllen
	o.hEvent = CreateEvent (NULL, FALSE, FALSE, NULL); // einen Event setzten

	HANDLE hCom = CreateFile (szCOM, GENERIC_WRITE | GENERIC_READ, 0, NULL, 
		                        OPEN_EXISTING, 0, NULL);                     

	if (hCom == INVALID_HANDLE_VALUE)
	{ // Fehlerausgabe:
		LPVOID lpMsgBuf;
		FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | 
										FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),
										MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &amp;lpMsgBuf, 0, NULL);
		MessageBox (NULL, (LPCTSTR)lpMsgBuf, &quot;Error: CreateFile&quot;, MB_OK | MB_ICONINFORMATION);
		LocalFree (lpMsgBuf);
		return (1); // und tschüß ...
	}

	dcb.DCBlength = sizeof(DCB);  // Laenge des Blockes MUSS gesetzt sein!
	GetCommState (hCom, &amp;dcb);    // COM-Einstellungen holen und aendern
	dcb.BaudRate  = BD_RATE;      // Baudrate
	dcb.ByteSize  = 8;            // Datenbits
	dcb.Parity    = NOPARITY;     // Parität
	dcb.StopBits  = ONESTOPBIT;   // Stopbits
	SetCommState (hCom, &amp;dcb);    // COM-Einstellungen speichern

	GetCommTimeouts (hCom, &amp;ct);
	// Warte-Zeit [ms] vom Beginn eines Bytes bis zum Beginn des nächsten Bytes 
	ct.ReadIntervalTimeout         = 1000 / BD_RATE * (dcb.ByteSize + 
		                                                 (dcb.Parity == NOPARITY ? 0 : 1) + 
																										 (dcb.StopBits == ONESTOPBIT ? 1 : 2)) * 2;
	ct.ReadTotalTimeoutMultiplier  = 0;  // [ms] wird mit Read-Buffer-Size multipliziert
	ct.ReadTotalTimeoutConstant    = 50; // wird an ReadTotalTimeoutMultiplier angehängt
	ct.WriteTotalTimeoutMultiplier = 0;
	ct.WriteTotalTimeoutConstant   = 0;
	SetCommTimeouts (hCom, &amp;ct);

	// Zwischenspeicher des serial-Drivers einstellen (für read und write):
	SetupComm (hCom, COM_BUFFER_SIZE, COM_BUFFER_SIZE);
	SetCommMask (hCom, dwSetMask); // Empfangssignale definieren

	do  // in Endlos-Schleife auf Empfangssignale warten:
	{
		WaitCommEvent (hCom, &amp;dwEvtMask, &amp;o); // Event mit Empfangssignalen verknüpfen

		if (WAIT_OBJECT_0 == WaitForSingleObject (o.hEvent, INFINITE)) // warten bis Event
		{
			if (dwEvtMask &amp; EV_RXCHAR) // Zeichen an RxD empfangen:
			{
				bRet = ReadFile (hCom, &amp;InString, sizeof (InString), &amp;dwRead, NULL);

				if (!bRet)
				{ // Fehlerausgabe:
					LPVOID lpMsgBuf;
					FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | 
													FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),
													MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
													(LPTSTR) &amp;lpMsgBuf, 0, NULL);
					MessageBox (NULL, (LPCTSTR)lpMsgBuf, &quot;Error: ReadFile&quot;, 
											MB_OK | MB_ICONINFORMATION);
					LocalFree (lpMsgBuf);
				}
				else
				{ // Ausgabe (oder Verarbeitung) der empfangenen Bytes:
					InString[dwRead] = '\0'; // in &quot;zero-ended&quot;-String verwandeln
					printf (TEXT(&quot;\r\n\tRxD (%d Byte(s)): %s&quot;), dwRead, InString);
					WriteFile (hCom, &amp;InString, dwRead, &amp;iBytesWritten, NULL); // Senden der Bytes
				}
			}

			if (dwEvtMask &amp; EV_ERR) 
			{
				MessageBox (NULL, &quot;Error empfangen&quot;, &quot;Error: ReadFile&quot;, MB_OK);
				break; // Schleifen-Abbruch
			}
		}
	}
	while (1);

	CloseHandle (hCom);     // COM schließen
	CloseHandle (o.hEvent); // Event-Handle zurückgeben

	return (0);
}
</code></pre>
<p>Die Quellcode-Teile kannst Du nach Belieben in Dein Prog einbauen.</p>
<p>Blackbird</p>
]]></description><link>https://www.c-plusplus.net/forum/post/647046</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/647046</guid><dc:creator><![CDATA[Blackbird]]></dc:creator><pubDate>Mon, 08 Nov 2004 07:17:43 GMT</pubDate></item></channel></rss>