单片机交流
直播中

姬盼希

7年用户 910经验值
擅长:控制/MCU
私信 关注
[问答]

什么是上位机控制下位机?

什么是上位机控制下位机?

回帖(1)

张颖

2021-10-9 11:46:08
一、基本概念

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

上位机是指可以直接发出操控命令的计算机,而下位机是直接控制设备获取设备状况的计算机。
上位机发出的命令首先给下位机,下位机再根据此命令解释成相应时序信号直接控制相应设备。下位机不时读取设备状态数据(一般模拟量),转化成数字信号反馈给上位机。
简言之如此,真实情况千差万别,但万变不离其宗。上下位机都需要编程,都有专门的开发系统。
换个角度,两个Arduino开发板,用其中一个控制另一个,发送指令的控制方就是上位机,被控制的就是下位机。
我个人用的比较多的是用Jetson Nano或树莓派做上位机控制下位机Arduino。
串口

既然要控制,就要有数据传输,也就要有“高速公路”,专业名称叫串行通信接口或串行通讯接口(通常指COM接口
在使用Arduino前,需要安装驱动,这个驱动一般是CH340,驱动装好后,我们就可以在电脑上查看其对应的串口了:





数据表达

我们人与人交流需要语言,比如,中国人用汉语,聋哑人用手语等
机器之前的交流也需要语言,在经典计算机中,通过二进制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已经可以接收串口的数据并进行处理了,但是串口里的数据是我们从键盘手动发送的,我们需要用上位机给他发送数据。
三、上位机程序

这里我们用个人PC端做测试。
import serialArduino = serial.Serial('COM3', 9600, timeout=0.2)send_data = b'0'while True:    Arduino.write(send_data) 代码不多,也很简单,需要注意的是要在数据前加一个小写字母b,表示bytes字符串:





四、总结

其实实现的思路和过程不是很难,但是需要注意一些细节,比如下位机Arduino接收数据的编码方式,还有上位机发送数据的编码方式。
基于此,你就可以开发多个单片机联动的项目啦~
举报

更多回帖

发帖
×
20
完善资料,
赚取积分