最近项目需要在安卓上通过串口通信方式,固定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);
}
});
}
};