从 Arduino UNO R3 套件读取数据

2023-12-02

我正在尝试读取我已经存储在的数据Arduino套件,我正在使用物理类库为了达成这个。我通过使用以下命令将套件连接到我的电脑来测试该套件(读取数据):B 型 USB 电缆由Arduino本身提供并使用泰拉术语。在我按键盘上的“@”后数据开始传输(特定于我们的实现)。

但是,当我将其连接到我的 Android 平板电脑并使用physicaloid 的测试项目打开设备并开始通信时,每次我单击“打开”时,它都会显示一个 Toast,表示无法打开。每次提示时我都会授予访问 USB 设备的权限。这是我创建的用于读取数据的示例程序:

if(mPhysicaloid.open()){

        Toast.makeText(getBaseContext(), "communicating", Toast.LENGTH_SHORT).show();
        String signalToStart = new String("@");
        byte[] bufToWrite = signalToStart.getBytes();
        mPhysicaloid.write(bufToWrite, bufToWrite.length);

        byte[] buf = new byte[255];
        mPhysicaloid.read(buf);
        String data = new String(buf);
        tvResult.setText(data);
        mPhysicaloid.close();

    }
    else 
        Toast.makeText(getBaseContext(), "no communication with device", Toast.LENGTH_LONG).show();

现在这是我想了解的有关来自Arduino USB 电缆: 是在RS232格式Android设备无法理解的地方(我不知道,我可能在询问这个数据格式时犯了一个错误)或者是在USB数据格式那适合Android设备了解一下吗?请帮忙,我已经搜索了一整天了。我该如何打开设备并进行通信?


我终于想到了从串行USB设备读取数据的想法。所以我想我会分享它:

首先,连接所有 USB 设备(如果多个)并获取合适的接口并搜索要通信的端点。初始化 USB 设备时,请确保考虑您真正想要与之通信的 USB 设备。您可以通过考虑产品 ID 和供应商 ID 来做到这一点。 执行上述操作的代码..

private boolean searchEndPoint() {

    usbInterface = null;//class level variables, declare these.
    endpointOut = null;
    endpointIn = null;

    Log.d("USB","Searching device and endpoints...");

    if (device == null) {
        usbDevices = usbManager.getDeviceList();
        Iterator<UsbDevice> deviceIterator = usbDevices.values().iterator();

        while (deviceIterator.hasNext()) {
            UsbDevice tempDevice = deviceIterator.next();

            /**Search device for targetVendorID(class level variables[vendorId = SOME_NUMBER and productId=SOME_NUMBER] which u can find) and targetProductID.*/
            if (tempDevice .getVendorId() == vendorId) {
                if (tempDevice .getProductId() == productId) {
                    device = tempDevice ;
                }                                                                                                                                                                                                                                                                                                                                                                
            }
        }
    }

    if (device == null){ 
        Log.d("USB","The device with specified VendorId and ProductId not found");
        return false;
    }

    else
        Log.d("USB","device found");

    /**Search for UsbInterface with Endpoint of USB_ENDPOINT_XFER_BULK,
     *and direction USB_DIR_OUT and USB_DIR_IN
     */
    try{
        for (int i = 0; i < device.getInterfaceCount(); i++) {
            UsbInterface usbif = device.getInterface(i);

            UsbEndpoint tOut = null;
            UsbEndpoint tIn = null;

            int tEndpointCnt = usbif.getEndpointCount();
            if (tEndpointCnt >= 2) {
                for (int j = 0; j < tEndpointCnt; j++) {
                    if (usbif.getEndpoint(j).getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
                        if (usbif.getEndpoint(j).getDirection() == UsbConstants.USB_DIR_OUT) {
                            tOut = usbif.getEndpoint(j);
                        } else if (usbif.getEndpoint(j).getDirection() == UsbConstants.USB_DIR_IN) {
                            tIn = usbif.getEndpoint(j);
                        }
                    }
                }

                if (tOut != null && tIn != null) {
                    /** This interface have both USB_DIR_OUT
                     * And USB_DIR_IN of USB_ENDPOINT_XFER_BULK
                     */
                    usbInterface = usbif;
                    endpointOut = tOut;
                    endpointIn = tIn;
                }
            }

        }

        if (usbInterface == null) {
            Log.d("USB","No suitable interface found!");
            return false;
        } else {
            Log.d("USB","Suitable interface found!");
            return true;
        }



    }catch(Exception ex){

        ex.printStackTrace();
        return false;
    }
}

现在您已经拥有了可以进行通信的设备、USB 接口和端点。现在是时候在 Android 设备和 USB 设备之间建立连接了。 以下是相关代码(并检查连接是否已建立并正在通信):

private boolean checkUsbCOMM() {

    /**Value for setting request, on the USB connection.*/
    final int RQSID_SET_CONTROL_LINE_STATE = 0x22;

    boolean success = false;

    Log.d("USB","Checking USB Device for communication: ");
    try{

        Boolean permitToRead = SUSBS_usbManager.hasPermission(SUSBS_device);

        if (permitToRead) {
             //class level variable(connection, usbManager : declare it)
            connection = usbManager.openDevice(device);

            if (connection != null) {
                connection.claimInterface(usbInterface, true);

                int usbResult;

                usbResult = connection.controlTransfer(0x21,  //requestType
                        RQSID_SET_CONTROL_LINE_STATE,               //SET_CONTROL_LINE_STATE(request)
                        0,                                          //value
                        0,                                          //index
                        null,                                       //buffer
                        0,                                          //length
                        500);                                       //timeout = 500ms


                Log.i("USB","controlTransfer(SET_CONTROL_LINE_STATE)[must be 0 or greater than 0]: "+usbResult);

                if(usbResult >= 0)
                    success = true;
                else 
                    success = false;

            }

        }

        else {
            /**If permission is not there then ask for permission*/
            usbManager.requestPermission(device, mPermissionIntent);
            Log.d("USB","Requesting Permission to access USB Device: ");

        }

        return success;

    }catch(Exception ex){

        ex.printStackTrace();
        return false;
    }

}

瞧,USB 设备现在可以进行通信了。那么让我们使用单独的线程来阅读:

if(device!=null){
Thread readerThread = new Thread(){

                public void run(){

                    int usbResult = -1000;
                    int totalBytes = 0;

                    StringBuffer sb = new StringBuffer();
                    String usbReadResult=null;
                    byte[] bytesIn ;

                    try {

                        while(true){
                            /**Reading data until there is no more data to receive from USB device.*/
                            bytesIn = new byte[endpointIn.getMaxPacketSize()];
                            usbResult = connection.bulkTransfer(endpointIn, 
                                    bytesIn, bytesIn.length, 500);

                            /**The data read during each bulk transfer is logged*/
                            Log.i("USB","data-length/read: "+usbResult);

                            /**The USB result is negative when there is failure in reading or
                             *  when there is no more data to be read[That is : 
                             *  The USB device stops transmitting data]*/
                            if(usbResult < 0){
                                Log.d("USB","Breaking out from while, usb result is -1");
                                break;

                            }

                            /**Total bytes read from the USB device*/
                            totalBytes = totalBytes+usbResult;
                            Log.i("USB","TotalBytes read: "+totalBytes);

                            for(byte b: bytesIn){

                                if(b == 0 )
                                    break;
                                else{
                                    sb.append((char) b);
                                }


                            }

                        }

                        /**Converting byte data into characters*/
                        usbReadResult = new String(sb);
                        Log.d("USB","The result: "+usbReadResult);
                        //usbResult holds the data read.

                    } catch (Exception ex) {

                        ex.printStackTrace();
                    }


                }

            };

            /**Starting thread to read data from USB.*/
            SUSBS_readerThread.start();
            SUSBS_readerThread.join();


        }

为了获得许可,请确保添加PendingIntent以及将权限添加到您的清单中。

Android 清单:<uses-feature android:name="android.hardware.usb.host" />

待定意图:

private PendingIntent mPermissionIntent;
private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
mPermissionIntent = PendingIntent.getBroadcast(MainActivity.this,
            0, new Intent(ACTION_USB_PERMISSION), 0);

    /**Setting up the Broadcast receiver to request a permission to allow the APP to access the USB device*/
    IntentFilter filterPermission = new IntentFilter(ACTION_USB_PERMISSION);
    registerReceiver(mUsbReceiver, filterPermission);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Arduino UNO R3 套件读取数据 的相关文章

  • Android - 材料设计 - NavigationView - 如何放置垂直滚动?

    我正在使用 NavigationViewcompile com android support design 22 2 1 嗯 一切都很好 除非它没有垂直滚动 如何通过xml设置呢 xml
  • 如何让Android设备始终处于唤醒模式?

    设备root成功后 现在 我需要使设备始终处于唤醒状态 即始终可见 UI 并且没有黑屏或任何白日梦屏幕 为此 我认为我必须完成以下任务 无锁屏 已关闭 睡眠设置为 从不 白日梦设置为 关闭 我发现都是关于应用程序层的 即有一些应用程序可以完
  • 当选择模式为 MultiChoice Modal 时,如何防止激活某些 ListView 项目?

    我有一个由自定义 BaseAdapter 填充的自定义 GridView GridView的选择模式是MultiChoiceModal 我想控制长单击时可以激活哪些项目 同时仍然确保它们响应 短 单击事件 BaseAdapter有一个方法叫
  • Android:订阅 Firebase 云消息传递 (FCM) 主题

    根据Firebase 云消息传递文档 https firebase google com docs cloud messaging android send multiple 为了订阅用户的主题 我需要调用 FirebaseMessagin
  • 如何在 Android 中恢复我的音频?

    我必须实现用于创建具有暂停和恢复状态的音频的应用程序 当我的应用程序作为启动时音频启动 当我按下模拟器上的后退按钮时 音频音乐处于暂停状态 但是当我的活动回来时从停止状态到前台我的音频音乐未恢复 这是我的代码 public class Au
  • IntelliJ IDEA 中的 Android 开发导致电脑死机

    我使用 IntelliJ IDEA 10 5 进行 Android 开发 并使用最新的 Google USB 驱动程序 版本 4 进行调试 在 IntelliJ IDEA 中开发一段时间后 当通过 USB 连接 Android 设备 Nex
  • java.io.IOException:无法打开同步连接!进入 Nexus [重复]

    这个问题在这里已经有答案了 我尝试在 Eclipse 上运行我的应用程序 但发现了这些错误 这是第一次遇到 所以请给我关于这些错误的任何想法 我目前使用的是 Nexus 手机 2011 08 04 15 59 09 App Android
  • Fragment 内的 FragmentPagerAdapter

    我在实现基于多个 ViewPager 的设计时遇到了一些麻烦 在较高的层次上 我有一个 FragmentActivity 其中只有一个 FrameLayout 作为其内容 我有 3 个不同的片段想要显示 所有 3 个均为全屏 一次仅使用 1
  • 当用户拒绝权限时,某些设备上的 onRequestPermissionsResult grantResults 返回空

    In Shot In onRequestPermissionsResult某些设备上的 grantResults 返回空 而某些设备上有一个值PackageManager PERMISSION DENIED当用户拒绝许可时 我已经实现了一个
  • Android 防火墙与 VpnService

    我正在尝试使用 BS 项目的 VpnService 为 Android 实现一个简单的防火墙 我选择 VpnService 因为它将在非 root 设备上运行 它将记录连接并让您过滤连接 基于IP 有一个应用程序可以做到这一点 因此这是可能
  • PhoneGap BarcodeScanner - ClassNotFound

    UPDATE 2 我发布了一个解决我原来问题的答案 看欲了解更多信息 https stackoverflow com a 9541490 398519 UPDATE供任何想知道的人参考 最后我发现了这个 http github com co
  • Android 如何使用 facebook 3.0 sdk 点赞帖子

    我想在我的 Android 应用程序中实现 喜欢 选项 但我不知道要使用哪个请求 我打开了一个有效的 Facebook 会话以及我想要点赞的 ID 帖子 我该如何实现这个功能呢 Thanks 我找到了解决方案 为了喜欢帖子 我使用 face
  • Android imageview 改变色调来模拟按钮点击

    我有一个图像视图 我在其中设置了从网址获取的位图 在 imageview 上 我设置了一个 onClickListener 来打开一个对话框 当按下图像视图时 我想以某种方式改变色调 使其更暗 以提供一种类似按钮点击的感觉 你有什么建议 h
  • 在 Android 上获取一个滚动到 GridView 底部视图的按钮

    我正在尝试将现有的 iPhone 应用程序移植到 Android 我希望有一个按钮滚动到 GridView 底部的视图中 以使用户能够从服务器加载更多数据 目前 我的解决方案只是修复屏幕底部的一个按钮 而不是让它滚动到视图中 这是我的布局代
  • Android 模拟器问题

    当我启动模拟器时 我遇到很多问题 错误 HttpConnectionApp emulator 5554 disconnected Cancelling net paxcel http HttpConnectionApp activity l
  • 未从线程接收位置数据

    我尝试使用计时器经常发送包含用户位置的短信 最初 我遇到了空指针异常 这是由于我犯了一个简单的错误 一旦解决了这个问题 一切似乎都运行良好 但是 它永远不会获取我的位置 因此 不断发送的文本显示 无法接收位置 我想问的是为什么它无法获取我的
  • 使用 Lint 和 SonarQube 分析 Android 项目

    我真的 溢出 了试图让这些东西一起工作 我按照这里的指示进行操作 http docs sonarqube org display PLUG Android Lint Plugin http docs sonarqube org displa
  • 如何更改区域设置以使用拉丁塞尔维亚语(而不是西里尔塞尔维亚语)

    塞尔维亚语有拉丁字母和西里尔字母 在 Android 的日期和时间选择器小部件中 显示的塞尔维亚语言区域字母似乎是西里尔字母 如此处所示 我想更改区域设置 以便 Android 小部件使用拉丁塞尔维亚字母 当前的语言 国家代码 产生西里尔字
  • Android 多点触控

    因此 我尝试使用 onTouchEvent 检查多个屏幕触摸 但它似乎仍然只读取第一次触摸 有人可以帮忙吗 这是我的代码 public boolean onTouchEvent MotionEvent e int num e getPoin
  • 获取Android联系人排序首选项

    在 Android 的 联系人 gt 设置 中 我们有 列表排序依据 和 查看联系人姓名 选项 有什么方法可以在另一个应用程序中获取这些首选项吗 这意味着我的应用程序有我自己版本的联系人列表 我需要这些才能对其进行相应的排序 int sor

随机推荐

  • 如何在 d3 时间格式数据中包含时区?

    我正在使用 d3 v4 我的 x 轴数据由以毫秒为单位的时间组成 自 1970 年以来 例如 我想将其显示为东部标准时间 08 09 17 5 20 PM EDT 所以我尝试了 focus select text text d value
  • 如何获取J2ME支持的所有设备的IMEI? [复制]

    这个问题在这里已经有答案了 可能的重复 J2me中如何动态获取手机IMEI号 有没有办法获得 J2ME 支持的所有设备的 IMEI 我做了一些谷歌搜索并找到了下面的解决方案 但它是针对特定设备的 诺基亚 System getProperty
  • MVC4 Eonasdan Bootstrap 3 日期时间选择器无法打开选择器屏幕

    我正在使用此处链接的 Bootstrap 3 日期和时间选择器 Bootstrap 3 的日期时间选择器 我无法打开拣选窗口 当您单击文本框时 没有任何反应 浏览器控制台 Chrome 上也不会显示任何消息 因此 事实上 该控件作为一个简单
  • 如何获取通过电话接入点连接的设备数量?

    众所周知 Android 设备具有将手机变成接入点 热点的功能 是否可以通过编程方式获取连接到手机 WiFi 接入点的设备数量 您可以对接入点上连接的设备进行计数 并在 Android 上通过以下链接获取硬件 MAC 地址 http www
  • 基本的情节示例显示 Jupyter 实验室中没有情节

    我只是尝试在 jupyter 笔记本中离线使用情节 使用 jupyter 实验室 这docs给出这个例子 import plotly import plotly graph objs as go plotly offline init no
  • Telerik MVC Grid ClientTemplate 复选框最初未显示

    我有一个与此处的帖子非常相似的问题 带有复选框的 Telerik 网格 网格最初绘制时复选框不显示 基本上 我有一个 Telerik MVC3 剃刀网格 其中包含一个由复选框组成的 ClientTemplate 列 当页面最初加载时 该复选
  • 关于window上的jQuery源==的问题

    data function elem name data if jQuery acceptData elem return elem elem window windowData elem 直接从 jQuery 源复制 为什么使用不安全el
  • 类型错误:添加的图层必须是 Layer 类的实例。找到:

    导入库和模型 from future import print function import keras from keras datasets import mnist from tensorflow keras models impo
  • openpyxl - x 和 y 轴刻度的增量

    我正在创建的条形图会自动缩放 Y 轴刻度增量 从 0 开始为0 5 1 1 5等等 我想让它只以整数递增 即0 1 2 3 4等等我试过了chart y axis tickLblSkip 1但我有疑问 因为我相信这只是标签本身 而不是实际的
  • 是否可以在 XP 上运行 .NET 4.5 应用程序?

    首先 我已阅读以下内容 连接案例 VS case 尤其是这个频道9帖子 因此 从最后一个要点来看 我确实认为没有办法解决这个问题 但我必须看看是否可以获得明确的答案 因为我的团队希望从 NET 4 0 升级到 NET 4 5 不过 我们必须
  • 动态字典名称解码器 json

    Swift 4 我的情况与在动态类型 对象上使用 Codable但对我来说 变化的变量是字典的名称 而不是里面的键 看起来像 customName constantKey Double constantKey2 Double 这是我试图更改
  • Raspberry Pi 4 I2C 总线无法正常工作

    尽管 i2cDetect 确实检测到目标 但我的 Raspberry Pi 4 Model B 上的 I2C 总线无法正常工作 我尝试使用 Raspberry Pi Sense HAT 和 SSD1306 OLED 显示屏以及带有 I2C
  • 如何知道Databricks支持的文件格式?

    我需要将各种文件 不同类型 加载到 Spark 数据框中 Databricks 支持所有这些文件格式吗 如果是 我在哪里可以获得每种文件格式支持的选项列表 delimited csv parquet avro excel json Than
  • 如何在一行中计算数据框中的并发事件?

    我有一个包含电话的数据集 我想计算每条记录有多少个活动呼叫 我找到了这个question但我想避免循环和函数 每个调用都有一个date a start time and a end time 数据框 start end date 0 09
  • 如何更新 OptionMenu 的命令

    我正在尝试在实例化后设置或更新 OptionMenu 的命令 The widget configure command foo 声明适用于Button and CheckButton 但不适合OptionMenu 以下代码引发此错误 tki
  • 为什么我无法关闭或消除 UIWebView 中的 Javascript 警报?

    情况 我调用 Javascriptalert通过UIWebView method stringByEvaluatingJavaScriptFromString 像这样 myWebView stringByEvaluatingJavaScri
  • 在 Django 中自动填充一组通用的多对多字段?

    我正在尝试结合this答案和这个one 带有一点 for 循环 在创建角色时 我想添加所有可能的技能 其值为 0 但我对如何遵循上述答案感到困惑 我有这个混合 class CrossCharacterMixin models Model c
  • PHP 多维数组 - 删除重复项

    如果有人能在这里帮助我 我将永远感激不已 因为我已经花了大约 2 天的时间试图让它发挥作用 我想获取两个多维数组并比较它们 然后remove任何重复的记录 场景是 array2 中的值已分配给用户的配置文件 array1 中的值是用户可以选
  • Python:将文本文件转换为二进制文件

    我们可以将任何数字文件转换为二进制文件 我有一个1MB的文本文件 我想将其转换为二进制字符串并将输出视为二进制数 反之亦然 换句话说 如果我有二进制数 我想将其转换为文本文件 我怎样才能在Python中做到这一点 有没有标准的方法来做到这一
  • 从 Arduino UNO R3 套件读取数据

    我正在尝试读取我已经存储在的数据Arduino套件 我正在使用物理类库为了达成这个 我通过使用以下命令将套件连接到我的电脑来测试该套件 读取数据 B 型 USB 电缆由Arduino本身提供并使用泰拉术语 在我按键盘上的 后数据开始传输 特