0
点赞
收藏
分享

微信扫一扫

打开单片机世界的大门——上位机控制下位机实例详解


上位机控制下位机实例详解

  • ​​一、基本概念​​
  • ​​上位机与下位机​​
  • ​​串口​​
  • ​​数据表达​​
  • ​​二、下位机程序​​
  • ​​三、上位机程序​​
  • ​​四、总结​​

一、基本概念

在开始讲解前,先来看几个基本概念,如果是有基础的大佬,请直接跳到下一节。

上位机与下位机

上位机是指可以直接发出操控命令的计算机,而下位机是直接控制设备获取设备状况的计算机。

上位机发出的命令首先给下位机,下位机再根据此命令解释成相应时序信号直接控制相应设备。下位机不时读取设备状态数据(一般模拟量),转化成数字信号反馈给上位机。

简言之如此,真实情况千差万别,但万变不离其宗。上下位机都需要编程,都有专门的开发系统。

换个角度,两个Arduino开发板,用其中一个控制另一个,发送指令的控制方就是上位机,被控制的就是下位机。

我个人用的比较多的是用Jetson Nano或树莓派做上位机控制下位机Arduino。

串口

既然要控制,就要有数据传输,也就要有“高速公路”,专业名称叫串行通信接口或串行通讯接口(通常指COM接口

在使用Arduino前,需要安装驱动,这个驱动一般是CH340,驱动装好后,我们就可以在电脑上查看其对应的串口了:

打开单片机世界的大门——上位机控制下位机实例详解_arduino

数据表达

我们人与人交流需要语言,比如,中国人用汉语,聋哑人用手语等

机器之前的交流也需要语言,在经典计算机中,通过二进制0与1表示数据,这其中又有许多的表示数据的方法,如ASCLL码、BCD码等等

在下位机Arduino中,可以通过Serial.read()从串口的缓冲区取出并读取一个Byte的数据,比如有设备通过串口向Arduino发送数据了,我们就可以用Serial.read()来读取发送的数据。

在上位机中,可以通过Python库pyserial的write()方法来实现向串口发送数据,注意,发送的数据需要是Byte

二、下位机程序

以垃圾分类为例,假设使用Arduino制作的机械臂投放垃圾。我们可以做4种处理,以此将垃圾投放到4种垃圾箱中。

void setup(){
Serial.begin(9600);
pinMode(13, OUTPUT);
}

char contral;
void loop(){
if(Serial.available()>0){
contral = Serial.read();
Serial.println(contral);
if(contral==48){
Serial.println("Harmful");
digitalWrite(13, HIGH); // 点亮LED
delay(2000); // 等待2秒钟
digitalWrite(13, LOW); // 通过将引脚电平拉低,关闭LED
}
else if(contral==49){
Serial.println("Kitchen");
}
else if(contral==50){
Serial.println("Other");
}
else if(contral==51){
Serial.println("Recyclable");
}
}
}

字符“0”的ASCLL码是48,以此类推,用0~3分别表示有害垃圾、厨余垃圾、其他垃圾以及可回收垃圾

为了测试时的效果更明显一些,这里我们设置当下位机接收到处理有害垃圾的信号时,让13号引脚的灯亮2秒,与此同时向串口输入“Harmful”:

打开单片机世界的大门——上位机控制下位机实例详解_arduino_02


到目前为止,Arduino已经可以接收串口的数据并进行处理了,但是串口里的数据是我们从键盘手动发送的,我们需要用上位机给他发送数据。

三、上位机程序

这里我们用个人PC端做测试。

import serial

Arduino = serial.Serial('COM3', 9600, timeout=0.2)
send_data = b'0'

while True:
Arduino.write(send_data)

代码不多,也很简单,需要注意的是要在数据前加一个小写字母b,表示bytes字符串:

打开单片机世界的大门——上位机控制下位机实例详解_Python_03

四、总结

其实实现的思路和过程不是很难,但是需要注意一些细节,比如下位机Arduino接收数据的编码方式,还有上位机发送数据的编码方式。

基于此,你就可以开发多个单片机联动的项目啦~


举报

相关推荐

0 条评论