APP와 ESP8266 및 51 단편기 통신

7783 단어 51 단편기Android
APP는 ESP8266을 통해 단일 컴퓨터와 통신
약술
본 프로젝트는 ESP8266을 핫이슈로 하고 MODE2 모드에서 작업하며 핸드폰은 station으로 ESP8266의 네트워크에 접속하여 데이터 전송을 하는 동시에 ESP8266과 52단편기 간에 직렬 인터페이스를 통해 데이터 전송을 한다.이 항목에는 앱이 와이파이에 데이터를 보내기만 하면 되기 때문에 앱의 프로그램에 와이파이 데이터를 받는 프로그램이 없다.글의 마지막 부분은 필자가 코드를 쓰는 과정에서 겪은 문제이다. 51단편기는 와이파이 데이터를 받지 못하지만 와이파이에 AT 명령을 보낼 수 있다는 문제이다.
핸드폰단 실현
연결 스레드 설정
다음은 APP가 ESP8266과 연결하는 스레드입니다. 연결을 만들 때 그 대상만 얻으면 됩니다.이 중 IP와 포트는 ESP8266의 IP 주소와 포트 번호이고 IP는 일반적으로 192.168.0.1, 포트 번호는 8080으로 기본적으로 설정되며 포트 번호는 스스로 설정할 수 있다.
private class ConnectThred extends  Thread{
        private  String ip;
        private  int port;
        public ConnectThred(String ip,int port){
            this.ip = ip;
            this.port = port;
        }
        public void run(){
            //                   
            char[] buffer=new char[256];//           
            String bufferString="";//            
            int conut =0;//   buffer     0
            int tag=0;//         
            try {
                //    
                socket = new Socket(ip,port);

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Log.d("Controler","runOnUI");
                        bt_link.setText("    ");
                        bt_link.setBackgroundColor(Color.GREEN);
                        Toast.makeText(Controler.this,"    ",Toast.LENGTH_LONG).show();
                    }
                });
                //     
                bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
                //     
                OutputStream=socket.getOutputStream();
                //  socket    ,    
                InputStream = socket.getInputStream();
                while (true) {
                    //      buffer       0        
                    while ((conut=bufferedReader.read(buffer))>0) {
                        // buffer         bufferString    
                        while ( tag

전송 데이터 스레드
다음은 APP가 ESP8266에 데이터를 보내는 코드로, 역시 하위 스레드에서 수행됩니다.데이터를 보내야 할 때 대상을 통해 이 방법을 호출하면 됩니다.
 //           
    public class Send extends Thread{
        public void run(){
            if(socket != null){
                try{
                    if (msg_send != null && msg_send.length()>0){
                        OutputStream.write(msg_send.getBytes("utf-8"));
                        OutputStream.flush();
                        msg_send="";
                    }
                    else{
                        Looper.prepare();
                        Toast.makeText(Controler.this,"         ",Toast.LENGTH_LONG).show();
                        Looper.loop();
                    }
                }
                catch (IOException e){
                    e.printStackTrace();
                }
            }
        }
    }

버튼으로 연결 설정 또는 끊기
관련 변수 정의
private static final String IP = "192.168.4.1";//   IP
    private static final int PORT = 8080;         //   
    Socket socket;     //    socket
    Boolean IsConnected = false;       //    
    ConnectThred mConnectThread;  //TCP    

    //     
    OutputStream OutputStream = null;//     ,    
    BufferedReader bufferedReader;//       
    InputStream InputStream = null;//       ,      

버튼을 통한 연결:
 bt_link.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {  //    ,   ESP8266       
                    if (socket ==null || !socket.isConnected()){
                        mConnectThread = new ConnectThred(IP,PORT);
                        mConnectThread.start();
                    }
                    if (socket!=null && socket.isConnected()){
                        try {
                            socket.close();
                            socket = null;
                            bt_link.setText("    ");
                            bt_link.setBackgroundColor(Color.GRAY);
                            Toast.makeText(Controler.this,"     ",Toast.LENGTH_LONG).show();
                        }catch (IOException e){
                            e.printStackTrace();
                        }
                    }
            }
        });

단추를 통해 데이터를 보내기: new의 데이터 라인을 보내는 대상을 통해 start 방법을 사용하여 데이터 라인을 보내면 데이터를 보낼 수 있습니다.
select_mode.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mode_count++;
                if (mode_count > 4)
                    mode_count=0;
                mode = mode_arr[mode_count];

                msg_send = "mod"+Integer.toString(mode_count)+"/n";
                new Send().start();

                tempmode.setText(mode);                   //    
            }
        });

하위기에서 와이파이 데이터 수신
하위기단은 51단편기를 사용하여 실현하고 하위기단과 ESP8266 간에 직렬 인터페이스를 통해 통신하여 데이터를 전송한다.그래서 하위기가 와이파이 데이터를 수신할 때 사용하는 것은 직렬 수신 프로그램이다.
void UartConfiguration()
{
  TMOD=0x20;      //      1    2
	TH1=0xfd;			//   1  
	TL1=0xfd;			//   1             ,       9600
	PCON=0x00;      //     0x00   ,0x80  
	SCON=0x50;		// 
	EA=1;		    //
	ES=1;			//
	TR1=1;			//
	TI=1;
}

받은 데이터를 하나의 그룹에 저장한 다음 처리하다
void ESP_UART() interrupt 4
{
	static uchar i=0;
// 	led1=~led1;
	if(RI==1)
	{
		 RI=0;       //½ÓÊÕ±êÖ¾
		 Recive_table[i]=SBUF;
		 sendByte(Recive_table[i]);   
		 i++;         
		 if((Recive_table[i-1]=='
')) { Recive_table[i]='\0'; i=0; } } else TI=0; }

수신된 데이터 처리
void getData()
{
	if(Recive_table[0]=="+")
			sendString(Recive_table);
		if((Recive_table[0]=='+')&&(Recive_table[1]=='I')&&(Recive_table[2]=='P'))
		{
			if((Recive_table[3]=='D')&&(Recive_table[6]==','))
			{   
				if(Recive_table[9]=='0')//&& Recive_table[10]=='0'     //
				{
					Shutdown();
				}
				else if(Recive_table[9]=='1')//&& Recive_table[10]=='1'   //
				{
					
					MakeNum(Recive_table[10],Recive_table[11]);
					Startup();
				}
				else if(Recive_table[9]=='d')//&& Recive_table[10]=='1'   //
				{
					MakeNum(Recive_table[10],Recive_table[11]);
				}
				else if(Recive_table[9]=='e')//&& Recive_table[10]=='1'   //
				{
					MakeNum(Recive_table[10],Recive_table[11]);
				}
				else if(Recive_table[9]=='o'&& Recive_table[10]=='d')    //
				{
					m_index=Recive_table[11]-'0';
					SetMode(m_index);
				}
				else if(Recive_table[9]=='f')//&& Recive_table[10]=='1'   //
				{
					SetSweep(Recive_table[10]-'0');
				}
				else if(Recive_table[9]=='p')//&& Recive_table[10]=='1'   //
				{
					SetSpeed(Recive_table[10]-'0');
				}
				else if(Recive_table[9]=='i')//&& Recive_table[10]=='1'   //
				{
					SetDirect(Recive_table[10]-'0');
				}
				memset(Recive_table,0,50);
			}   
		}
}

주의
ESP8266이 51단편기와 통신할 때 51단편기는 CH340칩을 사용하여 직렬 데이터의 전송을 할 수 없다. 그렇지 않으면 ESP8266이 보낸 데이터인 51단편기가 수신하지 못하는 상황이 발생할 수 있다.

좋은 웹페이지 즐겨찾기