Android串口通信10进制转16进制

有大半年没更新了哈,现在要回归了。

情景:

之前由于工作需要,用到串口通信。在用网上谷歌开源的串口通信代码向串口发送指令时,由于机器接收的是16进制的指令。后来发现初始16进制的byte数组经过一系列转换后,变成了10进制的byte数组,当使用OutputStream的write方法向串口发送该数组时,机器没有反应。

后来心中便猜想是不是write(1)和write(0x01)到机器那边是不是不一样的数据。结果后来测试果然是不一样的。于是就需要想办法把10进制的byte数组转换成16进制。

网上查了很多资料,很多博客都是使用Integer.toHexString()来转换,但是这只是转换成16进制字符串显示,实际上还是和原始的byte16进制数组不一样的,即使使用转换后的String.getBytes[]也是一样。

解决方案:

经过查询,系统api里并没有10进制转换成16进制的方法,因此这里自己写出转换的方法。

/**
     *  普通字符转换成16进制字符串
     * @param str
     * @return
     */
    public static String str2HexStr(String str)
    {
        byte[] bytes = str.getBytes();
        // 如果不是宽类型的可以用Integer
        BigInteger bigInteger = new BigInteger(1, bytes);  
        return bigInteger.toString(16);
    }

    /** 16进制的字符串转换成16进制字符串数组
     * @param src
     * @return
     */
    public static byte[] HexString2Bytes(String src) {
        int len = src.length() / 2;
        byte[] ret = new byte[len];
        byte[] tmp = src.getBytes();
        for (int i = 0; i < len; i++) {
            ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1]);
        }
        return ret;
    }

public static byte uniteBytes(byte src0, byte src1) {
    byte _b0 = Byte.decode("0x" + new String(new byte[]{src0})).byteValue();
    _b0 = (byte) (_b0 << 4);
    byte _b1 = Byte.decode("0x" + new String(new byte[]{src1})).byteValue();
    byte ret = (byte) (_b0 ^ _b1);
    return ret;
}

/*
* 字节数组转16进制字符串显示
*/
public String bytes2HexString(byte[] b,int length) {
    String r = "";

    for (int i = 0; i < length; i++) {
        String hex = Integer.toHexString(b[i] & 0xFF);
        if (hex.length() == 1) {
            hex = "0" + hex;
        }
        r += hex.toUpperCase();
    }

    return r;
}

使用方法:

1、如果原始是10进制的byte数组,则先调用byte2HexString()方法将其转换成16进制显示的String字符串,然后调用HexString2Bytes()方法得到16进制的byte数组。

2、如果原始是字符串,则调用str2HexStr()方法将其转换成16进制字符串,然后调用HexString2Byte()得到16进制byte数组。

最后,调用OutputStream对象的write()方法将数据输出。

在安卓系统中,串口通信通常通过使用USB串口适配器来实现。要控制串口发送和接收16进制数据,需要使用到安卓的USB API和相应的串口通信库。以下是实现该功能的一般步骤: 1. 权限申请:确保你的应用具有使用设备USB接口的权限,在`AndroidManifest.xml`中添加以下权限: ```xml <uses-feature android:name="android.hardware.usb.host" /> ``` 2. USB设备识别与连接:通过`UsbManager`类识别和连接USB设备。首先获取`UsbManager`实例,然后查询已连接的USB设备。找到目标设备后,请求获取设备的访问权限。 3. 打开串口并配置参数:一旦获得了设备的访问权限,就可以打开一个`UsbDeviceConnection`。然后,使用适当的串口通信库(如Android Serial Port API或使用`UsbDeviceConnection`自己实现串口协议)来打开串口并设置串口参数,如波特率、数据位、停止位等。 4. 发送16进制数据:将要发送的16进制数据换为字节数组,然后通过打开的串口连接发送出去。可以使用`UsbDeviceConnection.bulkTransfer()`方法进行数据发送。 5. 接收16进制数据:同样使用`UsbDeviceConnection.bulkTransfer()`方法,但是需要传入适当的缓冲区来接收数据。设置正确的超时时间以确保数据可以被及时接收。 6. 断开连接与资源释放:完成通信后,应断开串口连接,并释放所有占用的资源,包括USB设备连接和权限等。 请注意,实现上述功能需要有一定的安卓开发经验和对USB通信协议的理解。此外,安卓的USB通信需要在有用户交互的情况下进行,否则无法直接进行USB通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值