摘要:开发物联网设备时,常用MCU+物联网模块的硬件结构,HaaS510就是一款非常好的物联网模块。本文与大家分享HaaS510在成功上云基础上,如何响应UART串口指令。
实验目的:通过haas510接收上位机发来的串口指令,通过DEBUG串口显示出来。
硬件:haas510 (2.0版本),USB串口
软件:win7 x64,vscode
目录
1.HaaS510板子上的串口有几个?
2.接收串口指令并发送出去的原理
3.amp轻应用关于串口的使用方法
4.编写串口响应代码
5.观察运行效果
1.HaaS510板子上的串口有几个?
开发板上的串口有2个,分别是用户串口MAIN UART和调试串口DEBUG UART。
HaaS510是基于EC600S开发的,它对外引出的串口就是EC600S的串口。EC600S模块对外引出的是邮票孔,此外还有底部的焊盘。如下图红框所示,EC600S模块的引脚中,向外提供了2个串口,其中一个是调试,另一个是用户使用。
由于EC600S已经将必要的电路都封装到了兼顾的金属壳内,因此使用这两个串口的话,仅仅需要将线引到相应的接线端子上。阿里云开发板采用的接线端子是XH2.54。
2.接收串口指令并发送出去的原理
作者绘制了一个简图,用来说明串行通信的基本过程。在不同的MCU编程时,代码不尽相同,但是核心的内容都是一样的,就是依次接收,接收的时候有缓冲区,缓冲区满了会有中断,中断之后就要响应,可能还会有数据校验等内容。往往一串字符串的接收和处理就需要几十行的代码来完成。
本实验的目的是为了实现HaaS510接收上位机发来的指令,接收到指令之后,我们就可以对这些指令进行解析,或者作为数据上传到物联网平台。为了观察到数据是否接收正确,我们采取的方式是接收之后再通过串口发送出来。假如发来的收到的相同,那么就证明实验成功。
3.amp轻应用关于串口的使用方法
使用“低代码”开发的我们当然不愿意用过多的语句来搞定一个古老的串口。
HaaS团队已经帮我们做好了。
就用JavaScript。
官方API帮助文档连接是
uart - 串口https://help.aliyun.com/document_detail/268752.html
由于JavaScript语言是采用事件驱动的机制来响应用户操作的,阿里云已经帮我们将UART时间与底层驱动调试好了。
所以,我们就可以通过非常简单的JavaScript语句,响应上位机或者其他MCU发来的串口指令事件,就可以实现复杂的串行通信过程。
在HaaS中,这个事件的名字是“data”。名如其事,串口上传递的的确是“data”。
对该事件进行编程的参考操作是:
4.编写串口响应代码
本实验的目的是通过haas510接收上位机发来的串口指令,通过DEBUG串口显示出来。
我们在一个HaaS510成功上云并且上报属性的例程基础上进行调试。这样便于下一步将串口接收的数据上云。
代码如下:
var iot = require('iot');
var network = require('network');
var uart = require('uart');
var net = network.openNetWorkClient();
/* 设备三元组信息获取请参考common目录下的iot组件说明 */
var productKey = 'gcXXXXXvu2';
var deviceName = 'cewSSSSS001';
var deviceSecret = 'ee213aSSSSSSSSSadcdedb3a9';
// 构建物联网连接实例
var device;
var lightSwitch = 0;
// 打开用户串口,在HaaS中,用户串口号是UART2
var serial = uart.open({
id: 'UART2'
});
var msgbuf = [97, 98, 99, 100];
function ArrayToString(fileData) {
var dataString = "";
for (var i = 0; i < fileData.length; i++) {
dataString += String.fromCharCode(fileData[i]);
}
return dataString;
}
//net.on用来使用三元组数据连接物联网平台,核心是实现了一个MQTT客户端
net.on('connect', function () {
device = iot.device({
productKey: productKey,
deviceName: deviceName,
deviceSecret: deviceSecret,
region: 'cn-shanghai',
success: function () {
console.log('iot: [success] connect');
},
fail: function () {
console.log('iot: [failed] connect');
}
});
})
//定时程序,这个程序实现的是5秒钟定时,每次都翻转主灯开关的状态,向用户串口发送一个数组数据
//再将主灯开关状态发送到物联网平台
setInterval(function () {
lightSwitch = 1 - lightSwitch;
// user uart send data
serial.write(msgbuf);
/* 错误示范 iot.postProps({
payload: {LightSwitch:'0'}
})*/
/*正确示范,要想发送属性,就得使用stringify才行*/
device.postProps(
JSON.stringify({
LightSwitch: lightSwitch
})
);
}, 5000);
// serial.on用于响应串口数据接收事件,用户串口接收啥,就通过调试串口发送啥。
//注意,两个串口不是同一个。
serial.on('data', function(data) {
console.log('uart receive data is ' + ArrayToString(data));
});
5.观察运行效果
我们想实现的效果是在设备上云在线基础上,接收上位机或者MCU发来的串口指令。
首先将硬件与电脑连接,在此我们使用2个串口。
然后烧录程序,烧录的方法请参考文章
阿里云开发板vscode开发环境搭建https://blog.csdn.net/youngwah292/article/details/120356887?spm=1001.2014.3001.5501
打开物联网平台,查看设备是否在线
再观察是否间隔5秒钟上报属性,发现是可以正常上报属性的。
接下来打开2个串口助理,分别对应用户串口和调试串口。经过实验发现,达到了想要的效果。接收的信息完整、准确。
核心的代码其实只有一句话,就这样一句话,就能够实现HaaS510时刻盯着用户串口上的数据,一旦有数据,就发送出来。
serial.on('data', function(data) {
console.log('uart receive data is ' + ArrayToString(data));
});
在工程应用中,使用串口外接物联网模块的结构非常常见。公司原有的硬件工程师可以专注于硬件功能的研发,设备上云的时候,只需要外接一块物联网模块就行了,需要在云上发送什么数据,直接通过串口将指令发送出去。
这种结构的物联网设备有一个缺点,就是结构松散,可靠性不是特别高。例如用AT指令形式的物联网模块,操作起来需要多个步骤才能上云,如果要上报属性,需要经过复杂的字符串运算才能获得云端设置所需的效果。
而是用HaaS510就可以弥补这个缺点。HaaS510只需几个语句就能实现设备上云。
今天我们又学到了使用1个语句就能实现串口指令的接收,HaaS的简便性体现的更加明显。
下一步,我们将实现串口获取的数据直接报送到云平台。