package ainet.smartrobot.usb_test;
import androidx.appcompat.app.AppCompatActivity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbEndpoint;
import android.hardware.usb.UsbInterface;
import android.hardware.usb.UsbManager;
import android.hardware.usb.UsbRequest;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MainActivity extends AppCompatActivity {
private Button btnSend;
private TextView textView;
//USB管理器:负责管理USB设备的类
private UsbManager manager;
//stm32的USB设备
private UsbDevice stm32Device;
//stm32设备的一个接口
private UsbInterface stm32Interface;
private UsbDeviceConnection stm32DeviceConnection;
//代表一个接口的某个节点的类:写数据节点
private UsbEndpoint usbEpOut;
//代表一个接口的某个节点的类:读数据节点
private UsbEndpoint usbEpIn;
//要发送信息字节
private byte[] sendBytes;
//接收到的信息字节
private byte[] receiveBytes;
//发送线程池
ExecutorService sendPool = Executors.newCachedThreadPool();
UsbSendThread usbSendThread=new UsbSendThread();
UsbRecevieThread usbRecevieThread=new UsbRecevieThread();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
btnSend = findViewById(R.id.btn_send);
ButtonClick buttonClick = new ButtonClick();
btnSend.setOnClickListener(buttonClick);
// 获取USB设备
manager = (UsbManager) getSystemService(Context.USB_SERVICE);
//获取到设备列表
HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
stm32Device = deviceList.get("stm32Usb");
if (stm32Device != null) {
showMsg("vid=" + stm32Device.getVendorId() + "---pid=" + stm32Device.getProductId());
}
//获取设备接口
// 一般来说一个设备都是一个接口,你可以通过getInterfaceCount()查看接口的个数
// 这个接口上有两个端点,分别对应OUT 和 IN
stm32Interface = stm32Device.getInterface(0);
//用UsbDeviceConnection 与 UsbInterface 进行端点设置和通讯
if (stm32Interface.getEndpoint(1) != null) {
usbEpOut = stm32Interface.getEndpoint(1);
}
if (stm32Interface.getEndpoint(0) != null) {
usbEpIn = stm32Interface.getEndpoint(0);
}
if (stm32Interface != null) {
// 判断是否有权限
if (manager.hasPermission(stm32Device)) {
// 打开设备,获取 UsbDeviceConnection 对象,连接设备,用于后面的通讯
stm32DeviceConnection = manager.openDevice(stm32Device);
if (stm32DeviceConnection == null) {
return;
}
if (stm32DeviceConnection.claimInterface(stm32Interface, true)) {
showMsg("设备已找到");
} else {
stm32DeviceConnection.close();
}
} else {
showMsg("无权限");
}
} else {
showMsg("未找到设备");
}
BroadcastReceiver usbReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (device != null) {
stm32DeviceConnection.releaseInterface(stm32Interface);
stm32DeviceConnection.close();
}
}
}
};
sendPool.execute(usbRecevieThread);
}
private void sendToUsb(String content) {
sendBytes = content.getBytes();
int ret = -1;
// 发送准备命令
ret = stm32DeviceConnection.bulkTransfer(usbEpOut, sendBytes, sendBytes.length, 5000);
showMsg("指令已经发送");
}
private String readFromUsb() {
String str=null;
//读取数据2
int inMax = usbEpIn.getMaxPacketSize();
ByteBuffer byteBuffer = ByteBuffer.allocate(inMax);
UsbRequest usbRequest = new UsbRequest();
usbRequest.initialize(stm32DeviceConnection, usbEpIn);
usbRequest.queue(byteBuffer, inMax);
if (stm32DeviceConnection.requestWait() == usbRequest) {
byte[] retData = byteBuffer.array();
try {
str = new String(retData, "UTF-8");
showMsg("收到数据:" + str);
} catch (UnsupportedEncodingException e) {
str=null;
e.printStackTrace();
}
}
return str;
}
public void showMsg(String msg) {
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
Log.e("stm32Usb:-->>", msg);
}
class ButtonClick implements View.OnClickListener {
@Override
public void onClick(View view) {
int id = view.getId();
String temp = null;
switch (id) {
case R.id.btn_send:
usbSendThread.setMsg("usb data test");
sendPool.execute(usbSendThread);
break;
default:
break;
}
}
}
class UsbSendThread extends Thread {
private String c_v_msg;
public UsbSendThread() {
}
public void setMsg(String msg) {
c_v_msg = msg;
}
@Override
public void run() {
sendToUsb(c_v_msg);
c_v_msg="";
}
}
class UsbRecevieThread extends Thread {
private String c_v_msg;
public UsbRecevieThread() {
}
public String getMsg() {
return c_v_msg;
}
@Override
public void run() {
while (true) {
c_v_msg = null;
c_v_msg = readFromUsb();
if(c_v_msg!=null){
textView.setText(c_v_msg);
}
}
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
基于安卓和stm32的usb通信实验.zip
共160个文件
o:32个
d:32个
crf:31个
0 下载量 124 浏览量
2024-08-19
09:31:28
上传
评论
收藏 9.05MB ZIP 举报
温馨提示
项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松copy复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全栈开发),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助 【资源内容】:项目具体内容可查看/点击本页面下方的*资源详情*,包含完整源码+工程文件+说明(若有)等。【若无VIP,此资源可私信获取】 【本人专注IT领域】:有任何使用问题欢迎随时与我联系,我会及时解答,第一时间为您提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【适合场景】:相关项目设计中,皆可应用在项目开发、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面中 可借鉴此优质项目实现复刻,也可基于此项目来扩展开发出更多功能 #注 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担 2. 部分字体及插图等来自网络,若是侵权请联系删除,本人不对所涉及的版权问题或内容负法律责任。收取的费用仅用于整理和收集资料耗费时间的酬劳 3. 积分资源不提供技术指导/答疑
资源推荐
资源详情
资源评论
收起资源包目录
基于安卓和stm32的usb通信实验.zip (160个子文件)
usb_test.axf 609KB
gradlew.bat 2KB
usbd_conf.c 18KB
system_stm32f1xx.c 14KB
usbd_desc.c 10KB
usbd_storage_if.c 6KB
stm32f1xx_it.c 6KB
main.c 5KB
usb_device.c 3KB
stm32f1xx_hal_msp.c 2KB
usbd_msc_scsi.crf 551KB
usbd_conf.crf 548KB
usbd_msc.crf 547KB
usbd_msc_bot.crf 546KB
usbd_storage_if.crf 545KB
usb_device.crf 544KB
usbd_ctlreq.crf 541KB
usbd_desc.crf 539KB
usbd_core.crf 539KB
stm32f1xx_ll_usb.crf 539KB
usbd_ioreq.crf 537KB
main.crf 532KB
stm32f1xx_hal_pcd.crf 531KB
stm32f1xx_hal_rcc.crf 526KB
usbd_msc_data.crf 526KB
stm32f1xx_hal_dma.crf 522KB
stm32f1xx_hal_flash_ex.crf 520KB
stm32f1xx_hal_flash.crf 519KB
stm32f1xx_hal_gpio.crf 518KB
stm32f1xx_hal_exti.crf 517KB
stm32f1xx_hal_pwr.crf 517KB
stm32f1xx_hal_rcc_ex.crf 517KB
stm32f1xx_hal.crf 516KB
stm32f1xx_hal_cortex.crf 515KB
stm32f1xx_it.crf 515KB
stm32f1xx_hal_pcd_ex.crf 515KB
stm32f1xx_hal_msp.crf 515KB
system_stm32f1xx.crf 515KB
stm32f1xx_hal_gpio_ex.crf 514KB
stm32f1xx_hal_tim_ex.crf 514KB
stm32f1xx_hal_tim.crf 514KB
usbd_msc_scsi.d 3KB
usbd_storage_if.d 3KB
usb_device.d 3KB
usbd_msc_bot.d 3KB
usbd_msc.d 3KB
usbd_conf.d 3KB
usbd_ctlreq.d 3KB
usbd_ioreq.d 3KB
usbd_core.d 3KB
usbd_desc.d 3KB
usbd_msc_data.d 3KB
stm32f1xx_hal_flash_ex.d 3KB
stm32f1xx_hal_gpio_ex.d 2KB
stm32f1xx_hal_cortex.d 2KB
stm32f1xx_hal_rcc_ex.d 2KB
stm32f1xx_hal_pcd_ex.d 2KB
stm32f1xx_hal_tim_ex.d 2KB
stm32f1xx_hal_flash.d 2KB
stm32f1xx_hal_exti.d 2KB
stm32f1xx_hal_gpio.d 2KB
stm32f1xx_hal_msp.d 2KB
stm32f1xx_hal_tim.d 2KB
stm32f1xx_hal_pwr.d 2KB
stm32f1xx_hal_rcc.d 2KB
stm32f1xx_hal_pcd.d 2KB
stm32f1xx_hal_dma.d 2KB
stm32f1xx_ll_usb.d 2KB
main.d 2KB
system_stm32f1xx.d 2KB
stm32f1xx_it.d 2KB
stm32f1xx_hal.d 2KB
startup_stm32f103xb.d 54B
usb_test_usb_test.dep 89KB
.gitignore 445B
.gitignore 208B
.gitignore 6B
build.gradle 1KB
build.gradle 530B
settings.gradle 44B
gradlew 5KB
stm32f1xx_hal_conf.h 15KB
usbd_conf.h 4KB
usbd_desc.h 3KB
usbd_storage_if.h 3KB
usb_device.h 2KB
stm32f1xx_it.h 2KB
main.h 2KB
usb_test.hex 36KB
usb_test.htm 94KB
usb_test.build_log.htm 3KB
usb_test.ioc 4KB
gradle-wrapper.jar 53KB
MainActivity.java 7KB
ExampleInstrumentedTest.java 764B
ExampleUnitTest.java 386B
usb_test.lnp 1KB
startup_stm32f103xb.lst 37KB
usb_test.map 142KB
.mxproject 10KB
共 160 条
- 1
- 2
资源评论
热爱技术。
- 粉丝: 2568
- 资源: 7860
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功