实例介绍
【实例截图】
【核心代码】
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); } } } }
标签: STM32
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论