今天小编跟大家分享的是android的WIFI小车编程介绍,android中的WIFI小车编程注意事项有哪些,为了让大家更加了解android的WIFI小车编程,给大家总结了以下内容,一起往下看吧。

小车是四个轮子的,每个轮子上都有电机驱动,前进后退的时候四个轮子同时前进和后退,转弯的时候,小车两边的轮子按反方向转。

为了达到更好的操作效果(一直按下前进,小车前进,按下左右转小车左右转,松开左右转,小车继续前进。松开前进,小车停止。后退同理),在单片机程序里加入了前进或后退的标志位。先说明一下,,,,,,

按下前进向单片机发送‘0’,按下后退向单片机发送‘1’,按下左转向单片机发送‘2’,按下右转向单片机发送‘3’,松开前进或后退向单片机发送‘5’,松开左转或右转向单片机发送‘6’,这样子发数据也是为了获得更好的操作体验

前进 后退 左转 右转按钮是使用的setOnTouchListener方法,以便在按钮按下或松开时发送数据,

就看一下前进代码

我在前面声明了一下


//前进privateOnTouchListenerforwordButtonTouch=newOnTouchListener(){@OverridepublicbooleanonTouch(Viewv,MotionEventevent){//TODOAuto-generatedmethodstubswitch(event.getAction()){caseMotionEvent.ACTION_DOWN://如果按下try{//获取输出流outputStream=socket.getOutputStream();//发送数据//outputStream.write(msgEditText.getText().toString().getBytes());outputStream.write("0".getBytes());//发送0}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}break;caseMotionEvent.ACTION_UP://如果松开try{//获取输出流outputStream=socket.getOutputStream();//发送数据//outputStream.write(msgEditText.getText().toString().getBytes());outputStream.write("5".getBytes());//发送‘5’}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}default:break;}returnfalse;}};

//源码packagecom.wifi_Contrl;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjava.net.InetAddress;importjava.net.Socket;importandroid.annotation.SuppressLint;importandroid.app.Activity;importandroid.os.Bundle;importandroid.view.Menu;importandroid.view.MenuItem;importandroid.view.MotionEvent;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.view.View.OnTouchListener;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.Toast;@SuppressLint("ClickableViewAccessibility")publicclassMainActivityextendsActivity{booleanisConnect=true;//连接还是断开ButtonconnectButton;//定义连接按钮ButtonforwordButton;//定义前进按钮ButtonbackButton;//定义后退按钮ButtonleftButton;//定义左转按钮ButtonrighButton;//定义右转按钮EditTextipEditText;//定义ip输入框EditTextportText;//定义端口输入框Socketsocket=null;//定义socketprivateInputStreaminputStream=null;//定义输入流privateOutputStreamoutputStream=null;//定义输出流@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);connectButton=(Button)findViewById(R.id.btConnect);forwordButton=(Button)findViewById(R.id.btqianjin);backButton=(Button)findViewById(R.id.bthoutui);leftButton=(Button)findViewById(R.id.btzuozhuan);righButton=(Button)findViewById(R.id.btyuozhuan);ipEditText=(EditText)findViewById(R.id.etIP);portText=(EditText)findViewById(R.id.etPort);connectButton.setOnClickListener(connectButtonListener);forwordButton.setOnTouchListener(forwordButtonTouch);backButton.setOnTouchListener(backButtonTouch);leftButton.setOnTouchListener(leftButtonTouch);righButton.setOnTouchListener(righButtonTouch);}//连接privateOnClickListenerconnectButtonListener=newOnClickListener(){@OverridepublicvoidonClick(Viewv){//TODOAuto-generatedmethodstubif(isConnect==true)//标志位=true表示连接{isConnect=false;//置为falseconnectButton.setText("断开");//按钮上显示--断开//打开连接线程Connect_Threadconnect_Thread=newConnect_Thread();connect_Thread.start();}else//标志位=false表示退出连接{isConnect=true;//置为trueconnectButton.setText("连接");//按钮上显示连接Toast.makeText(MainActivity.this,"已退出连接!",Toast.LENGTH_SHORT).show();try{socket.close();//关闭连接socket=null;}catch(IOExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}}};//前进privateOnTouchListenerforwordButtonTouch=newOnTouchListener(){@OverridepublicbooleanonTouch(Viewv,MotionEventevent){//TODOAuto-generatedmethodstubswitch(event.getAction()){caseMotionEvent.ACTION_DOWN:try{//获取输出流outputStream=socket.getOutputStream();//发送数据//outputStream.write(msgEditText.getText().toString().getBytes());outputStream.write("0".getBytes());}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}break;caseMotionEvent.ACTION_UP:try{//获取输出流outputStream=socket.getOutputStream();//发送数据//outputStream.write(msgEditText.getText().toString().getBytes());outputStream.write("5".getBytes());}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}default:break;}returnfalse;}};//后退privateOnTouchListenerbackButtonTouch=newOnTouchListener(){@OverridepublicbooleanonTouch(Viewv,MotionEventevent){//TODOAuto-generatedmethodstubswitch(event.getAction()){caseMotionEvent.ACTION_DOWN:try{//获取输出流outputStream=socket.getOutputStream();//发送数据//outputStream.write(msgEditText.getText().toString().getBytes());outputStream.write("1".getBytes());}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}break;caseMotionEvent.ACTION_UP:try{//获取输出流outputStream=socket.getOutputStream();//发送数据//outputStream.write(msgEditText.getText().toString().getBytes());outputStream.write("5".getBytes());}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}default:break;}returnfalse;}};//左转privateOnTouchListenerleftButtonTouch=newOnTouchListener(){@OverridepublicbooleanonTouch(Viewv,MotionEventevent){//TODOAuto-generatedmethodstubswitch(event.getAction()){caseMotionEvent.ACTION_DOWN:try{//获取输出流outputStream=socket.getOutputStream();//发送数据//outputStream.write(msgEditText.getText().toString().getBytes());outputStream.write("2".getBytes());}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}break;caseMotionEvent.ACTION_UP:try{//获取输出流outputStream=socket.getOutputStream();//发送数据//outputStream.write(msgEditText.getText().toString().getBytes());outputStream.write("6".getBytes());}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}default:break;}returnfalse;}};//右转privateOnTouchListenerrighButtonTouch=newOnTouchListener(){@OverridepublicbooleanonTouch(Viewv,MotionEventevent){//TODOAuto-generatedmethodstubswitch(event.getAction()){caseMotionEvent.ACTION_DOWN:try{//获取输出流outputStream=socket.getOutputStream();//发送数据//outputStream.write(msgEditText.getText().toString().getBytes());outputStream.write("3".getBytes());}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}break;caseMotionEvent.ACTION_UP:try{//获取输出流outputStream=socket.getOutputStream();//发送数据//outputStream.write(msgEditText.getText().toString().getBytes());outputStream.write("6".getBytes());}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}default:break;}returnfalse;}};//连接线程classConnect_ThreadextendsThread//继承Thread{publicvoidrun()//重写run方法{try{if(socket==null){//用InetAddress方法获取ip地址InetAddressipAddress=InetAddress.getByName(ipEditText.getText().toString());intport=Integer.valueOf(portText.getText().toString());//获取端口号socket=newSocket(ipAddress,port);//创建连接地址和端口if(socket!=null){runOnUiThread(newRunnable(){publicvoidrun(){//TODOAuto-generatedmethodstubToast.makeText(MainActivity.this,"已成功连接!",Toast.LENGTH_SHORT).show();}});}}}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}}}

//布局源码,大神勿喷,小弟才入门android,所以关于布局还,,,,,<AbsoluteLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@android:color/holo_purple"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="com.wifi_Contrl.MainActivity"><!--IP地址:--><TextViewandroid:id="@+id/tvIP"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="IP地址:"android:textSize="23dp"android:layout_x="0dp"android:layout_y="0dp"/><!--左转--><Buttonandroid:id="@+id/btzuozhuan"android:layout_width="wrap_content"android:layout_height="80dp"android:layout_x="400dp"android:layout_y="118dp"android:text="左转"/><!--右转--><Buttonandroid:id="@+id/btyuozhuan"android:layout_width="wrap_content"android:layout_height="80dp"android:layout_x="520dp"android:layout_y="118dp"android:text="右转"/><!--后退--><Buttonandroid:id="@+id/bthoutui"android:layout_width="wrap_content"android:layout_height="90dp"android:layout_x="105dp"android:layout_y="200dp"android:text="后退"/><!--前进--><Buttonandroid:id="@+id/btqianjin"android:layout_width="wrap_content"android:layout_height="90dp"android:layout_marginBottom="21dp"android:layout_x="105dp"android:layout_y="65dp"android:text="前进"/><!--连接--><Buttonandroid:id="@+id/btConnect"android:layout_width="wrap_content"android:layout_height="40dp"android:layout_marginBottom="21dp"android:layout_x="500dp"android:text="连接"/><!--端口号:--><TextViewandroid:id="@+id/tvPort"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_x="280dp"android:layout_y="0dp"android:text="端口号:"android:textSize="23dp"/><!--输入端口地址的文本控件--><EditTextandroid:id="@+id/etPort"android:layout_width="70dp"android:layout_height="30dp"android:layout_x="380dp"android:layout_y="0dp"android:background="@android:color/white"android:ems="10"android:text="8080"/><!--输入ip地址的文本控件--><EditTextandroid:id="@+id/etIP"android:layout_width="150dp"android:layout_height="30dp"android:layout_x="100dp"android:layout_y="0dp"android:background="@android:color/white"android:ems="10"android:text="192.168.4.1"><requestFocus/></EditText></AbsoluteLayout>

再看单片机,因为学实时操作系统UCOSII的时候,写程序就养成了这样写程序习惯,如果对于这样

#ifndef _USART_C_//如果没有定义_USART_C_
#define _USART_C_ extern
#else
#define _USART_C_
#endif

_USART_C_ unsigned char Usart_Receive[20];
_USART_C_ unsigned char Usart_Cnt;
_USART_C_ bit Usart_AT_flage;
_USART_C_ bit Command_Flag;
_USART_C_ unsigned char UsartData;
_USART_C_ void InitUART(void);//串口初始化
_USART_C_ void SendOneByte(unsigned char c);//发送字节型数据
_USART_C_ void UartSends(unsigned char *str);//串行口连续发送char型数组,遇到终止号/0将停止

其实这样写,有助于各个c文件之间调用变量。说一下

#ifndef _USART_C_//如果没有定义_USART_C_
#define _USART_C_ extern//就定义_USART_C_ 为extern
#else//否则
#define _USART_C_就定义_USART_C_为空
#endif

如果是自身文件编译由于我在USART.C文件的开头加上了#define _USART_C_所以,就定义_USART_C_为空

即 unsigned char Usart_Receive[20];

如果别的文件编译那么因为别的文件没有定义#define _USART_C_ 所以就定义_USART_C_ 为extern

即externunsigned char Usart_Receive[20];

对于extern这应该不陌生吧,好了接着往下看,

不好意思再啰嗦下,我把所有的.h文件全放在了一个.h文件中,这样在每个c文件的开头只需加上#include "include.h"就方便多了

#define_MAIN_C_#include"include.h"sbita1=P1^0;//前左轮前进sbita2=P1^1;//前左轮后退sbita3=P1^2;//前右轮前进sbita4=P1^3;//前右轮后进sbita5=P1^4;//后左轮前进sbita6=P1^5;//后左轮后退sbita7=P1^6;//后右轮前进sbita8=P1^7;//后右轮后进bitforword_flag=0;bitback_flag=0;unsignedcharCWMODE[]="AT+CWMODE=2\r\n";//设置模块的工作的模式为AP模式unsignedcharRST[]="AT+RST\r\n";//重启模块使AT+CWMODE=2模式生效unsignedcharCIPMUX[]="AT+CIPMUX=1\r\n";//启动多连接unsignedcharCIPSERVER[]="AT+CIPSERVER=1,8080\r\n";//开启服务器模式,端口号8080voiddelay1s(void)//误差-0.00000000024us{unsignedchara,b,c;for(c=95;c>0;c--)for(b=26;b>0;b--)for(a=185;a>0;a--);}//多连接AP模式voidManyConnect_AP(){P0=0x00;while(1){UartSends(CWMODE);//返回okdelay1s();if(Usart_AT_flage==1){if(strstr(Usart_Receive,"OK")){Usart_AT_flage=0;P0=0x01;break;}}}UartSends(RST);//返回一大溜,不用判断返回delay1s();delay1s();while(1){UartSends(CIPMUX);//返回okdelay1s();if(Usart_AT_flage==1){if(strstr(Usart_Receive,"OK")){Usart_AT_flage=0;P0=0x03;break;}}}while(1){UartSends(CIPSERVER);//返回ok,多了也返回okdelay1s();if(Usart_AT_flage==1){if(strstr(Usart_Receive,"OK")){Usart_AT_flage=0;P0=0x07;break;}}}}voidmain(){InitUART();while(1){ManyConnect_AP();//多连接AP模式while(1){//由于消息的开头是+IP故做此判断if((Usart_Receive[0]=='+')&&(Usart_Receive[1]=='I')&&(Usart_Receive[2]=='P')){if((Usart_Receive[3]=='D')&&(Usart_Receive[6]==',')){if(Usart_Receive[9]=='0')//前进{forword_flag=1;//前进标志位置一back_flag=0;//后退标志位置零a1=1;//前左轮前进a2=0;//前左轮后退a3=1;//前右轮前进a4=0;//前右轮后进a5=1;//后左轮前进a6=0;//后左轮后退a7=1;//后右轮前进a8=0;//后右轮后进/*sbita1=P1^0;//前左轮前进sbita2=P1^0;//前左轮后退sbita3=P1^1;//前右轮前进sbita4=P1^2;//前右轮后进sbita5=P1^3;//后左轮前进sbita6=P1^0;//后左轮后退sbita7=P1^0;//后右轮前进sbita8=P1^1;//后右轮后进*/}if(Usart_Receive[9]=='1')//后退{forword_flag=0;//前进标志位置一back_flag=1;//后退标志位置零a1=0;//前左轮前进a2=1;//前左轮后退a3=0;//前右轮前进a4=1;//前右轮后进a5=0;//后左轮前进a6=1;//后左轮后退a7=0;//后右轮前进a8=1;//后右轮后进}if(Usart_Receive[9]=='6')//左右转停止{if(forword_flag==1&&back_flag==0)//上一次按下的是前进,没松开{//前进a1=1;//前左轮前进a2=0;//前左轮后退a3=1;//前右轮前进a4=0;//前右轮后进a5=1;//后左轮前进a6=0;//后左轮后退a7=1;//后右轮前进a8=0;//后右轮后进}if(forword_flag==0&&back_flag==1)//上一次按下的是后退,没松开{//后退a1=0;//前左轮前进a2=1;//前左轮后退a3=0;//前右轮前进a4=1;//前右轮后进a5=0;//后左轮前进a6=1;//后左轮后退a7=0;//后右轮前进a8=1;//后右轮后进}if(forword_flag==0&&back_flag==0)//上一次松开了前进或后退{//停止a1=0;//前左轮前进a2=0;//前左轮后退a3=0;//前右轮前进a4=0;//前右轮后进a5=0;//后左轮前进a6=0;//后左轮后退a7=0;//后右轮前进a8=0;//后右轮后进}}if(Usart_Receive[9]=='2')//左转{a1=0;//前左轮前进a2=1;//前左轮后退a3=1;//前右轮前进a4=0;//前右轮后进a5=0;//后左轮前进a6=1;//后左轮后退a7=1;//后右轮前进a8=0;//后右轮后退}if(Usart_Receive[9]=='3')//右转{a1=1;//前左轮前进a2=0;//前左轮后退a3=0;//前右轮前进a4=1;//前右轮后进a5=1;//后左轮前进a6=0;//后左轮后退a7=0;//后右轮前进a8=1;//后右轮后退}if(Usart_Receive[9]=='5')//停止{forword_flag=0;//前进标志位置零back_flag=0;//后退标志位置零a1=0;//前左轮前进a2=0;//前左轮后退a3=0;//前右轮前进a4=0;//前右轮后进a5=0;//后左轮前进a6=0;//后左轮后退a7=0;//后右轮前进a8=0;//后右轮后进}}}}}}

#define_USART_C_#include"include.h"unsignedcharUsart_Receive[20]={0};unsignedcharUsart_Cnt=0;bitUsart_AT_flage;bitflage;bitCommand_Flag;voidInitUART(void){TMOD=0x20;SCON=0x50;TH1=0xFD;TL1=TH1;PCON=0x00;EA=1;ES=1;TR1=1;}voidSendOneByte(unsignedcharc){SBUF=c;while(!TI);TI=0;}//串行口连续发送char型数组,遇到终止号/0(空格)将停止voidUartSends(unsignedchar*str){while(*str!='\0'){SBUF=*str;while(!TI);//等待发送完成信号(TI=1)出现TI=0;str++;}}voidUARTInterrupt(void)interrupt4{RI=0;Usart_Receive[Usart_Cnt]=SBUF;//接收串口数据Usart_Cnt++;////返回数据以回车结尾,有回车,而且数据个数大于2,说明接收到了数据if(Usart_Receive[Usart_Cnt-2]=='\r'&&Usart_Receive[Usart_Cnt-1]=='\n'&&Usart_Cnt>=2){Usart_Cnt=0;//接收数据计数清零Usart_AT_flage=1;//数据接收成功标志位}elseif(Usart_Cnt>20)//{Usart_Cnt=0;}}

#ifndef__USART_H_#define__USART_H_#ifndef_USART_C_#define_USART_C_extern#else#define_USART_C_#endif_USART_C_unsignedcharUsart_Receive[20];_USART_C_unsignedcharUsart_Cnt;_USART_C_bitUsart_AT_flage;_USART_C_bitCommand_Flag;_USART_C_unsignedcharUsartData;_USART_C_voidInitUART(void);//串口初始化_USART_C_voidSendOneByte(unsignedcharc);//发送字节型数据_USART_C_voidUartSends(unsignedchar*str);//串行口连续发送char型数组,遇到终止号/0将停止#endif

#include<REGX52.H>#include"USART.h"#include<string.h>


看完上诉内容,你们掌握android的WIFI小车编程方法了吗?如果想了解更多,欢迎关注亿速云行业资讯频道!