安卓串口库usb-serial-for-android踩坑使用记录

最近项目需要在安卓上通过串口通信方式,固定n秒发送一次数据,使用github库usb-serial-for-android,对串口进行读写操作,代码中我固定n秒写一次数据,在写数据时,发现越往后,写入的串口收到的数据的时刻偏差越大,最后在stackoverflow.com中找到解决方案,链接如下:https://stackoverflow.com/questions/60680595/send-data-to-serial-android-application将数据发送到串行 android 应用程序

##使用matlab查看数据偏差:
###直接write数据,数据如图:
在这里插入图片描述
###使用写入+事件驱动,数据如图:
在这里插入图片描述
原文翻译与代码:
向串行发送请求

public void writeToDevice(){
        serialInputOutputManager = new SerialInputOutputManager(port, mListener);
        Executors.newSingleThreadExecutor().submit(serialInputOutputManager);
        String data = requestEdit.getText().toString();
        try{
            port.write(data.getBytes(), 5000);
        } catch(IOException ioe) {
            responseText.append("\n IO Exception at write");
        }
    }


要发送的数据 7E 00 2B 10 01 00 13 A2 00 41 A7 A7 ED FF FE 00 00 24 7C 53 56 7C 31 31 7C 31 30 38 7C 31 33 30 33 32 30 31 30 30 30 33 30 36 7C 33 39 7C 23 2E

我正在尝试通过串行将一串数据从 android 应用程序发送到 Zigbee。

该应用程序将类似于 Play 商店中的串行 USB 终端应用程序。此链接 https://play.google.com/store/apps/details?id=de.kai_morich.serial_usb_terminal&hl=en_IN

这是USB Serail应用程序与My Application的任务比较

USB串行应用程序

能够检测 USB 并连接
以十六进制形式发送由 XCTU 应用程序生成的数据
获取已发送数据的响应
我的申请

能够检测 USB 并连接
以十六进制形式发送由 XCTU 应用程序生成的数据
未收到任何回复
我无法发送十六进制数据,相同的代码是 获取 USB 设备并连接的代码

UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
List availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager);
if (availableDrivers.isEmpty()) {
responseText.setText(“No USB detected”);
return;
}

UsbSerialPort port = null;

responseText.append(“Device Count:”+availableDrivers.size());

// Open a connection to the first available driver.
UsbSerialDriver driver = availableDrivers.get(0);
UsbDeviceConnection connection = manager.openDevice(driver.getDevice());
if (connection == null) {
// add UsbManager.requestPermission(driver.getDevice(), …) handling here
return;
}

try {
port = driver.getPorts().get(0); // Most devices have just one port (port 0)
port.open(connection);
port.setParameters(9600, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);
} catch (IOException ioe){
showToast(“IO Exception at open”);
try{
port.close();
} catch (IOException ioe2){
showToast(“IO Exception at open disconnection”);
}
}
// if device connected and open show write and read feature
if(port != null){
responseText.append(“\n” + “Port”+port.toString());
showSerialConnected();
}
向串行发送请求

public void writeToDevice(){
serialInputOutputManager = new SerialInputOutputManager(port, mListener);
Executors.newSingleThreadExecutor().submit(serialInputOutputManager);
String data = requestEdit.getText().toString();
try{
port.write(data.getBytes(), 5000);
} catch(IOException ioe) {
responseText.append(“\n IO Exception at write”);
}
}
要发送的数据 7E 00 2B 10 01 00 13 A2 00 41 A7 A7 ED FF FE 00 00 24 7C 53 56 7C 31 31 7C 31 30 38 7C 31 33 30 33 32 30 31 30 30 30 33 30 36 7C 33 39 7C 23 2E

响应侦听器

ExecutorService mExecutor;
SerialInputOutputManager serialInputOutputManager;
SerialInputOutputManager.Listener mListener;

mExecutor = Executors.newSingleThreadExecutor();
        mListener = new SerialInputOutputManager.Listener() {
            @Override
            public void onRunError(Exception e) {
                Log.d(TAG, "Runner stopped.");
            }

            @Override
            public void onNewData(final byte[] data) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                         String message = " bytes: \n"+ HexDump.dumpHexString(data);
                         responseText.append(message);  
                    }
                });
            }
        };
  • 22
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值