node-red教程6 串口控件的使用

6.1 串口控件安装与介绍

  串口控件是一个很有用的控件,它可以通过电脑或树莓派的串口收发数据。由于我们要做一个基于node-red的应用,并不是做一个只运行与电脑的纯软件,所以必然要与一定的硬件产生关联。这些硬件往往可以支持串口,所以,通过串口控件,可以把node-red程序控制的对象从电脑扩展到实际的硬件中,极大提升了node-red的实用性。
  如果有嵌入式的开发经验,那么对于“上位机”这个名词一定不会陌生。把“下位机”采集到的数据通过串口发送给电脑或树莓派,然后用node-red搭建一个上位机真的是很简单的事情。如果没有听说过上位机,也没有关系。假设有这么一个设备,可以定时采集到一些传感器的数据,比如室内的温度,这些数据总得汇报给另外一个设备,以便进行显示和分析。负责显示和分析的设备,就可以是上位机。

6.1.1 串口控件安装

  默认情况下,node-red并不会带有串口控件。我们可以进行手动安装。顺带提一下,node-red共有1000多种各式各样的控件,默认情况只会安装最常用的几十种。所有控件的安装过程都类似。
  点击选项按钮,找到节点管理
这里写图片描述
  切换到“安装”标签内,在输入框内输入serialport,找到node-red-node-serialport,点击安装。
这里写图片描述
这里写图片描述
  安装完成以后,输入控件与输出控件区都会增加一个名为“serial”的控件
这里写图片描述
这里写图片描述

6.1.2 串口控件简介

  串口输入控件说明
    从本地串行端口读取数据
    它可以用以下方式分割字符
    等待“分割”字符(默认\n)。也接受hex表示法(0x0d)。
    等待从第一个字符接收到的毫秒数
    等待填充一个固定大小的缓冲区
    然后输出msg.payload作为UTF8 ascii字符串或二进制Buffer对象。
    Msg.port设置为被选择端口的名字。
    如果没有指定分割字符,或者超时或缓冲区大小为0,那么就会发送单个字符的流——要么作为ascii字符,要么是1位二进制缓冲区。
  串口输出控件说明
    提供到输出串口的连接。
    只发送msg.payload
    可以选择吧用于分割输入的新行字符追加到发送到串口的每条消息。
    二进制的载荷可以使用Buffer对象发送

6.2 使用串口助手与虚拟串口工具

  串口助手软件有很多,推荐使用SSCOM,串口/网络数据调试器,下载地址是
http://www.daxia.com/sscom/sscom5.13.1.rar
  虚拟串口工具可以使用VSPD。由于版权问题,请自行搜索下载地址。该软件可能需要破解,请尽可能支持正版。
串口/网络数据调试器可以把串口收到的数据显示出来,也可以通过串口发送数据,十分直观,可以用与显示串口控件的数据,和给串口控件发送数据。但是,一般来说,同一个串口只允许一个软件占用。例如串口控件占用了COM10(串口2),那么串口/网络数据调试器就不能使用COM10了。如果COM10可以与COM11进行通信,而串口/网络数据调试器使用COM11,那么串口/网络数据调试器就可以与串口控件通信。虚拟串口工具可以把COM10与COM11连接起来,也就是借助虚拟串口工具,可以在不需要任何硬件的情况下,可以用串口/网络数据调试器模拟真实的串口,与串口控件通信。连接情况可以下图说明
这里写图片描述

6.2.1 虚拟串口工具设置

  打开虚拟串口工具,文件名可能是Configure Virtual Serial Port Driver
这里写图片描述
  在Manage ports下,添加端口的地方改为COM10与COM11连接。也可任意填写其它串口号。
这里写图片描述
  完成添加以后左侧的virtual ports显示新添加的串口。注意,两个串口设置为连接以后,即便关闭程序,串口的连接仍然保持,所以建议使用比较大的串口号,其它设备用不到的。如果需要解除连接,可以点击删除端口或是重置端口。
这里写图片描述

6.2.2 串口/网络数据调试器的介绍

  串口/网络数据调试器功能强大,使用方便,基本可以通过自己的摸索学会使用。为了照顾无基础的读者,我这里还是把常用的功能罗列一下,有基础的可以跳过这一小节。
1选择端口号
  可以看到端口号下边已经有了通过虚拟串口工具仿真出来的串口。除了串口以外,还有TCP和UDP的功能。
这里写图片描述
2 波特率与更多串口设置
  波特率代表数据发送的速率(每秒发送多少位数据),发送方与接收方必须保持一致。
这里写图片描述
  有时串口通信还需要配置一些其它参数,如数据位,校验位,控制位等,默认是8个数据位,没有校验位,1个停止位。这种设置简称为8N1。
这里写图片描述
3扩展工具
  SSCOM由于拥有扩展工具,所以十分方便,简直可以作为一个简单的上位机来用。
这里写图片描述
  点击扩展工具以后可以看到一个新的工具栏。可在输入框输入需要发送的信息,双击输入框可以修改注释。可以勾选是否使用hex发送,以及按顺序定时发送。
  此处有作者打的一个广告,如果方便请给作者一点支持。
这里写图片描述
  我们可以根据通信协议来编辑一下扩展按钮。这是我用的情况。
  另外,可能是软件的BUG,修改过配置的软件在另一台电脑上可能打不开。
这里写图片描述

6.3串口控件详细介绍

6.3.1 hello serial

  跟“hello world”类似,,虚拟串口工具与串口助手都设置完毕以后,我们先用一个最简单的程序检验下环境搭建情况如何。首先使用串口助手打开COM11,并设置为“非HEX显示”, “非HEX发送”。
这里写图片描述
  然后在node-red工作区里添加以下几个控件:
这里写图片描述
  设置inject输出文字“hello serial”;
  两个串口控件都设置如下:
这里写图片描述
这里写图片描述
然后连线并部署。
这里写图片描述
  点击inject的输入按钮,可以在串口工具看到“hello serial”。
  在串口工具的输入栏输入“hello node-red”,也可以在node-red的调试窗口看到此信息。
这里写图片描述
  程序如下

[{"id":"cb562972.5a2c68","type":"inject","z":"7903386e.1145c8","name":"","topic":"","payload":"hello serial","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":190,"y":220,"wires":[["2200b227.8ca95e"]]},{"id":"fcd04751.620598","type":"debug","z":"7903386e.1145c8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":390,"y":300,"wires":[]},{"id":"2200b227.8ca95e","type":"serial out","z":"7903386e.1145c8","name":"","serial":"c2dc38d4.dccf18","x":380,"y":220,"wires":[]},{"id":"f6ff26db.07b568","type":"serial in","z":"7903386e.1145c8","name":"","serial":"401ee499.6d790c","x":170,"y":300,"wires":[["fcd04751.620598"]]},{"id":"c2dc38d4.dccf18","type":"serial-port","z":"","serialport":"COM10","serialbaud":"9600","databits":"8","parity":"none","stopbits":"1","newline":"1","bin":"false","out":"time","addchar":true},{"id":"401ee499.6d790c","type":"serial-port","z":"","serialport":"COM10","serialbaud":"9600","databits":"8","parity":"none","stopbits":"1","newline":"1","bin":"false","out":"time","addchar":true}]

6.3.2 收发数组

  工作环境搭建好以后,我们根据《通信协议》来完成一个简单的任务:使用串口助手发送一个40度的温度数据,然后使用node-red回复一条使继电器1工作的数据。
  先在node-red里搭建接收串口数据的流程。我们仍使用“hello serial”里的程序。可以在串口助手中打开扩展,新建一条40度的数据,内容是AA 00 00 08 00 00 00 00 03 03 10 10 10 10 00 FF。
这里写图片描述
  点击发送,发现node-red收到的数据是乱码:
这里写图片描述
  这是因为,串口控件在发送字符时用ASCII码,而发送数字时要用二进制缓存。
这里写图片描述
  由于通信协议的数据都是以0xff结尾,可以把分开字符的方式也修改一下,就可以使用0xff来截断数据。但是这么做有一个弊端,就是正常的数据段中有0xff的话,也会被截断。
这里写图片描述
  然后重新部署并发送数据,就可以在调试窗口中看到正常的数据了。默认是十进制显示,也可以切换为十六进制。
这里写图片描述
  接下来修改node-red里的输入信息。
  可以直接把inject节点的输出改为数组,例如
这里写图片描述
  部署程序,点击发送按钮,并在串口数据里勾选hex显示,可以看到如下现象。
这里写图片描述
  当然,这种用法的缺点也很明显:在inject节点里没有办法输入十六进制的数字,只能把十六进制的数换算为十进制,再填写到inject的输入框。
  可以使用函数节点来新建一个数组,数组中填写十六进制的数。代码如下:

var temp= new Buffer([0xaa,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x13,0x06,0x01,0x00,0x00,0x00,0x00,0xff]);
msg.payload = temp;
return msg;

这里写图片描述

  程序保存如下:

[{"id":"cb562972.5a2c68","type":"inject","z":"7903386e.1145c8","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":180,"y":220,"wires":[["7393ad68.b80b24"]]},{"id":"fcd04751.620598","type":"debug","z":"7903386e.1145c8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":390,"y":300,"wires":[]},{"id":"2200b227.8ca95e","type":"serial out","z":"7903386e.1145c8","name":"","serial":"c2dc38d4.dccf18","x":380,"y":220,"wires":[]},{"id":"f6ff26db.07b568","type":"serial in","z":"7903386e.1145c8","name":"","serial":"401ee499.6d790c","x":170,"y":300,"wires":[["fcd04751.620598"]]},{"id":"7393ad68.b80b24","type":"function","z":"7903386e.1145c8","name":"新建数组","func":"var temp= new Buffer([0xaa,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x13,0x06,0x01,0x00,0x00,0x00,0x00,0xff]);\nmsg.payload = temp;\nreturn msg;","outputs":1,"noerr":0,"x":280,"y":140,"wires":[["2200b227.8ca95e"]]},{"id":"c2dc38d4.dccf18","type":"serial-port","z":"","serialport":"COM10","serialbaud":"9600","databits":"8","parity":"none","stopbits":"1","newline":"0xff","bin":"bin","out":"count","addchar":true},{"id":"401ee499.6d790c","type":"serial-port","z":"","serialport":"COM10","serialbaud":"9600","databits":"8","parity":"none","stopbits":"1","newline":"0xff","bin":"bin","out":"char","addchar":true}]
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值