因为最近应产品经理的需要,须要做一个Android版的上位机APP,为此专门到某宝上购买了一个Type-C转串口的小设施,而后就开始折腾了。花了几天的工夫就把上位机APP做进去了,起初在闲暇工夫又做了一个串口调试的小工具,成果如下图
创立我的项目ionic start blank创立一个空白我的项目
装置串口插件要做一个串口通信的工具,那就得和硬件打交道,正好依据ionic官网文档,我找到了一个串口通信的插件,名为cordovarduino,通过尝试之后,发现此插件因为久年失修,尽管能够应用,然而在收发数据的时候总是无奈残缺接管到数据。依据对其代码查看,发现其中lib目录下有一个usbseriallibrary.jar文件,这个应该就是USB串口的驱动文件了吧。
久年失修的插件,预计就是这个jar包有问题,应该更新一下这个jar包就能够了,因而,通过usb-serial-for-android这个我的项目的介绍我从新打包了一个jar包,实现后尝试了一下,的确很完满,并且收发数据也没有任何问题了。因而,本人依据cordovarduino我的项目从新copy了一个我的项目cordova-plugin-usbserialport,因而你只须要装置我提供的插件即可
装置串口插件ionic cordova plugin add cordova-plugin-usbserialport装置本地数据存储插件ionic cordova plugin add cordova-plugin-nativestoragenpm install @ionic-native/native-storage装置状态栏插件ionic cordova plugin add cordova-plugin-statusbarnpm install @ionic-native/status-bar装置设施信息插件ionic cordova plugin add cordova-plugin-devicenpm install @ionic-native/device装置获取版本号插件ionic cordova plugin add cordova-plugin-app-versionnpm install @ionic-native/app-version装置APP最小化插件ionic cordova plugin add cordova-plugin-appminimizenpm install @ionic-native/app-minimize装置后盾运行插件ionic cordova plugin add cordova-plugin-background-modenpm install @ionic-native/background-mode串口操作次要代码declare let usbSerialPort: any; // 引入串口插件// 关上串口async openSerialPort() { const config = await this.nativeStorage.getItem('config'); // First request permission usbSerialPort.requestPermission(() => { console.log('get permission success.'); usbSerialPort.getDevice(data => { this.title = data.name; }); // open serial usbSerialPort.open(config, () => { console.log('Serial connection opened'); // get open status this.isOpen(); // read listener usbSerialPort.readListener(data => { clearTimeout(this.timer); const view = new Uint8Array(data); console.log(this.utils.bytes2HexString(view)); this.receiveDataArray.push(view); this.timer = setTimeout(() => { const now = new Date(); const dateMs = now.getMilliseconds(); this.zone.run(() => { const date = `<span style="color: #2fdf75">${this.utils.formatDate(now, 'hh:mm:ss')}.${dateMs} > </span>`; const resultUint8Array = this.utils.concatUint(Uint8Array, ...this.receiveDataArray); if (!this.utils.bytes2HexString(resultUint8Array)) { return; } this.receiveData += `<div style="-webkit-user-select: auto;-moz-user-select: auto;-ms-user-select: auto;user-select: auto;">${date}${this.utils.strDivision(this.utils.bytes2HexString(resultUint8Array), 2)}</div>`; this.receiveData += `<div style="margin-top:8px"></div>`; this.receiveLength = this.utils.bytes2HexString(resultUint8Array).length / 2; this.scrollToBottom(); }); }, 500); }, err => { console.log(`Read listener error: ${err}`); }); }); }, err => { console.log(`Get permission error: ${err}`); if (this.openStatus) { this.zone.run(() => { this.openStatus = false; this.title = this.translate.instant('SERIAL_DEVICE_TITLE'); }); } this.presentToast(this.translate.instant('NO_DEVICE_CONNECTED')); });}// 串口写入writerSerial() { if (!this.openStatus) { if (this.pack) { this.presentAlert(); } return; } this.receiveDataArray = []; const now = new Date(); const dateMs = now.getMilliseconds(); if (this.isWriterHex) { usbSerialPort.writeHex(this.pack, (res: any) => { console.log('writer res: ', res); const date = `<span style="color:#3880ff">${this.utils.formatDate(now, 'hh:mm:ss')}.${dateMs} < </span>`; this.receiveData += `<div>${date}${this.utils.strDivision(this.pack, 2)}</div>`; this.sendLength = this.pack.length / 2; }, err => { console.log('writer hex err: ', err); this.presentToast(); this.closeSerial(); }); } else { usbSerialPort.write(this.pack, (res: any) => { console.log('writer res: ', res); const date = `<span style="color:#3880ff">${this.utils.formatDate(now, 'hh:mm:ss')}.${dateMs} < </span>`; this.receiveData += `<div>${date}${this.utils.strDivision(this.utils.bufToHex(this.utils.stringToBytes(this.pack)), 2)}</div>`; this.sendLength = this.utils.getStringByteLength(this.pack); }, err => { console.log('writer string err: ', err); this.presentToast(); this.closeSerial(); }); }}// 串口开启状态isOpen() { usbSerialPort.isOpen(status => { console.log(`Serial open status: ${status}`); this.zone.run(() => { this.openStatus = status; }); });}// 敞开串口closeSerial(isOpenSerial?: boolean) { usbSerialPort.close(() => { this.isOpen(); this.receiveDataArray = []; if (isOpenSerial) { this.openSerialPort(); } });}其余为了可能对串口波特率进行设置,我还做了一个设置页面,次要用于设置波特率、数据位、进行位、以及收发数据记录的背景色彩切换、语言切换等性能。
...