Android USB转ttl串口

本文描述了一个Android应用中如何使用AlertDialog进行提示,以及处理USBhost设备不支持的情况。代码展示了串口操作,如波特率设置、数据读写和线程处理,用于设备连接和通信管理。
摘要由CSDN通过智能技术生成

Dialog dialog = new AlertDialog.Builder(MainActivity.this)

.setTitle(“提示”)

.setMessage(“您的设备不支持USBhost”)

.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;

activity = this;

//打开流程主要步骤为ResumeUsbList,UartInit

openButton.setOnClickListener(new openButton());

openButton.post(new Runnable() {

@Override

public void run() {

openButton.performClick();

}

});

handler = new Handler() {

public void handleMessage(Message msg) {

String str = msg.obj.toString();//设备回来的数据

String s0 = str.substring(0, 8);

if(s0.equals(“01 03 09”)){

//String s1 = str.substring(9,23); /*卡号/

String s2 = str.substring(24,35);/*余额/

int i = Integer.valueOf(s2.replaceAll(" “,”"),16);//转换成分

String s = String.valueOf(i/100); //转换成元

synthesizer.showVideo(“您的卡上余额为:”+s+“元”);

}

readText.append((String) msg.obj);

}

};

}

class WriteButton implements View.OnClickListener{

@Override

public void onClick(View v) {

byte[] to_send = toByteArray(writeText.getText().toString());

int retval = MyApp.driver.WriteData(to_send, to_send.length);

//写数据,第一个参数为需要发送的字节数组,第二个参数为需要发送的字节长度,返回实际发送的字节长度

if (retval < 0){

Toast.makeText(MainActivity.this, “写失败”,

Toast.LENGTH_SHORT).show();

}else {

writeBtn.setOnClickListener(new WriteBtn());

writeBtn.post(new Runnable() {

@Override

public void run() {

writeBtn.performClick();

}

});

}

}

}

class WriteBtn implements View.OnClickListener{

@Override

public void onClick(View v) {

byte[] to_send = toByteArray(write.getText().toString());

int retval = MyApp.driver.WriteData(to_send, to_send.length);

//写数据,第一个参数为需要发送的字节数组,第二个参数为需要发送的字节长度,返回实际发送的字节长度

if (retval < 0) {

Toast.makeText(MainActivity.this, “写失败”,

Toast.LENGTH_SHORT).show();

}

}

}

class setButton implements View.OnClickListener{

@Override

public void onClick(View v) {

if (MyApp.driver.SetConfig((byte)9600, (byte)8, (byte)1, (byte)0,

(byte)0)) {//配置串口波特率,函数说明可参照编程手册

Toast.makeText(MainActivity.this, “串口设置成功”,

Toast.LENGTH_SHORT).show();

//01 05 00 00 FF 00 8c 3a

//01 06 00 00 00 64 88 21

/*byte[] send = toByteArray(write.getText().toString());

MyApp.driver.WriteData(send, send.length);*/

writeButton.setOnClickListener(new WriteButton());

writeButton.post(new Runnable() {

@Override

public void run() {

writeButton.performClick();

}

});

} else {

Toast.makeText(MainActivity.this, “串口设置失败”,

Toast.LENGTH_SHORT).show();

}

}

}

class openButton implements View.OnClickListener{

@Override

public void onClick(View v) {

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();

isOpen = true;

openButton.setText(“关闭”);

configButton.setEnabled(true);

writeButton.setEnabled(true);

new readThread().start();//开启读线程读取串口接收的数据

configButton.setOnClickListener(new setButton());

configButton.post(new Runnable() {

@Override

public void run() {

configButton.performClick();

}

});

} 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) {

System.exit(0);

}

});

builder.setNegativeButton(“返回”, new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

}

});

builder.show();

}

} else {

MyApp.driver.CloseDevice();

openButton.setText(“打开”);

configButton.setEnabled(false);

writeButton.setEnabled(false);

isOpen = false;

}

}

}

/*

  • 读取设备数据

  • */

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) {

String recv = toHexString(buffer, length);

msg.obj = recv;

handler.sendMessage(msg);

}

}

}

}

/**

  • 将byte[]数组转化为String类型

  • @param arg

  •        需要转换的byte[]数组
    
  • @param length

  •        需要转换的数组长度
    
  • @return 转换后的String队形

*/

private String toHexString(byte[] arg, int length) {

String result = new String();

if (arg != null) {

for (int i = 0; i < length; i++) {

result = result

  • (Integer.toHexString(

arg[i] < 0 ? arg[i] + 256 : arg[i]).length() == 1 ? “0”

  • Integer.toHexString(arg[i] < 0 ? arg[i] + 256
: arg[i])

Integer.toHexString(arg[i] < 0 ? arg[i] + 256

arg[i])) + " ";

}

return result;

}

return “”;

}

/**

  • 将String转化为byte[]数组

  • @param arg

  •        需要转换的String对象
    
  • @return 转换后的byte[]数组

*/

private byte[] toByteArray(String arg) {

if (arg != null) {

Android进阶资料

以下的资料是近年来,我和一些朋友面试收集整理了很多大厂的面试真题和资料,还有来自如阿里、小米、爱奇艺等一线大厂的大牛整理的架构进阶资料。希望可以帮助到大家。

Android进阶核心笔记

百万年薪必刷面试题

最全Android进阶学习视频

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

朋友面试收集整理了很多大厂的面试真题和资料,还有来自如阿里、小米、爱奇艺等一线大厂的大牛整理的架构进阶资料。希望可以帮助到大家。

Android进阶核心笔记

[外链图片转存中…(img-ujA7xxVd-1714129465609)]

百万年薪必刷面试题

[外链图片转存中…(img-jgBqa0WX-1714129465610)]

最全Android进阶学习视频

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 12
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Android Studio中实现串口通信,您需要遵循以下步骤: 1. 配置权限:在AndroidManifest.xml文件中添加以下行: ``` <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="android.permission.READ_LOGS" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.NFC" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_CONTACTS" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.READ_PROFILE" /> <uses-permission android:name="android.permission.WRITE_PROFILE" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" /> <uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" /> <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> <uses-permission android:name="android.permission.INSTALL_PACKAGES" /> <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" /> <uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" /> <uses-permission android:name="android.permission.DELETE_PACKAGES" /> <uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" /> <uses-permission android:name="android.permission.READ_PHONE_NUMBERS" /> <uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" /> <uses-permission android:name="android.permission.READ_PHONE_NUMBERS" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" /> <uses-permission android:name="android.permission.BODY_SENSORS" /> <uses-permission android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> <uses-permission android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" /> <uses-feature android:name="android.hardware.usb.host" /> ``` 2. 添加依赖项:在build.gradle文件中添加以下依赖项: ``` dependencies { implementation 'com.android.support:support-v4:28.0.0' implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support:design:28.0.0' implementation 'com.android.support.constraint:constraint-layout:1.1.3' implementation files('libs/usbSerialForAndroid.jar') } ``` 3. 添加代码:在您的Android Studio项目中添加以下代码: ``` public class MainActivity extends AppCompatActivity implements UsbSerialInterface.UsbReadCallback { private static final String TAG = MainActivity.class.getSimpleName(); private UsbManager usbManager; private UsbDevice device; private UsbSerialDevice serialPort; private UsbDeviceConnection connection; private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = findViewById(R.id.text_view); usbManager = (UsbManager) getSystemService(Context.USB_SERVICE); IntentFilter filter = new IntentFilter(); filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); registerReceiver(usbReceiver, filter); //获取设备列表 HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList(); if (!deviceList.isEmpty()) { boolean keep = true; for (UsbDevice device : deviceList.values()) { // 判断设备VID和PID是否符合 if (device.getVendorId() == 0x1a86 && device.getProductId() == 0x7523) { // 找到设备 this.device = device; Log.i(TAG, "找到设备"); break; } else { connection = null; this.device = null; } } if (device == null) { Log.e(TAG, "没有找到设备"); return; } } else { Log.e(TAG, "没有设备"); return; } // 打开设备,获取 UsbDeviceConnection 对象,连接设备,用于后面的通讯 connection = usbManager.openDevice(device); if (connection == null) { Log.e(TAG, "连接失败"); return; } serialPort = UsbSerialDevice.createUsbSerialDevice(device, connection); if (serialPort != null) { if (serialPort.open()) { // 开启设备 //设置波特率 serialPort.setBaudRate(9600); //设置数据位 serialPort.setDataBits(UsbSerialInterface.DATA_BITS_8); //设置停止位 serialPort.setStopBits(UsbSerialInterface.STOP_BITS_1); //设置校验位 serialPort.setParity(UsbSerialInterface.PARITY_NONE); //设置流控制 serialPort.setFlowControl(UsbSerialInterface.FLOW_CONTROL_OFF); // 开启读取线程,开始接收数据 serialPort.read(this); Log.i(TAG, "连接成功"); } else { serialPort.close(); Log.e(TAG, "开启设备失败"); } } else { Log.e(TAG, "没有找到设备"); } } @Override public void onReceivedData(byte[] bytes) { // 接收到数据的回调 runOnUiThread(() -> { String s = new String(bytes); textView.setText(s); }); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(usbReceiver); if (serialPort != null) { serialPort.close(); } } private BroadcastReceiver usbReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) { // USB设备插入 Log.i(TAG, "USB设备已插入"); } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) { // USB设备拔出 Log.i(TAG, "USB设备已拔出"); } } }; } ``` 在这个示例中,我们使用了USB to TTL串口模块。请注意,您需要正确设置波特率、数据位、停止位、校验位和流控制,以便与您的设备通信。 希望这个步骤能够帮助您在Android Studio中实现串口通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值