Arduino通过简单报文实现串口通信的尝试——及语音调节灯光亮度实验

本文介绍了一种使用Arduino通过简单报文实现串口通信的方法,用于语音控制灯光亮度实验。报文格式固定为3字节,功能码定义了灯光亮度调节。实验中,Arduino接收LU-ASR01的语音命令,根据功能码调节LED亮度,超过1分钟无亮度变化则自动关闭灯光。程序包含发送和接收报文的子程序,以及硬件连接和程序代码示例。
摘要由CSDN通过智能技术生成

    所谓串口通信,就是在一条数据线上,将数据依次分割为一个一个的二进制位(bit),然后进行传输。从电平角度来看,通常我们微控制器的串口通信都是采用TTL串行标准。这些其实都是硬件实现方面的范畴,我们从程序角度来看,就是一个字节一个字节的顺序收发数据,也就是说我们还是以字节(Byte)为单位来处理数据。那么从更高的角度来看,我们为了规范正确的收发数据,一般都是将数据按一定的要求组成一组数据(数据帧)进行收发,这一组数据,更规范的说法就是一帧数据,就是我们所说的报文。为保证不同厂家不同设备之间能够相互进行数据交换,于是就制定了一些报文格式的规范协议,目前在工业控制领域使用的最普遍的是Modbus协议,Modbus协议具有标准、开放,可以支持多种电气接口,数据帧格式简单紧凑,数据传输量大、实时性好等特点。不过正因为其的高通用性和可靠性,所以其格式比较繁复,从而造成程序的编写也比较繁复。当我们使用Arduino与其他设备进行一些简单的命令传输和通信数据交换实验,若是采用Modbus协议,则大大增加了程序编写的复杂度。本文正是从方便简洁地进行这类实验,同时又能满足一般的数据传输要求角度出发,尝试用一种简单的报文格式来满足Arduino与其他设备进行一些简单的命令传输和通信数据交换实验要求。

    根据上述的需求,我们首先确定报文的长度是固定的并具有一个简单的规范,本次实验采用的是3字节的报文长度,不带CRC等校验码,当然在可靠性方面就欠缺了些。报文格式如下:

        第1字节:功能码(建议取值范围为1—254)

        第2字节:数据字节1(取值范围为0—255)

        第3字节:数据字节2(取值范围为0—255)

    第1字节的功能码(或可称做命令编号),可以根据各自的要求自己定义,表示此报文代表某个指定功能,建议取值范围为1—254。第2、3字节为此功能所需的数据,若此功能不需要数据,第2、3字节数值可以不赋值,不过传输时仍然会将其发送出去,同样接收端也会接收到此第2、3字节。

    当某功能数据超过2个字节的情况,可以简单地用不同的功能码来表示更多的数据,例如某功能(这里假定功能码为48)的数据是一个长整数,我们可以用功能码48先发前2个字节,然后再用功能码49发后2个字节。

    本次实验仍然使用一块Arduino UNO和一块LU-ASR01进行(请原谅我,这是我手头唯一的两块带有TTL串口的板子)。实验通过LU-ASR01接收我们的语音命令:打开灯光、关闭灯光、调亮灯光、调暗灯光,然后发送相应的功能码给Arduino,Arduino接收到此功能码后,根据报文后面的数据来调节连接在Arduino上的LED亮度,可以重复命令调亮灯光、调暗灯光语音,每发出一次,调节全亮度的10%,直至全亮或全黑。此外,当LED在打开状态下(即非全黑状态)超过1分钟没有进行灯的亮度改变,则Arduino关闭LED,并发送报文给LU-ASR01,而LU-ASR01接收到此报文后,则播报“灯亮超过一分钟,阿杜已经关闭灯了”。

(注:关于LU-ASR01的双向串口通信采用软串口这点,可以参看本人之前写的

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值