ESP8266 WIFI模組學習之路(7)——自寫Android手機APP接受微控制器資料
阿新 • • 發佈:2019-02-04
上一篇是寫關於自寫Android手機APP給微控制器下發資料的,這次我將寫一下APP如何接受微控制器資料。
其實使用除錯助手,或者別人開的的APP同樣能夠實現接受微控制器資料,但想學習的,我還是建議能夠自己寫一個Android軟體,這樣從底層到上層都能學到很多東西。
APP頁面如圖:
硬體連線如圖:
微控制器的硬體程式碼:
if(0 == P32) // 通過串列埠給手機發送字串 wantin { ms_delay(400); if(0 == P32) { ES = 0; TI = 1; printf("AT+CIPSEND=?\r\n"); LED(); ms_delay(1000) ; printf("AT+CIPSEND=0,10\r\n"); LED(); ms_delay(1000) ; printf("wangting\r\n"); LED(); ms_delay(1000) ; LED(); ms_delay(1000) ; LED(); ms_delay(1000) ; while(!TI); TI = 0; ES = 1; } while(0 == P32); }
我這裡只貼了串列埠傳送的程式碼,它的資料是通過按鍵進行傳送的,以前的文章也有寫到。上發的內容為wangting.
app程式碼部分:
package com.open_open_wt.myapplication; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private ConnectThread mConnectThread; private Socket mSocket; private EditText mEIP; private EditText mEPort; private String mStrIP; private int miPort; private Button mBtnConn; private Button mBtnRecData; private TextView mtvRec; private String line; private String mstr; private int flag=1; BufferedReader br; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mEIP=(EditText)findViewById(R.id.eTIP); mEPort=(EditText)findViewById(R.id.eTPort); mBtnConn=(Button)findViewById(R.id.btConn); mBtnRecData=(Button)findViewById(R.id.bRecData); mtvRec=(TextView)findViewById(R.id.tVRecData); mBtnConn.setOnClickListener(this); mBtnRecData.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.btConn: // 連線 if(mSocket == null || !mSocket.isConnected()){ mStrIP=mEIP.getText().toString(); miPort=Integer.valueOf(mEPort.getText().toString()); mConnectThread=new ConnectThread(mStrIP,miPort); mConnectThread.start(); } if(mSocket != null && mSocket.isConnected()){ try { mSocket.close(); mSocket=null; mBtnConn.setText("連線"); Toast.makeText(MainActivity.this,"連線斷開",Toast.LENGTH_LONG).show(); }catch (IOException e){ e.printStackTrace(); } } break; case R.id.bRecData: if(mSocket != null && mSocket.isConnected()){ if(flag==1){ Toast.makeText(MainActivity.this,"開始接受資料",Toast.LENGTH_LONG).show(); mBtnRecData.setText("Doing recDta"); GetTCPstring(); flag=(-1)*flag; } else{ Toast.makeText(MainActivity.this,"停止接受資料",Toast.LENGTH_LONG).show(); mBtnRecData.setText("RecData"); try { mSocket.getInputStream().close(); } catch (IOException e) { e.printStackTrace(); Toast.makeText(MainActivity.this,"停止接受資料失敗",Toast.LENGTH_LONG).show(); } flag=(-1)*flag; } } else{ mBtnRecData.setText("RecData"); Toast.makeText(MainActivity.this,"開始接受資料失敗",Toast.LENGTH_LONG).show(); } break; } } private void GetTCPstring(){ new Thread(){ public void run(){ try{ char[] cbuf=new char[10]; br=new BufferedReader(new InputStreamReader(mSocket.getInputStream())); while (true){ if(br.ready()){ br.read(cbuf,0,10); line=String.valueOf(cbuf); handler.sendMessage(handler.obtainMessage()); } } }catch(IOException e){ e.printStackTrace(); Toast.makeText(MainActivity.this,"接受資料失敗",Toast.LENGTH_LONG).show(); } } }.start(); } // 訊息控制代碼 private Handler handler=new Handler(){ public void handleMessage(Message msg){ super.handleMessage(msg); mstr+=line; if(mstr.length()>500){ mstr=""; } mtvRec.setText(mstr); } }; private class ConnectThread extends Thread{ private String ip; private int port; public ConnectThread(String ip,int port){ this.ip=ip; this.port=port; } @Override public void run(){ try { mSocket=new Socket(ip,port); runOnUiThread(new Runnable() { @Override public void run() { mBtnConn.setText("斷開"); Toast.makeText(MainActivity.this,"連線成功",Toast.LENGTH_LONG).show(); } }); }catch (IOException e){ e.printStackTrace(); runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this,"連線失敗",Toast.LENGTH_LONG).show(); } }); } } } }
剛開始學習Android程式碼,寫的邏輯一定有問題,因為我測試了一下,會有閃退問題,但功能是能用的。手機連線到WIFI模組的WIFI上,然後開啟我編寫的APP——連線——接收資料按鈕按下,接收的資料如圖:
能夠正確接收資料了,這就說明,手機基本能正確接收微控制器上發的資料了,後期還需要不斷的研究與深化。