前言
因项目需求,我们要从PC端去控制一些外部设备,比如激光器、光放大器等,这些设备一般使用到的都是低速的串口通信,所以我们需要设计一个上下位机串口通信系统来控制这些设备。这篇文章先讲如何使用Arduino Mega2560开发板来作为下位机控制各个外部设备。
上下位机工作原理
- 通常来说,上位机指的是PC端的控制软件,比如可以设置读取参数的界面软件,下位机则是指单片机或者带微处理器的系统,这里我们使用Mega2560来作为下位机控制板。下位机可以把一些模拟信号经过AD采集后转换为数字信号,经过处理后通过串口发送给上位机;同理上位机也可以给下位机发送一些指令或者信息。
- 我们这里需要通过PC端的界面软件发送命令参数到外部设备上,然后再把外部设备的某些功能参数返回给界面软件。就以前一篇文章Arduino(4)为例说明,我们已经把外部设备光开关相关的功能操作写成了类库,mega2560作为下位机控制板直接去调用这个类库就可以了。
下位机软件执行流程
在编写下位机软件之前,我们可以先自定义一种串口通信的数据帧,来确保上下位机之间的通信不会出现差错。上下位机串口通信下行协议:PC -> Mega2560,共有8字节构成,采用异或校验。帧头可以自定义一字节的数据,例如0xfb;命令字表示自定义一些命令操作,例如我将设置光开关通道号的操作定义为0x10#define OPTICALSWITCH_CHANNEL_SET 0x10
;4个字节的数据值区域表示携带本次命令操作设置的参数值;帧尾自定义为数据帧的末尾,例如0xfe;校验码则是对整个数据帧进行左右异或后得到的一个字节的数据。
帧头 | 校验码 | 命令 | 数据值 | 数据值 | 帧尾 |
---|---|---|---|---|---|
1 byte | 1 byte | 1 byte | 2 byte | 2byte | 1 byte |
接下来就是在Arduino IDE编写数据帧的处理流程,代码如下所示:
#include <OpticalSwitch.h>
#define FRAME 8 // frame length for host command
/*********** Module Command Keyword *************/
#define OPTICALSWITCH_CHANNEL_SET 0x10
#define OPTICALSWITCH_CHANNEL_READ 0x11
/*********** Module Name Code *********************/
#define OpticalSwitch 0x03
// global varibles for com
const int baud1 = 9600; // inital baud rate for com with host
byte rxData[FRAME]; // bytes for received frames
int comError = 0; // error count for communications
bool newCMD = false; // flag for incoming new command
bool response = false; // flag for outgoing data
int inbyte; // use it to clear other data in serial buffer
void setup()
{
// put your setup code here, to run once:
Serial.begin(baud1); //connect with host software
delay(10);
modComSetup(); // setup and check communications to modules sequent