实例介绍
【实例截图】
【核心代码】
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小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论