Hjälp med C kod exempel för att läsa AT kommandon med PIC

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
Jones
Inlägg: 16
Blev medlem: 24 oktober 2005, 10:43:44
Ort: Norrköping
Kontakt:

Hjälp med C kod exempel för att läsa AT kommandon med PIC

Inlägg av Jones »

Hej!
Letar efter exempel och exempelkod i (helst) c på hur man kan läsa av svarskommandon (ASCII tecken) som kommer in via UART. Har interruptstyrd UART som läser in en byte o lägger den i en array. Problemet är sen att försöka sålla ut vad som har kommit in på ett bra sätt.
Programmet ska användas till kommunikation mellan en PIC18F o en GPRS modul som kommuniserar via AT kommandon. Har funderat på nån variant av Switch och case satser men jag vet inte riktigt. som koden ser ut nu så förutsätter jag att jag vet vad som kommer ifrån modulen när jag har skickat ett kommando men jag vet inte riktigt om det e rätt tänk.
Tacksam för hjälp,

Del av koden för avläsning, i detta fallet letar jag efter OK

Kod: Markera allt

	send2GPRS(atCommand[0]); Skickar AT kommando
	
	/* While there is a new char in buffer or no timeout occured
	continue reading RX buffer */
	while (1)
	{

		for (j = 10; (j != 0) && !CharsInUSART2Buffer(); j--)
			Delay1KTCYx(1);
		if (CharsInUSART2Buffer() == 0)
			break;
		USART2BuffRead(&data); // reads one char from buffer
		/* Search RX buffer for "OK", if found cmdOK = 1 */
		if (data == 'K' && tempData =='O')			
			cmdOK = 1;							
		tempData = data;					
	}
	/* If command received OK, send next command */
	if (cmdOK == 1)
	{ ......
Senast redigerad av Jones 27 januari 2006, 13:17:17, redigerad totalt 1 gång.
matseng
Inlägg: 2360
Blev medlem: 16 september 2003, 17:18:13
Ort: Dubai, United Arab Emirates
Kontakt:

Inlägg av matseng »

Det första jag brukar göra när jag kommunicerar med ett modem är att resetta det, stänga av echot och sätta result codes till numeriska värden.

På så sätt slipper man ta hand om alla tecken som kan själv skickat till modemet och det är enklare att parsa en 1-teckens sifferkod än att kolla för OK, ERROR, CONNECT osv.

Självklart har man en lämpligt lång timeout vid varje läsning så att man kan göra en restart av rubbet om inte modemet svarar i tid.

Har man en gsm-modul som man kan styra stömmen till kan det vara läge att göra en powercykel på den om man får en timeout. Mobiltelefoner är det värre med att göra sådant på, och dom som jag provat har haft en förmåga att hänga sig efter nån vecka i drift om man ligger och pollar dom hela tiden.
Senast redigerad av matseng 27 januari 2006, 12:02:12, redigerad totalt 1 gång.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Inlägg av sodjan »

Det är lite oklart här, ska du "skicka* eller *läsa* AT-strängar ?

Av första inlägget ser det ut som om din PIC ska *läsa* AT strängar,
men min gissning (och även matsengs tolkning) är att din PIC
ska *skicka* AT strängar (oh ta imot returkoder).

Förtydliga !
Jones
Inlägg: 16
Blev medlem: 24 oktober 2005, 10:43:44
Ort: Norrköping
Kontakt:

Inlägg av Jones »

matseng skrev:Det första jag brukar göra när jag kommunicerar med ett modem är att resetta det, stänga av echot och sätta result codes till numeriska värden.

På så sätt slipper man ta hand om alla tecken som kan själv skickat till modemet och det är enklare att parsa en 1-teckens sifferkod än att kolla för OK, ERROR, CONNECT osv.

Självklart har man en lämpligt lång timeout vid varje läsning så att man kan göra en restart av rubbet om inte modemet svarar i tid.

Har man en gsm-modul som man kan styra stömmen till kan det vara läge att göra en powercykel på den om man får en timeout. Mobiltelefoner är det värre med att göra sådant på, och dom som jag provat har haft en förmåga att hänga sig efter nån vecka i drift om man ligger och pollar dom hela tiden.
Ok, tackar för infon, det där med ekot visste jag inte att den gjorde och att man kunde stänga av, men det gör det hela lite enklare... hade ställt in numeriska svar från början men jag hade en tanke att det första kommandot var tvunget att vara AT och den returnerade OK, därav letandet efter O o K.

Men detta borde isåfall funka om man skickar echo off som första kommando:

Kod: Markera allt

	/* Send echo off command*/
	send2GPRS((rom char *)"ATE0\r");
	
	/* While there is a new char in buffer or no timeout occured
	continue reading */
	while (1)
	{
		for (j = 10; (j != 0) && !CharsInUSART2Buffer(); j--)
			Delay1KTCYx(1);
		if (CharsInUSART2Buffer() == 0)
			break;
		USART2BuffRead(&data);
		/* Search RX buffer for "OK", if found cmdOK = 1 */
		if (data == 'K' && tempData =='O')			
			cmdOK = 1;							
		tempData = data;					
	}
	/* If command received OK, send next command */
	if (cmdOK == 1)
	{.....   o så vidare
Skriv svar