<?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[AT-Befehle]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte über die serielle Schnittstelle mit einem Modem kommunizieren.<br />
Das Problem ist nicht die Verbindung, sondern die Übertragung der Befehle.<br />
So sieht meine Funktion aus:</p>
<pre><code class="language-cpp">if(m_bConnectStatus == TRUE)
	{
		char* atCommand = &quot;AT&quot;;

		port.WriteByte((unsigned char)atCommand);
	}
</code></pre>
<p>Ich möchte also nur einmal den AT Befehl schicken, um als Antwort &quot;OK&quot; zu bekommen. Die Funktion WriteByte sieht so aus:</p>
<pre><code class="language-cpp">BOOL CSerialPort::WriteByte(BYTE bybyte)
{
	iBytesWritten=0;
if(WriteFile(hComm,&amp;bybyte,1,&amp;iBytesWritten,NULL)==0)
return false;
else return true;
}
</code></pre>
<p>Die Klasse CSerialPort hab ich mir heruntergeladen.</p>
<p>Kann mir jemand helfen</p>
<p>MfG<br />
Sebastian</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/51261/at-befehle</link><generator>RSS for Node</generator><lastBuildDate>Sun, 31 May 2026 14:20:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/51261.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 08 Oct 2003 14:30:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to AT-Befehle on Wed, 08 Oct 2003 14:30:24 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte über die serielle Schnittstelle mit einem Modem kommunizieren.<br />
Das Problem ist nicht die Verbindung, sondern die Übertragung der Befehle.<br />
So sieht meine Funktion aus:</p>
<pre><code class="language-cpp">if(m_bConnectStatus == TRUE)
	{
		char* atCommand = &quot;AT&quot;;

		port.WriteByte((unsigned char)atCommand);
	}
</code></pre>
<p>Ich möchte also nur einmal den AT Befehl schicken, um als Antwort &quot;OK&quot; zu bekommen. Die Funktion WriteByte sieht so aus:</p>
<pre><code class="language-cpp">BOOL CSerialPort::WriteByte(BYTE bybyte)
{
	iBytesWritten=0;
if(WriteFile(hComm,&amp;bybyte,1,&amp;iBytesWritten,NULL)==0)
return false;
else return true;
}
</code></pre>
<p>Die Klasse CSerialPort hab ich mir heruntergeladen.</p>
<p>Kann mir jemand helfen</p>
<p>MfG<br />
Sebastian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/368387</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/368387</guid><dc:creator><![CDATA[Mahoney]]></dc:creator><pubDate>Wed, 08 Oct 2003 14:30:24 GMT</pubDate></item><item><title><![CDATA[Reply to AT-Befehle on Wed, 08 Oct 2003 17:03:30 GMT]]></title><description><![CDATA[<p>Wie war die Frage noch mal ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/368556</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/368556</guid><dc:creator><![CDATA[Knuddlbaer]]></dc:creator><pubDate>Wed, 08 Oct 2003 17:03:30 GMT</pubDate></item><item><title><![CDATA[Reply to AT-Befehle on Wed, 08 Oct 2003 18:14:16 GMT]]></title><description><![CDATA[<p>Okay sorry, war vielleicht nicht ganz eindeutig.</p>
<p>Mein Problem ist folgendes:</p>
<p>Ich habe eine Verbindung über den COM Port zu meinem Handy hergestellt und möchte Daten senden bzw. empfangen. Dazu gibt es die sog. AT-Befehle (Hayes-Befehlssatz) mit denen man das interen Modem des Handy ansprechen kann.<br />
Wenn ich also z.B. per Hyperterminal den Befehl &quot;AT&quot; eingebe, antwortet das Handy mit &quot;OK&quot;.<br />
Jetzt weiß ich nur nicht so recht, wie ich den Befehl angeben soll.<br />
Mit dieser Funktion müsste das gehen:</p>
<pre><code class="language-cpp">BOOL CSerialPort::WriteByte(BYTE bybyte)
{
	iBytesWritten=0;
if(WriteFile(hComm,&amp;bybyte,1,&amp;iBytesWritten,NULL)==0)
return false;
else return true;
}
</code></pre>
<p>Wobei ja immer nur ein Zeichen geschrieben wird.</p>
<p>Also die Frage: Wie muss ich den Befehl/die Daten senden und was muss ich beim empfangen beachten (Pause einhalten/Timer?)?</p>
<p>MfG<br />
Sebastian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/368594</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/368594</guid><dc:creator><![CDATA[Mahoney]]></dc:creator><pubDate>Wed, 08 Oct 2003 18:14:16 GMT</pubDate></item><item><title><![CDATA[Reply to AT-Befehle on Thu, 09 Oct 2003 06:42:18 GMT]]></title><description><![CDATA[<p>Ähm, sehe ich das richtig, das du einen char* auf byte castest? Da nimmt er natürlich nur das erste Zeichen (A).<br />
Da musste schon in einer Schleife durch den String gehen und jedes Zeichen einzeln senden. Der AT Befehl sollte nach ein paar ms auch OK zurückgeben.</p>
<p>Tschau</p>
]]></description><link>https://www.c-plusplus.net/forum/post/368796</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/368796</guid><dc:creator><![CDATA[Modem]]></dc:creator><pubDate>Thu, 09 Oct 2003 06:42:18 GMT</pubDate></item><item><title><![CDATA[Reply to AT-Befehle on Thu, 09 Oct 2003 10:05:15 GMT]]></title><description><![CDATA[<p>Okay danke, dass mit dem Befehl schreiben haut jetzt hin, hab meine Funtion etwas abgeändert:</p>
<pre><code class="language-cpp">BOOL CSerialPort::WriteByte(const char* bybyte)
{
	iBytesWritten=0;
if(WriteFile(hComm,bybyte,strlen(bybyte),&amp;iBytesWritten,NULL)==0)
	return false;
else return true;
}
</code></pre>
<p>Jetzt stellt sich für mich die Frage des Empfangens?<br />
Denk mir mal, dass ich die Bytes/Char einzel empfangen muss und dann in einen String zusammenfügen,oder? Deshalb sieht meine Funktion im Moment so aus:</p>
<pre><code class="language-cpp">char CSerialPort::ReadByte(char text)
{
	ReadFile(hComm, &amp;text, 1, &amp;received, 0);

	return(text);	 		 
}
</code></pre>
<p>Aber so funzt es net wirklich?! Wie kann ich es besser machen?</p>
<p>Gruß<br />
Sebastian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/368939</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/368939</guid><dc:creator><![CDATA[Mahoney]]></dc:creator><pubDate>Thu, 09 Oct 2003 10:05:15 GMT</pubDate></item><item><title><![CDATA[Reply to AT-Befehle on Thu, 09 Oct 2003 10:55:29 GMT]]></title><description><![CDATA[<p>Das müssen wir anders machen...</p>
<p>folgendes würde funzen:</p>
<pre><code class="language-cpp">char CSerialPort::ReadByte() 
{ 
    ReadFile(hComm, &amp;text, 1, &amp;received, 0); /* ist received und hComm global???*/
    return text;               
}
</code></pre>
<p>aber wenn man alle verfügbaren zeichen kriegen will:(hier mit Call-By-Reference)<br />
im Hauptprgramm:</p>
<pre><code class="language-cpp">char * text;
</code></pre>
<p>und in der Klasse:</p>
<pre><code class="language-cpp">void CSerialPort::ReadByte( char * text) 
{ 
    ReadFile(hComm, &amp;text, 100 /*denke das reicht...*/, &amp;received, 0); /* ist received und hComm global???*/
    return text;               
}
</code></pre>
<p>ReadFile kehrt zurück, wenn keine Zeichen mehr anliegen... Deshalb sollte das mit 100 oder X funktionieren...</p>
<p>Tschau</p>
]]></description><link>https://www.c-plusplus.net/forum/post/368980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/368980</guid><dc:creator><![CDATA[Modem]]></dc:creator><pubDate>Thu, 09 Oct 2003 10:55:29 GMT</pubDate></item><item><title><![CDATA[Reply to AT-Befehle on Fri, 10 Oct 2003 12:39:02 GMT]]></title><description><![CDATA[<p>Hallo nochmal,<br />
irgendwie hab ich glaub ich ein grundlegendes Problem und komm einfach nicht dahinter. Also mein Funktionsaufruf sieht so aus:</p>
<pre><code class="language-cpp">void CHandytoolDlg::OnSendat() 
{
	// TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen

	if(m_bConnectStatus == TRUE)
	{
		const char* atCommand = &quot;AT\n&quot;;  // bringt mir an dieser Stelle \n ein 'ENTER' ?
		port.WriteByte(atCommand);
	}

	Sleep(1000);

	char* response, *display;	

	display = port.ReadByte(response);

}
</code></pre>
<p>Ich möchte das so machen, wie es im Hyperterminal funzt. Man gibt AT ein und bestätigt mit 'ENTER' - danach kommt die Antwort OK.</p>
<p>Also sende ich den Befehl an den COM Port:</p>
<pre><code class="language-cpp">BOOL CSerialPort::WriteByte(const char* bybyte)
{
	unsigned long size = strlen(bybyte);
	iBytesWritten=0;
	if(WriteFile(hComm,bybyte, size,&amp;iBytesWritten,NULL)==0)
		return false;
	else return true;
}
</code></pre>
<p>Da es dann ja einige ms dauert bis die Antwort am COM Port liegt hab ich mal nen Sleep (großzügig) eingebaut. Bringt das was?</p>
<p>Die Funktion zum auslesen:</p>
<pre><code class="language-cpp">char* CSerialPort::ReadByte(char* text)
{
	DWORD dwBytesRead;	

	ReadFile(hComm, text, 100, &amp;dwBytesRead, 0);

	return text;	 		 
}
</code></pre>
<p>hComm ist global.</p>
<p>Kann das alles so überhaupt funktionieren?</p>
<p>Gruß<br />
Sebastian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/369859</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/369859</guid><dc:creator><![CDATA[Mahoney]]></dc:creator><pubDate>Fri, 10 Oct 2003 12:39:02 GMT</pubDate></item><item><title><![CDATA[Reply to AT-Befehle on Fri, 10 Oct 2003 12:47:18 GMT]]></title><description><![CDATA[<p>Ich sehe da auf den ersten Blick kein grundsätzliches Problem. Es könnte aber sein, dass ReadFile erst dann zurückkommt, wenn alle 100 angeforderten Bytes empfangen wurden.</p>
<p>Mit SetCommTimeouts könntest du dafür sorgen, dass ReadFile vorher zurückkommt.</p>
<p>NACHTRAG:<br />
Es ist nicht sinnvoll, den Zeiger auf den Puffer zurückzugeben, der ist ja schon Parameter. Gib lieber die Anzahl der empfangenen Zeichen zurück.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/369866</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/369866</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Fri, 10 Oct 2003 12:47:18 GMT</pubDate></item><item><title><![CDATA[Reply to AT-Befehle on Fri, 10 Oct 2003 14:05:03 GMT]]></title><description><![CDATA[<p>Hallo,<br />
danke erstmal für die Infos. Ich glaub der Fehler liegt schon beim schreiben des Befehls. Hab jetzt mal nen WaitCommEvent() hinzugefügt der empfangene Char meldet. Aber da kommt nix. Ich muss die Befehle ja mit nem 'ENTER' beenden. Dann dürfte es doch reichen, wenn ich \n dranhäng?</p>
<pre><code class="language-cpp">void CHandytoolDlg::OnSendat() 
{
	// TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen

	if(m_bConnectStatus == TRUE)
	{
		const char* atCommand = &quot;AT+CMGR=1\n&quot;;
		port.WriteByte(atCommand);
	}

	DWORD data = EV_RXCHAR;
	if(WaitCommEvent(port.hComm, &amp;data, NULL) == 0)
		MessageBox(&quot;Es liegen keine Daten an.&quot;,&quot;Fehler&quot;,MB_OK+MB_ICONINFORMATION);
	else
	{
		char* response, *display;	
		display = port.ReadByte(response);
	}	
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/369922</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/369922</guid><dc:creator><![CDATA[Mahoney]]></dc:creator><pubDate>Fri, 10 Oct 2003 14:05:03 GMT</pubDate></item><item><title><![CDATA[Reply to AT-Befehle on Fri, 10 Oct 2003 14:16:06 GMT]]></title><description><![CDATA[<p>'\n' ist ein Linefeed. IIRC brauchst du für AT-Kommandos ein Carriage Return '\r'.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/369931</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/369931</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Fri, 10 Oct 2003 14:16:06 GMT</pubDate></item><item><title><![CDATA[Reply to AT-Befehle on Fri, 10 Oct 2003 14:28:49 GMT]]></title><description><![CDATA[<p>Okay.<br />
Dann sollte doch aber die WaitCommEvent() direkt mitteilen, dass Daten anliegen? Hab EV_RXCHAR noch durch EV_RXFLAG ersetzt.<br />
Laut MSDN :</p>
<blockquote>
<p>EV_RXFLAG The event character was received and placed in the input buffer. The event character is specified in the device's DCB structure, which is applied to a serial port by using the SetCommState function.</p>
</blockquote>
<p>Irgendwie komm ich damit noch nicht so ganz klar. Ist mein erstes Projekt mit der seriellen Schnittstelle und ich weiß auch nicht so recht, wie und wo ich die Fehler suchen soll. Aber ich denke, dass genau da der Fehler liegt, weil die Verbindung an sich ja steht.</p>
<p>Vielleicht kannst du mir ja nen Rat geben</p>
<p>Gruß<br />
Sebastian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/369940</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/369940</guid><dc:creator><![CDATA[Mahoney]]></dc:creator><pubDate>Fri, 10 Oct 2003 14:28:49 GMT</pubDate></item><item><title><![CDATA[Reply to AT-Befehle on Fri, 10 Oct 2003 14:30:52 GMT]]></title><description><![CDATA[<p>Du kannst WaitCommEvent nicht vorgeben, worauf es warten soll. Der zweite Parameter ist ein out-Parameter, d.h. WaitCommEvent schreibt da rein, was passiert ist.</p>
<p>Wenn der Rückgabewert von Null verschieden ist, musst du den Inhalt von data prüfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/369945</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/369945</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Fri, 10 Oct 2003 14:30:52 GMT</pubDate></item><item><title><![CDATA[Reply to AT-Befehle on Fri, 10 Oct 2003 14:38:47 GMT]]></title><description><![CDATA[<p>Also eher sowas in der Art:</p>
<pre><code class="language-cpp">void CHandytoolDlg::OnSendat() 
{
	// TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen

	if(m_bConnectStatus == TRUE)
	{
		char* atCommand = &quot;AT+CMGR=1\r&quot;;
		port.WriteByte(atCommand);
	}

	DWORD data;
	if(WaitCommEvent(port.hComm, &amp;data, NULL) == 0)
		MessageBox(&quot;Es liegen keine Daten an.&quot;,&quot;Fehler&quot;,MB_OK+MB_ICONINFORMATION);
	else
	{
		if(data == EV_RXFLAG)
		{
			char* response, *display;	
			display = port.ReadByte(response);
		}
	}	
}
</code></pre>
<p>Aber irgendwie liefert die Funktion immer nur 0 zurück.</p>
<p>Woran könnte das liegen?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/369955</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/369955</guid><dc:creator><![CDATA[Mahoney]]></dc:creator><pubDate>Fri, 10 Oct 2003 14:38:47 GMT</pubDate></item><item><title><![CDATA[Reply to AT-Befehle on Fri, 10 Oct 2003 16:16:59 GMT]]></title><description><![CDATA[<p>Ich hab mich mal ein wenig schlau gemacht: Offenbar kannst du mit SetCommMask festlegen, worauf WaitCommEvent warten soll.</p>
<p>In jedem Fall solltest du GetLastError aufrufen, wenn WaitCommEvent fehlschlägt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/370009</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/370009</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Fri, 10 Oct 2003 16:16:59 GMT</pubDate></item><item><title><![CDATA[Reply to AT-Befehle on Sat, 11 Oct 2003 14:31:33 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>hab jetzt mal meine Funktionen mit GetLastError() gecheckt und es funktioniert auch alles bis auf die ReadByte() Funktion. Hier ist sie nochmal:</p>
<pre><code class="language-cpp">char* CSerialPort::ReadByte(char* text)
{
	DWORD dwBytesRead;	

	ReadFile(hComm, text, 100, &amp;dwBytesRead, 0);

	DWORD dwErrorReport;
	dwErrorReport = GetLastError();

	return text;	 		 
}
</code></pre>
<p>Die Fehlermeldung die ich bekomm ist:<br />
Unzulässiger Zugriff auf einen Speicherbereich. [998]</p>
<p>Kann mir da jemand weiterhelfen?</p>
<p>Gruß<br />
Sebastian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/370363</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/370363</guid><dc:creator><![CDATA[Mahoney]]></dc:creator><pubDate>Sat, 11 Oct 2003 14:31:33 GMT</pubDate></item><item><title><![CDATA[Reply to AT-Befehle on Sat, 11 Oct 2003 15:21:46 GMT]]></title><description><![CDATA[<p>Tja, worauf zeigt denn der Zeiger, den du als Parameter übergibst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/370385</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/370385</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Sat, 11 Oct 2003 15:21:46 GMT</pubDate></item></channel></rss>