基本信息
源码名称:STM32串口IAP app调试工具源码
源码大小:5.37M
文件格式:.rar
开发语言:Java
更新时间:2018-08-16
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 2 元 
   源码介绍


package cn.wch.ch34xuartdriver;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
import cn.wch.ch34xuartdemo.R;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.hardware.usb.UsbManager;
import android.view.View;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;
import android.util.Log;
import cn.wch.ch34xuartdriver.utils.FileUtil;
import cn.wch.ch34xuartdriver.utils.PermissionUtils;

public class MainActivity extends Activity {

	public static final String TAG = "cn.wch.wchusbdriver";
	private static final String ACTION_USB_PERMISSION = "cn.wch.wchusbdriver.USB_PERMISSION";
	public readThread handlerThread;
	protected final Object ThreadLock = new Object();
	private EditText readText;
	private Spinner baudSpinner,stopSpinner,dataSpinner,paritySpinner,sp_file;
	private boolean isOpen;
	private Handler handler;
	private int retval;
	private MainActivity activity;
	private Button writeButton, openButton, clearButton,bthRefresh,btnBoot;
	private EditText txt_rec;
	private MyBtnClicker myBtnClicker=new MyBtnClicker();
	public byte[] writeBuffer,readBuffer;
	public int actualNumBytes, numBytes,status;
	public byte count;
	public byte writeIndex = 0;
	public byte readIndex = 0;
	public int baudRate;
	public byte stopBit,dataBit,parity,flowControl;
	public boolean isConfiged = false;
	public boolean READ_ENABLE = false;
	public SharedPreferences sharePrefSettings;
	public String act_string,mPath,Str,path;;
	public int totalrecv;
	public byte[] datatosend;    public FileInputStream fs;
	int packet_zheng,packet_yu,packet_send=0; boolean boot=false;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		MyApp.driver = new CH34xUARTDriver(
				(UsbManager) getSystemService(Context.USB_SERVICE), this,
				ACTION_USB_PERMISSION);

		PermissionUtils.verifyStoragePermissions(this);
		mPath = Environment.getExternalStorageDirectory().getAbsolutePath().toString()   "/" "iap" "/";
		File floder=new File(mPath);
		if(!floder.exists())
		{
			floder.mkdirs();
			Log.d(TAG, "onCreate: iap文件夹创建成功");
		}
		else
		{
			Log.d(TAG, "onCreate: iap文件夹已经存在");
		}
		bindID();
		bindListener();
		initUI();
		if (!MyApp.driver.UsbFeatureSupported())// 判断系统是否支持USB HOST
		{
			Dialog dialog = new AlertDialog.Builder(MainActivity.this)
					.setTitle("提示")
					.setMessage("您的手机不支持USB HOST,请更换其他手机再试!")
					.setPositiveButton("确认",
							new DialogInterface.OnClickListener() {

								@Override
								public void onClick(DialogInterface arg0,
										int arg1) {
									System.exit(0);
								}
							}).create();
			dialog.setCanceledOnTouchOutside(false);
			dialog.show();
		}
		getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);// 保持常亮的屏幕的状态
		writeBuffer = new byte[512];
		readBuffer = new byte[512];
		isOpen = false;
//		writeButton.setEnabled(false);
		activity = this;
		handler = new Handler() {

			public void handleMessage(Message msg) {
				readText.setText((String) msg.obj);
//				readText.append((String) msg.obj);
			}
		};
	}
	
	public void onResume() {
		super.onResume();
		if(!MyApp.driver.isConnected()) {
			int retval = MyApp.driver.ResumeUsbPermission();
			if (retval == 0) {
	
			} else if (retval == -2) {
				Toast.makeText(MainActivity.this, "获取权限失败!",
						Toast.LENGTH_SHORT).show();	
			}
		}
	}
	//处理界面
	private void initUI() {
		openButton.setEnabled(true);
		btnBoot.setEnabled(false);
		writeButton.setEnabled(false);
        //--------------------sp_file------------------------------
		sp_file=(Spinner)findViewById(R.id.sp_file);
		refreshSpinner();
        //---------------------baudRate---------------------------
		baudSpinner = (Spinner) findViewById(R.id.baudRateValue);
		ArrayAdapter<CharSequence> baudAdapter = ArrayAdapter
				.createFromResource(this, R.array.baud_rate,
						R.layout.my_spinner_textview);
		baudAdapter.setDropDownViewResource(R.layout.my_spinner_textview);
		baudSpinner.setAdapter(baudAdapter);
		baudSpinner.setGravity(0x10);
		baudSpinner.setSelection(9);
		/* by default it is 115200 */
		baudRate = 115200;
		//-------------------------------------------------------

		/* ---------------------stop bits---------------------- */
		stopSpinner = (Spinner) findViewById(R.id.stopBitValue);
		ArrayAdapter<CharSequence> stopAdapter = ArrayAdapter
				.createFromResource(this, R.array.stop_bits,
						R.layout.my_spinner_textview);
		stopAdapter.setDropDownViewResource(R.layout.my_spinner_textview);
		stopSpinner.setAdapter(stopAdapter);
		stopSpinner.setGravity(0x01);
		/* default is stop bit 1 */
		stopBit = 1;

		/* ----------------------data bits----------------------- */
		dataSpinner = (Spinner) findViewById(R.id.dataBitValue);
		ArrayAdapter<CharSequence> dataAdapter = ArrayAdapter
				.createFromResource(this, R.array.data_bits,
						R.layout.my_spinner_textview);
		dataAdapter.setDropDownViewResource(R.layout.my_spinner_textview);
		dataSpinner.setAdapter(dataAdapter);
		dataSpinner.setGravity(0x11);
		dataSpinner.setSelection(3);
		/* default data bit is 8 bit */
		dataBit = 8;
		/* parity */
		paritySpinner = (Spinner) findViewById(R.id.parityValue);
		ArrayAdapter<CharSequence> parityAdapter = ArrayAdapter
				.createFromResource(this, R.array.parity,
						R.layout.my_spinner_textview);
		parityAdapter.setDropDownViewResource(R.layout.my_spinner_textview);
		paritySpinner.setAdapter(parityAdapter);
		paritySpinner.setGravity(0x11);
		/* default is none */
		parity = 0;
		/* set the adapter listeners for baud */
		baudSpinner.setOnItemSelectedListener(new MyOnBaudSelectedListener());
		/* set the adapter listeners for stop bits */
		stopSpinner.setOnItemSelectedListener(new MyOnStopSelectedListener());
		/* set the adapter listeners for data bits */
		dataSpinner.setOnItemSelectedListener(new MyOnDataSelectedListener());
		/* set the adapter listeners for parity */
		paritySpinner.setOnItemSelectedListener(new MyOnParitySelectedListener());
		return;
	}
	private void refreshSpinner() {
		// 获得指定目录下面的所有文本文件
		ArrayList<File> fileAlllist = FileUtil.getFileList(mPath, new String[]{".bin"});
		if (fileAlllist.size() > 0) {
			fileArray = new String[fileAlllist.size()];
			for (int i = 0; i < fileAlllist.size(); i  ) {
				fileArray[i] = fileAlllist.get(i).getName();
			}
			ArrayAdapter<String> typeAdapter = new ArrayAdapter<String>(this,
					R.layout.item_select, fileArray);
			typeAdapter.setDropDownViewResource(R.layout.item_dropdown);
			sp_file.setPrompt("请选择文本文件");
			sp_file.setAdapter(typeAdapter);
			sp_file.setSelection(0);
			sp_file.setOnItemSelectedListener(new FileSelectedListener());
		} else {
			fileArray = null;
			fileArray = new String[1];
			fileArray[0] = "";
			ArrayAdapter<String> typeAdapter = new ArrayAdapter<String>(this,
					R.layout.item_select, fileArray);
			sp_file.setPrompt(null);
			sp_file.setAdapter(typeAdapter);
			sp_file.setOnItemSelectedListener(null);
		}
	}

	private void bindID(){
//		readText = (EditText) findViewById(R.id.ReadValues);
		txt_rec=(EditText)findViewById(R.id.txt_rec);
		writeButton = (Button) findViewById(R.id.WriteButton);
		openButton = (Button) findViewById(R.id.open_device);
		clearButton = (Button) findViewById(R.id.clearButton);
		btnBoot=(Button)findViewById(R.id.btn_boot);
		bthRefresh=(Button)findViewById(R.id.btn_refresh);
	}
	private void bindListener(){
		writeButton.setOnClickListener(myBtnClicker);
		openButton.setOnClickListener(myBtnClicker);
		clearButton.setOnClickListener(myBtnClicker);
		btnBoot.setOnClickListener(myBtnClicker);
		bthRefresh.setOnClickListener(myBtnClicker);
	}
	private class MyBtnClicker implements View.OnClickListener{
		@Override
		public void onClick(View view){
			switch (view.getId()){
				case R.id.open_device:
				{
					//打开流程主要步骤为ResumeUsbList,UartInit
					if (!isOpen) {
						retval = MyApp.driver.ResumeUsbList();
						if (retval == -1)// ResumeUsbList方法用于枚举CH34X设备以及打开相关设备
						{
							Toast.makeText(MainActivity.this, "打开设备失败!",
									Toast.LENGTH_SHORT).show();
							MyApp.driver.CloseDevice();
						} else if (retval == 0){
							if (!MyApp.driver.UartInit()) {//对串口设备进行初始化操作
								Toast.makeText(MainActivity.this, "设备初始化失败!",
										Toast.LENGTH_SHORT).show();
								Toast.makeText(MainActivity.this, "打开"  
												"设备失败!",
										Toast.LENGTH_SHORT).show();
								return;
							}
							Toast.makeText(MainActivity.this, "打开设备成功!",
									Toast.LENGTH_SHORT).show();
							MyApp.driver.SetConfig(baudRate, dataBit, stopBit, parity,//配置串口波特率,函数说明可参照编程手册
									flowControl);
							isOpen = true;
							openButton.setText("Close");
							btnBoot.setEnabled(true);
							new readThread().start();//开启读线程读取串口接收的数据
						} else {
							AlertDialog.Builder builder = new AlertDialog.Builder(activity);
							builder.setIcon(R.drawable.icon);
							builder.setTitle("未授权限");
							builder.setMessage("确认退出吗?");
							builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {

								@Override
								public void onClick(DialogInterface dialog, int which) {
									// TODO Auto-generated method stub
									System.exit(0);
								}
							});
							builder.setNegativeButton("返回", new DialogInterface.OnClickListener() {

								@Override
								public void onClick(DialogInterface dialog, int which) {
									// TODO Auto-generated method stub
								}
							});
							builder.show();
						}
					} else {
						openButton.setText("Open");
						writeButton.setEnabled(false);
						btnBoot.setEnabled(false);
						isOpen = false;
						try {
							Thread.sleep(200);
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						MyApp.driver.CloseDevice();
						totalrecv = 0;
					}
				}
				break;
				case  R.id.btn_clear:
				{
					totalrecv = 0;
					readText.setText("");
				}
				break;
				case R.id.WriteButton:
				{
					try {
						txt_rec.setText("");
						fs = new FileInputStream(path);
						Str="文件共" String.valueOf(fs.available()) "字节" "\n";
						packet_send=0;
						refreshLogView(Str);
						datatosend=new byte[3];
						datatosend[0]=(byte)0x44; datatosend[1]=(byte)0x4d;
						datatosend[2]=(byte)0x46;
						int retval = MyApp.driver.WriteData(datatosend, datatosend.length);
						if (retval < 0)
							Toast.makeText(MainActivity.this, "写失败!",
									Toast.LENGTH_SHORT).show();
					}
					catch (IOException e)
					{
						e.printStackTrace();
					}
				}
				break;
				case R.id.btn_boot:
				{
					datatosend=new byte[7];
					datatosend[0]=(byte)0xe1; datatosend[1]=(byte)0xe2; datatosend[2]=(byte)0xe3;
					datatosend[3]=(byte)0x1e; datatosend[4]=(byte)0x2e; datatosend[5]=(byte)0x0d;
					datatosend[6]=(byte)0x0a;
					int retval = MyApp.driver.WriteData(datatosend, datatosend.length);
					if (retval < 0)
						Toast.makeText(MainActivity.this, "写失败!",
								Toast.LENGTH_SHORT).show();
				}
				break;
			}
		}
	}
	private String[] fileArray;
	class FileSelectedListener implements AdapterView.OnItemSelectedListener {
		public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
			path = mPath   fileArray[arg2];
		}
		public void onNothingSelected(AdapterView<?> arg0) {
		}
	}

	public class MyOnBaudSelectedListener implements OnItemSelectedListener {

		@Override
		public void onItemSelected(AdapterView<?> parent, View view,
				int position, long id) {
			baudRate = Integer.parseInt(parent.getItemAtPosition(position)
					.toString());
		}

		@Override
		public void onNothingSelected(AdapterView<?> parent) {

		}
	}

	public class MyOnStopSelectedListener implements OnItemSelectedListener {

		@Override
		public void onItemSelected(AdapterView<?> parent, View view,
				int position, long id) {
			stopBit = (byte) Integer.parseInt(parent
					.getItemAtPosition(position).toString());
		}

		@Override
		public void onNothingSelected(AdapterView<?> parent) {

		}

	}

	public class MyOnDataSelectedListener implements OnItemSelectedListener {

		@Override
		public void onItemSelected(AdapterView<?> parent, View view,
				int position, long id) {
			dataBit = (byte) Integer.parseInt(parent
					.getItemAtPosition(position).toString());
		}

		@Override
		public void onNothingSelected(AdapterView<?> parent) {

		}

	}

	public class MyOnParitySelectedListener implements OnItemSelectedListener {

		@Override
		public void onItemSelected(AdapterView<?> parent, View view,
				int position, long id) {
			String parityString = new String(parent.getItemAtPosition(position)
					.toString());
			if (parityString.compareTo("None") == 0) {
				parity = 0;
			}

			if (parityString.compareTo("Odd") == 0) {
				parity = 1;
			}

			if (parityString.compareTo("Even") == 0) {
				parity = 2;
			}

			if (parityString.compareTo("Mark") == 0) {
				parity = 3;
			}

			if (parityString.compareTo("Space") == 0) {
				parity = 4;
			}
		}

		@Override
		public void onNothingSelected(AdapterView<?> parent) {

		}
	}

	public class MyOnFlowSelectedListener implements OnItemSelectedListener {

		@Override
		public void onItemSelected(AdapterView<?> parent, View view,
				int position, long id) {
			String flowString = new String(parent.getItemAtPosition(position)
					.toString());
			if (flowString.compareTo("None") == 0) {
				flowControl = 0;
			}

			if (flowString.compareTo("CTS/RTS") == 0) {
				flowControl = 1;
			}
		}

		@Override
		public void onNothingSelected(AdapterView<?> parent) {

		}

	}

	private class readThread extends Thread {

		public void run() {

			byte[] buffer = new byte[4096];
			
			while (true) {
				
				Message msg = Message.obtain();
				if (!isOpen) {
					break;
				}
				int length = MyApp.driver.ReadData(buffer, 4096);
				if (length > 0) {
					totalrecv  = length;
					String recv = String.valueOf(totalrecv); 
					msg.obj = recv;
					handler.sendMessage(msg);
				}
			}
		}
	}