به نام خدا

سلام خدمت همه دوستان عزیز و هموطنان گرامی! s04

بعد از چندی وقت اومدم یه خورده راجع به اتصال ماژول وایفای به میکرو مطلب بزارم! امیدوارم خوشتون بیاد و به دردتون بخوره!

خوب من هیچ توضیحی راجع به اینکه این ماژول چیه و پایه هاش چی هستن نمیگم! فقط سایت زیر رو معرفی میکنم که همه چیز رو اونجا به طور کامل شرح داده!

کلیک کنید!

سایت بالا رو به طور کامل مطالعه بفرمایید!

حالا میریم سراغ برنامه نویسی!

راستش برای این میکروکنترلر ، من فقط برد eca رو دارم! ولی اصلا فرقی نمیکنه که شما از چه بردی استفاده کنید!

این ماژول با ارتباط UART به میکرو متصل میشه! و من هم برای این کار UART0 میکرو رو انتخاب کردم که به پایه های زیر وصل میشه!

P0.2 = TX

P0.3 = RX

خوب TX یعنی فرستنده و RX یعنی گیرنده. بزارید من یه نکته ریز بگم! s02 دقت کنید که تو اتصال UART شما باید سیم ها رو ضربدری به هم متصل کنید! یعنی TX یکیشون رو به RX دیگری وصل کنید و بلعکس! (خیلی ریز بود: نه؟.... راستش همین موضوع دو ساعت وقت منو گرفتs03)

بنابراین در برنامه ای که من نوشتم شما باید پایه P0.2 میکرو رو به RX ماژول وصل کنید و پایه P0.3 میکرو رو به TX ماژول متصل کنید!

راستش طرز کار برنامه زیر اینه که UATR0 به ماژول وصل شده و UART2 به کامپیوتر، تا ببینیم آیا درست دریافت میکنه یا نه. البته شما میتونید برنامه رو تغییر بدید. من این برنامه رو خیلی ساده و برای درک چگونه دریافت و ارسال دیتا درست کردم!

راستش خیلی باهاش ور رفتم تا بتونم یک جمله رو دریافت کنم، یعنی اینکه من برم و کاراکتر به کاراکتر از ماژول بگیرم و به کامپیوتر (UART2) بفرستم اصلا کاری نداشت! ولی اینکه برای اینکه میخوایم با میکرو کار بکنیم! و باید بدونیم الان چه چیزی توسط ماژول برای ما ارسال شد و پردازش لازم رو انجام بدیم. نیاز داریم به جای کاراکتر یک استرینگ دریافت کنیم که من بعد از چند روز تلاش یه برنامه اینجوری که در زیر میبینید رو نوشتم! برنامه بدی نیست! هر وقت ماژول یه کاراکتر دریافت میکنه، این برنامه اونو وارد یه استرینگ میکنه و اگه به کاراکتر اینتر (0X0A , 0X0D) برسه، جمله رو تموم میکنه

متن خالصی که به دست شما میرسه، یک استرینگ بدون اینتر هست! تا بتونید پردازشی که میخواید رو روش انجام بدید!

فقط یه نکته بگم : ببینید منظورم از پردازش اینه که مثلا الان ماژول چه پیامی داد؟ آیا کسی به وای فای وصل شد؟ یا کسی متنی فرستاد؟ اگه کسی متنی فرستاد فلان متن رو بهش بفرست! .... خوب معلومه برای اینکار نیاز داریم که ببینیم متنی که ماژول بهمون داده در مورد چیه؟ اگه کسی پیام داده، پیام خالص اش چیه؟

آخه اگه کسی مثلا کلمه ali رو به ماژول بفرسته ماژول اونو اینطوری برای ما میفرسته

+IPD,0,3:ali

حالا ما باید بیایم و اونو پردازش کنیم و متن اصلی یعنی ali رو بیرون بکشیم!

در این جا من یه چیزی بگم و کد رو خدمتتون عرضه کنم! s10

برای کار بالا (یعنی پردازش متن) من تابع strtok رو بهتون پیشنهاد میکنم! (برای اطلاعات بیشتر کلیک کنید)

خوب اینم کد: (فقط توجه کنید به C++ نوشتم! و برای همینم از extern "C" استفاده کردم --اطلاعات بیشتر کلیک کنید)


#include <lpc17XX.h>

int CounterWiFi=0;
		
#ifdef __cplusplus
extern "C" {
#endif	
	void UART0_IRQHandler (void);
#ifdef __cplusplus
}
#endif


void delay ()  // تابع زمان
{
	int a= 7000000;
	while (a--);
}
unsigned char getchar0 (void)  // دریافت کاراکتر از یوآرت0
{
	while (!(LPC_UART0->LSR & 0X1));  
	return LPC_UART0->RBR;   
}

unsigned char getchar2 (void)  // دریافت کاراکتر از یوآرت2
{
	while (!(LPC_UART2->LSR & 0X1));  
	return LPC_UART2->RBR;  
}


void sendchar0 (unsigned char ch) // ارسال کارکتر به یوآرت 0
{
	while (!(LPC_UART0->LSR & 1<<5));
	LPC_UART0->THR=ch;
	LPC_UART0->TER=0X80;
}

void sendchar2 (unsigned char ch) // ارسال کارکتر به یوآرت 2
{
	while (!(LPC_UART2->LSR & 1<<5));
	LPC_UART2->THR=ch;
	LPC_UART2->TER=0X80;
}

void sendstring0 (char *str)  // ارسال رشته به یوآرت 0
{
	for (int i=0;str[i]!='\0';i++)
	sendchar0(str[i]);
	
}

void sendstring2 (char *str)   // ارسال رشته به یوآرت 2
{
	for (int i=0;str[i]!='\0';i++)
	sendchar2 (str[i]);
	
}


#ifdef __cplusplus
extern "C" {
#endif
	 
void UART2_IRQHandler (void) // تابع مروبط به وقفه UART0
{
	sendchar0(getchar2());
}

#ifdef __cplusplus
}
#endif
 
char RECstr[2000]; // Recive String

int main (){
	
	LPC_GPIO2->FIODIR=0XFF;	// FOR LED
	
	// init UART0
	NVIC_EnableIRQ(UART0_IRQn);
	LPC_SC->PCLKSEL0|=0X0;     //SET CLOCK OF UART0    CPUCLK/4=24MHZ
	LPC_UART0->LCR=0X83;      //SET 8bit data & enable dlab
	LPC_UART0->DLL=13;        // SET BAUD RATE = 115200
	LPC_UART0->DLM=0;
	LPC_UART0->LCR=0X3;      // DESABLE DLAB
	LPC_UART0->FCR=0X7;      // SET FIFO AND CLAER
	LPC_PINCON->PINSEL0=0X50;// SET PIN FOR UART0
	LPC_UART0->IER=0X01;
	
	// init UART2
	NVIC_EnableIRQ(UART2_IRQn);
	LPC_SC->PCLKSEL0|=0X0;     //SET CLOCK OF UART0    CPUCLK/4=24MHZ
	LPC_PINCON->PINSEL0 |= (1 << 20);             // Pin P0.10 used as TXD2 (Com2) 
    LPC_PINCON->PINSEL0 |= (1 << 22);             // Pin P0.11 used as RXD2 (Com2) 	
	LPC_SC->PCONP = LPC_SC->PCONP|(1<<24);	      //Open UART2 power control bit	           
	LPC_UART2->LCR=0X83;      //SET 8bit data & enable dlab
	LPC_UART2->DLL=13;        // SET BAUD RATE = 115200
	LPC_UART2->DLM=0;
	LPC_UART2->LCR=0X3;      // DESABLE DLAB
	LPC_UART2->FCR=0X7;      // SET FIFO AND CLAER
	LPC_UART2->IER=0X01;

	// init ESP8266 ESP-01
	sprintf (str,"AT+CWMODE=3%c%c",0x0d,0x0a);
	sendstring0(str);
	delay();
	
	sprintf (str,"AT+CIPMUX=1%c%c",0x0d,0x0a);
	sendstring0(str);
	delay();
	
	sprintf (str,"AT+CIPSERVER=1,8888%c%c",0x0d,0x0a);
	sendstring0(str);
	delay();	

	

	CounterWiFi=0;
	while (1){ 		
	
	LPC_GPIO2->FIOPIN=0XFF;
	delay();		
	LPC_GPIO2->FIOPIN=0X00;
	delay();	
	
	sendstring2(RECstr);
}
}

		
#ifdef __cplusplus
extern "C" {
#endif
	 

void UART0_IRQHandler (void) // تابع وقفه یوآرت 0 برای دریافت کاراکتر از ماژول
{	

	if ((RECstr[CounterWiFi]=getchar0())!=0x0a && RECstr[CounterWiFi]!=0x0d)
		RECstr[++CounterWiFi]='\0';
	
	
	else{
		if(RECstr[CounterWiFi]==0x0d){
		RECstr[CounterWiFi]='\0';
		CounterWiFi++;	
		}
		else
		CounterWiFi=0;
	}
	
}

#ifdef __cplusplus
}
#endif

امیدوارم مفید بوده باشه!

اگه سوالی داشتید در خدمتم!

فعلا
یا علی مدد...!