目录
任务目标
以现有开发板,模拟温室大棚控制系统,详细需求如下
1.通过串口和上位机进行数据通信
2.读取环境温度数据
3.使用LED 灯模拟温室采光
4.使用两个风扇模拟喷灌、通风功能
接上回,我们根据项目目标的需求制作了对应的解决方案,所以我们要逐步通过代码来完成我们的项目功能的实现。所以,本文章来讲讲在实现任务目标的串口通信部分。
此为设计方案链接接:上位机开发----温室监控系统的方案设计_l2903865901的博客-CSDN博客
一、什么是串口通信协议?
1.通信协议是网络通信的基础,它要求发送方和接收方都遵守同样的规则,通过预定义的数据格式进行数据传输。这些规则包括物理连接方式、数据传输速率、数据帧结构、差错控制和流量控制等,以确保通信各环节的正常运作。
2.通信协议采用分层的结构,各层协议之间既相互独立又相互高效的协调工作。所有了解网络的同学都知道的的就是OSI七层模型和TCP/IP四层模型。OSI七层是理论模型,实际使用的是TCP/IP四层模型。
二、通信协议三要素
1.语义,语义是解释控制信息每个部分的意义。它规定了需要发出何种控制信息,以及完成的动作与做出什么样的响应。
2. 语法,语法是用户数据与控制信息的结构与格式,以及数据出现的顺序。
3. 时序,时序是对事件发生顺序的详细说明。(也可称为“同步”)。
三、串口通信协议
基于串口的通信协议通常不能太复杂,因为串口通信速率、抗干扰能力以及其他各方面原因,相对于TCP/IP这两种通信协议,是一种较为低级的通信协议。在本次模拟温室监控系统设置中,我们上位机和下位机使用串口通讯,而基于串口的通信,除了一些通用的通信协议之外,很多时候,我们都要根据自己项目所需要的情况,自定义通信协议。
所以,我们在上位机创建了一个类,类中定义了我们上位机的通信协议:
const byte FRAME_HEAD1 = 0xAA; //帧头1
const byte FRAME_HEAD2 = 0x55; //帧头2
const byte FRAME_END = 0x0D; //帧尾
const byte FRAME_DIR_CMD = 0x01; //下发
const byte FRAME_DIR_REC = 0x81; //上发
const byte FRAME_DATA_NUM = 3; //数据长度
const byte FRAME_LED = 0x01; //LED灯
const byte FRAME_FAN = 0x02; //风扇
const byte FRAME_SPRINK = 0x03; //喷灌
const byte FRAME_TEMP = 0x04; //湿度
const byte FRAME_HUMI = 0x05; //温度
const byte FRAME_TEMPBound = 0x06; //温度上下限
const byte FRAME_HUMIBound = 0x07; //湿度上下限
在本通信协议中,我们设置了帧头帧尾、收发数据指令、设备类型以及有效数据长度。
随后,我们还需要在上位机进行串口收发数据的解析,通过使用状态机来判断我们接收的数据是否有效,随后将解析后的有效数据传入到我们下一个方法之中进行下一步操作。
上位机解析数据代码如下:
//接收串口发送过来得原始数据并进行数据解析
public void ReceivedRawData(byte[] data)
{
//遍历数组中的每一个元素
foreach (byte b1 in data)
{
switch (pharse_state)
{
case 0:
if (b1 == FRAME_HEAD1)
pharse_state = 1;
break;
case 1:
if (b1 == FRAME_HEAD2)
pharse_state = 2;
else
pharse_state = 0;
break;
case 2:
if (b1 == FRAME_DIR_REC)
{
data_object.Clear();
pharse_state = 3;
}
else
pharse_state = 0;
break;
case 3:
data_object.Add(b1);
if (data_object.Count >= FRAME_DATA_NUM)
pharse_state = 4;
break;
case 4:
if (b1 == FRAME_GND)
PhraseValidData(data_object);
pharse_state = 0;
break;
}
}
}
举一反三,下位机代码也与上位机代码极其相似,以下为下位机数据解析:
数据解析以状态机判断逻辑为:收到上位机/下位机通过串口发送的数据(数据以数组形式存储)→判断数组第一位是否为帧头1,若是,则进行下一位判断,若不是,则直接返回。→判断第二位是否为帧头2,若是,则进行下一位判断,若不是,则直接返回。→判断第三位为上发还是下发,若对应则继续,并将所定义的用来存储3位有效数据的变量赋初值为0,否则返回。→接收有效数据,接收完毕后进入下一个状态→判断数组最后一位数是否为帧尾,是则将收到的有效数据传出去,否则返回。
总结
本次项目对我们理解上位机与下位机进行的串口通信操作过程有了详细的认识,巩固了项目目标使用到的自定义串口通信协议、状态机判断、C#代码编程以及下位机编程使用到的知识。