該項目是AS結構,不用擔心jNI轉過來的配置問題了,文章結尾附測試的demo。
/**
* 發送命令包
*/
public void sendCommand(final String command) {
LogPlus.i("發送命令:" + command);
byte[] bytes = ByteUtil.hexStr2bytes(command);
rxSendData(bytes).subscribeOn(mSendScheduler).subscribe(new Observer<Object>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Object o) {
LogManager.instance().post(new SendMessage(command));
}
@Override
public void onError(Throwable e) {
LogPlus.e("發送失敗", e);
}
@Override
public void onComplete() {
}
});
}
/**
* (rx包裹)發送數據
*
* @param datas
* @return
*/
private Observable<Object> rxSendData(final byte[] datas) {
return Observable.create(new ObservableOnSubscribe<Object>() {
@Override
public void subscribe(ObservableEmitter<Object> emitter) throws Exception {
try {
sendData(datas);
emitter.onNext(new Object());
} catch (Exception e) {
LogPlus.e("發送:" + ByteUtil.bytes2HexStr(datas) + " 失敗", e);
if (!emitter.isDisposed()) {
emitter.onError(e);
return;
}
}
emitter.onComplete();
}
});
}
/**
* 打開串口
*
* @param devicePath
* @param baudrateString
* @return
*/
public SerialPort open(String devicePath, String baudrateString) {
if (mSerialPort != null) {
close();
}
try {
File device = new File(devicePath);
int baurate = Integer.parseInt(baudrateString);
mSerialPort = new SerialPort(device, baurate, 0);
mReadThread = new SerialReadThread(mSerialPort.getInputStream());
mReadThread.start();
mOutputStream = mSerialPort.getOutputStream();
mWriteThread = new HandlerThread("write-thread");
mWriteThread.start();
mSendScheduler = AndroidSchedulers.from(mWriteThread.getLooper());
return mSerialPort;
} catch (Throwable tr) {
LogPlus.e(TAG, "打開串口失敗", tr);
close();
return null;
}
}
點擊查看Demo