cordova-plugin-usbserialport
此插件是基于cordovarduino基础上,升级了usb-serial-for-android库后增加了相应的方法,目前可以很好的适用于常见的一些USB/Type-C转串口的串口硬件。使用此插件,可以在android手机上直接使用USB或Type-C接口的USB转458/232等串口。
此插件仅适用于Android
简介
此 Cordova/Phonegap 插件允许使用 USB On-The-Go (OTG) 从您的 Android 设备到您的串口板或其他USB供电的串行IO设备进行双向串行通信。
这意味着您可以使用 cordova-plugin-usbserialport 插件开发关于串口收发数据的Android应用
安装
cordova项目运行:
cordova plugin add cordova-plugin-usbserialport
# 或
cordova plugin add https://github.com/king2088/cordova-plugin-usbserialport.git
使用方法
您首先需要了解如何创建和上传一个简单的 Cordova 项目。 这里有一些关于 如何开始 在 Android 上使用 Cordova 的信息,这里是一个 简单的 Cordova plugin 可以用来熟悉插件系统。
使用方法:
android权限的原因,需要首先请求USB权限,使用以下代码请求权限:
usbSerialPort.requestPermission(function success(), function error());
获取设备信息(可选):
usbSerialPort.getDevice(function success(), function error());
获取串口打开状态(可选):
usbSerialPort.isOpen(function success(), function error());
其次,打开串口:
usbSerialPort.open(opts, function success(), function error());
opts
是JSON对象,包含如下属性:
- baudRate: 波特率,默认9600
- dataBits: 数据位,默认8
- stopBits: 停止位,默认1
- parity: 奇偶检验,默认0
- dtr: 默认false (对于部分串口需要为true)
- rts: 默认false (部分模块需要为true, 包括monkeyboard dab 模块)
- sleepOnPause: 默认true. 如果为 false,则当应用程序进入后台(或屏幕关闭)时,OTG 端口将保持打开状态。 否则,端口会自动关闭,并在应用程序返回前台后恢复。
再次,写入和读取串口数据:
usbSerialPort.write(data, function success(), function error());
usbSerialPort.read(function success(buffer), function error());
data
是要写入串行端口的字符串表示形式。
buffer
读取的数据为 JavaScript ArrayBuffer。
除了使用usbSerialPort.write
,您还可以使用usbSerialPort.writeHex
来发送hex-strings 并使用RS232 协议 驱动的硬件。
简而言之,usbSerialPort.writeHex('ff')
只会写入一个字节,而 usbSerialPort.write('ff')
会写入2个到串行端口。
除此之外,usbSerialPort.writeHex
的工作方式与 usbSerialPort.write
的工作方式相同。
然后,需要使用 usbSerialPort.readListener
监听串口数据返回。返回的数据为ArrayBuffer,可参考如下代码:
usbSerialPort.readListener(
function success(data){
var view = new Uint8Array(data);
console.log(view);
},
function error(){
new Error("Failed to register read callback");
});
最后,关闭串口:
usbSerialPort.close(function success(), function error())
简单的代码示例
var errorCallback = function(message) {
alert('Error: ' + message);
};
usbSerialPort.requestPermission(
function(successMessage) {
usbSerialPort.open(
{baudRate: 9600},
function(successMessage) {
usbSerialPort.write(
'1',
function(successMessage) {
alert(successMessage);
},
errorCallback
);
},
errorCallback
);
},
errorCallback
);
完整的示例
创建 index.html
:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *">
<meta name="format-detection" content="telephone=no">
<meta name="msapplication-tap-highlight" content="no">
<meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width">
<link rel="stylesheet" type="text/css" href="css/index.css">
<title>串口操作</title>
</head>
<body>
<div class="app">
<h1>串口操作</h1>
<p>值 <span id="pot">...</span></p>
<p id="delta">...</p>
<button id="on">写入1</button>
<button id="off">写入0</button>
</div>
<script type="text/javascript" src="cordova.js"></script>
<script type="text/javascript" src="js/index.js"></script>
</body>
</html>
创建 index.js
:
var app = {
initialize: function() {
document.addEventListener('deviceready', this.onDeviceReady, false);
},
onDeviceReady: function() {
var potText = document.getElementById('pot');
var delta = document.getElementById('delta');
var on = document.getElementById('on');
var off = document.getElementById('off');
var str = '';
var lastRead = new Date();
var errorCallback = function(message) {
alert('Error: ' + message);
};
// 首先请求USB权限
usbSerialPort.requestPermission(
// 如果用户授权
function(successMessage) {
// 打开串口
usbSerialPort.open(
{baudRate: 9600},
// 如果串口成功打开
function(successMessage) {
// 监听串口
usbSerialPort.readListener(
function success(data){
// 解码返回的数据
var view = new Uint8Array(data);
if(view.length >= 1) {
for(var i=0; i < view.length; i++) {
// 如果我们收到一个\n,则消息完成,显示它
if(view[i] == 13) {
// 检查读取速率是否对应于串行打印速率
var now = new Date();
delta.innerText = now - lastRead;
lastRead = now;
// 显示消息
var value = parseInt(str);
pot.innerText = value;
str = '';
}
// 如果不是\n,则将所有消息累加
else {
var temp_str = String.fromCharCode(view[i]);
var str_esc = escape(temp_str);
str += unescape(str_esc);
}
}
}
},
// 监听错误信息
errorCallback
);
},
// 打开串口错误信息
errorCallback
);
},
// 未授权错误
errorCallback
);
on.onclick = function() {
usbSerialPort.isOpen(opened => {
if(opened) {
usbSerialPort.write('1');
}
}, err => {
console.log(`发生错误:${err}`)
})
};
off.onclick = function() {
usbSerialPort.isOpen(opened => {
if(opened) {
usbSerialPort.write('0');
}
}, err => {
console.log(`发生错误:${err}`)
})
}
}
};
app.initialize();
您的设备为未知设备?
感谢 usb-serial-for-android 库,您可以与 CDC、FTDI、Serial 等设备进行通信。
您的设备可能未在 https://github.com/mik3y/usb-serial-for-android 中列出。
如果您知道您的设备 VID(供应商 ID)和 PID(产品 ID),您可以尝试
usbSerialPort.requestPermission({vid: '1d50', pid: '607d'}, function success(), function error()); // 16进制
or
usbSerialPort.requestPermission({vid: 7504, pid: 24701}, function success(), function error()); // 整数
您还可以选择要使用的驱动程序。 选项是:
CdcAcmSerialDriver
Ch34xSerialDriver
Cp21xxSerialDriver
FtdiSerialDriver
ProlificSerialDriver
如果为空或不是其中之一,则默认为“CdcAcmSerialDriver”。
usbSerialPort.requestPermission({
vid: '1d50',
pid: '607d',
driver: 'FtdiSerialDriver' // or any other
},
function success(),
function error()
);
您可以使用“lsusb”(以十六进制返回 VID:PID)或查看您的 dmesg 日志在android上找到您的设备 VID 和 PID。