APP와 ESP8266 및 51 단편기 통신
약술
본 프로젝트는 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단편기가 수신하지 못하는 상황이 발생할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Android Webkit 요약(개요에서 최신 AndroidX까지)WebView는 Android 응용 프로그램에서 HTML과 웹 페이지 등 HTML 파일을 렌더링(표시)하는 기능을 제공하는 View입니다. Android Webkit은 실제 WebView의 핵심 기술인 렌더링 엔진(...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.