【问题标题】:How to read and write data to COM/Serial ports in Android? [duplicate]如何在 Android 中读取和写入数据到 COM/Serial 端口? [复制]
【发布时间】:2023-03-09 22:45:02
【问题描述】:

我必须在使用 Android 的设备的 COM 端口中读取和写入数据。我为此使用 javax.comm 包,但是当我安装 apk 文件时,它没有显示设备的任何端口。我需要在清单文件中添加任何权限吗?

【问题讨论】:

    标签: java android javax.comm


    【解决方案1】:

    您的问题与操作系统有关。 Android runs Linux under the hood,Linux 对待串行端口的方式与 Windows 不同。 javax.comm 还包含 win32com.dlldriver file,您将无法在 Android 设备上安装它。如果您确实找到了实现您想要做的事情的方法,那么您实际上无法在 Linux 环境中寻找“COM”端口。串行端口将使用不同的名称。

     Windows Com Port   Linux equivalent  
          COM 1           /dev/ttyS0  
          COM 2           /dev/ttyS1
          COM 3           /dev/ttyS2 
    

    因此,假设您的想法可行,您必须寻找这些名称。

    幸运的是,Android 确实提供了与 USB 设备接口的规定(我假设您想要连接,而不是并行或 RS-232 端口)。为此,您需要将设备设置为USB Host.,您需要执行以下操作:

    1. 获取USBManager.
    2. 找到您的设备。
    3. 获取USBInterfaceUSBEndpoint
    4. 打开一个连接。
    5. 传输数据。

    这是我对你将如何做的粗略估计。当然,您的代码会有更成熟的处理方式。

    String YOUR_DEVICE_NAME;
    byte[] DATA;
    int TIMEOUT;
    
    USBManager manager = getApplicationContext().getSystemService(Context.USB_SERVICE);
    Map<String, USBDevice> devices = manager.getDeviceList();
    USBDevice mDevice = devices.get(YOUR_DEVICE_NAME);
    USBDeviceConnection connection = manager.openDevice(mDevice);
    USBEndpoint endpoint = device.getInterface(0).getEndpoint(0);
    
    connection.claimInterface(device.getInterface(0), true);
    connection.bulkTransfer(endpoint, DATA, DATA.length, TIMEOUT);
    

    额外的阅读材料:http://developer.android.com/guide/topics/connectivity/usb/host.html

    【讨论】:

    • 我运行你的这个代码,现在你能告诉我有什么方法可以识别出命令是否到达USB设备!并且还想知道如果此消息成功到达设备,那么它也必须返回一些命令,所以我可以从哪里检测到!请回复谢谢。
    • @gobemador 你能否建议上面的演示现在是否可以使用最新的设备,因为我已经完成了实现但是android和windows pc之间没有连接。
    【解决方案2】:

    我不是专家,但对于所有想要连接串行 RS-232 端口或打开串行端口但无法通过 UsbManager 找到他们的设备的人,您可以使用类似的方法找到所有设备这个:

    mDrivers = new Vector<Driver>();
    LineNumberReader r = new LineNumberReader(new FileReader("/proc/tty/drivers"));
    String l;
    while ((l = r.readLine()) != null) {
        String drivername = l.substring(0, 0x15).trim();
        String[] w = l.split(" +");
        if ((w.length >= 5) && (w[w.length - 1].equals("serial"))) {
            mDrivers.add(new Driver(drivername, w[w.length - 4]));
        }
    }
    

    找到所有驱动程序后,遍历所有驱动程序以获取所有设备,使用如下所示:

    mDevices = new Vector<File>();
    File dev = new File("/dev");
    
    File[] files = dev.listFiles();
    
    
    if (files != null) {
        int i;
        for (i = 0; i < files.length; i++) {
            if (files[i].getAbsolutePath().startsWith(mDeviceRoot)) {
                Log.d(TAG, "Found new device: " + files[i]);
                mDevices.add(files[i]);
            }
        }
    }
    

    这里是Driver 类构造函数,有两个成员变量:

    public Driver(String name, String root) {
        mDriverName = name;
        mDeviceRoot = root;
    }
    

    要打开串行端口,您可以使用Android SerialPort API。只需打开您设备上的串行端口和write。 (你必须知道你的设备路径和波特率,比如我的设备是ttyMt2,波特率96000。)

    int baudRate = Integer.parseInt("96000");
    mSerialPort = new SerialPort(mDevice.getPath(), baudRate, 0);
    mOutputStream = mSerialPort.getOutputStream();
    byte[] bytes = hexStr2bytes("31CE");
    mOutputStream.write(bytes);
    

    您可以从https://github.com/licheedev/Android-SerialPort-Tool下载完整的项目,而不是在此代码上浪费时间。

    【讨论】:

    • 尝试查找引用的 SerialPort API,最好的猜测是 code.google.com/archive/p/android-serialport-api,但它看起来已被弃用。还有其他 API 吗?
    • 您是否尝试过从 GitHub 运行示例项目,它也会包含串口 API 代码
    猜你喜欢
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多