
- 对 象
- 控制者和提供服务者
- 定 义
- 可以直接发出操控命令的计算机
- 特 点
- 需要编程,都有专门的开发系统
- 中文名
- 上位机
- 外文名
- master computer
-
上位机
2010-11-25 13:56:00上位机是指人可以直接发出操控命令的计算机,一般是PC,屏幕上显示各种信号变化(液压,水位,温度等)。下位机是直接控制设备获取设备状况的计算机,一般是PLC/单片机之类的。上位机发出的命令首先给下位机... -
C#上位机开发(一)—— 了解上位机
2018-06-02 16:07:00在单片机项目开发中,上位机也是一个很重要的部分,主要用于数据显示(波形、温度等)、用户控制(LED,继电器等),下位机(单片机)与 上位机之间要进行数据通信的两种方式都是基于串口的: USB转串口 —— ...上百篇原创人工智能系列教程,从理论到实战,手把手带你掌握人工智能,点击☞这里☜进入传送门~
在单片机项目开发中,上位机也是一个很重要的部分,主要用于数据显示(波形、温度等)、用户控制(LED,继电器等),下位机(单片机)与 上位机之间要进行数据通信的两种方式都是基于串口的:
- USB转串口 —— 上位机和下位机通过USB转串口连接线直接相连进行数据交互;
- 串口转WIFI(ESP8266) —— 上位机和下位机基于TCP/IP协议通过WIFI传输数据;
- 串口转蓝牙(HC-06)—— 不多用,暂不介绍;
上位机软软件开发主要包括以下两种:
1、Windows上位机(EXE可执行程序)
在Windows上,最早用VB语言开发,后来由于C++的发展,采用MFC开发,近几年,微软发布了基于.NET框架的面向对象语言C#,更加稳定安全,再配合微软强大的VS进行开发,效率奇高;
另外,如果想要在Linux上跨平台运行,可以选用Qt;如果想要更加丰富好看的数据显示界面,可以选用Labview开发;
2、Android上位机(APP)
在Android操作系统上,主要采用Java语言,使用WIFI或者蓝牙基于TCP/IP协议传输数据,利用Android Studio开发;
在此,我们主要介绍如何通过VS + C#开发电脑上位机,其它上位机的开发暂且不论。
注:VS下载与安装参考这篇较详细的博客
https://blog.csdn.net/qq_36556893/article/details/79430133
-
无线上位机
2018-12-31 22:04:52无线芯片上位机测试 -
BootLoader上位机
2020-12-19 10:26:04bootloader CAN在线刷写,上位机配套程序。VS/MFC编写,支持周立功CAN卡USBCAN-2E-U。 -
指纹识别上位机,指纹识别模块上位机,R305F上位机程序,FPC1011F上位机
2015-03-19 10:20:01指纹识别上位机,指纹识别模块上位机,R305F上位机程序,FPC1011F上位机 -
恒温系统上位机恒温控制系统上位机.7z
2021-04-07 10:45:49恒温系统上位机恒温控制系统上位机.7z -
matlab上位机
2018-02-27 17:26:5351单片机 matlab上位机软件 用于51与电脑进行串口通讯 -
用C#实现工控上位机
2020-09-25 17:30:20结合Github高星开源项目SharpSCADA讲解工控上位机开发,重视基础,突出实战,为广大工控从业者、编程爱好者提供一种新颖的解决方案,可以快速搭建强大易用可扩展的工控上位机,并在此开源项目基础上开发工业大数据和... -
全新工业物联上位机开发实战课程 C#+.NET上位机实战课程 上位机预科班+实战班课程
2021-03-30 20:26:09上位机作为物联网与工业企业智能化的媒介,承担着非常重要的作用,上位机的应用是从事开发的工程师们,在工业企业中是一个非常重要的就业方向。课程资源分为三个部分,分别是.NET上位机基础实战课程,以及C#上位机... -
机器人上位机
2018-09-10 01:58:05人形数字舵机机器人上位机程序。(16度)还有个40度的,有需要的请联系我。。。 -
Matlab上位机开发(一) —— 了解上位机
2021-01-06 09:18:491. 上位机的作用 在嵌入式项目开发中,无论是单片机项目、嵌入式Linux项目、FPGA项目,上位机始终是一个很重要的部分,主要用于: 数据显示(波形、温度等) 用户控制(LED,继电器等) 文件传输(图像、音频等) 下... -
QT5串口编程——编写简单的上位机
2016-01-30 15:51:48最近在学习嵌入式,而上位机又是一个不可缺少的工具,于是就开始接触QT,学习编写上位机。刚开始的时候什么都不懂,发现《Qt 学习之路 2》有比较好的入门教程。学习了前面部分,对QT有了大概的了解后,就开始在网上...注:更新自2018年12月13日(我回看了一年多前写的这篇博客,觉得不是很好,故翻新了一遍。)
最近在学习嵌入式,而上位机又是一个不可缺少的工具,于是就开始接触QT,学习编写上位机。刚开始的时候什么都不懂,发现《Qt 学习之路 2》有比较好的入门教程。学习了前面部分,对QT有了大概的了解后,就开始在网上寻找串口编程的方法。通过好几天的学习,终于写出了一个用于串口通信的上位机。下面开始介绍串口类的使用。
首先,QT5是自带QSerialPort这个类的,使用时需要在pro文件里面添加一行:
QT += serialport
然后直接引用头文件就可以了。
#include <QSerialPort> //提供访问串口的功能 #include <QSerialPortInfo> //提供系统中存在的串口的信息
在QT5中,串口通信是借助一个QSerialPort的对象来实现的,在设置QSerialPort对象对串口的名称、波特率、数据位、校验位、停止位等参数后,方能对串口进行读写。下面,我总结了一下借助QSerailPort对串口进行设置、打开、读、写和关闭的过程。
一、设置和打开串口//创建串口对象 QSerialPort serial; //设置串口名 serial.setPortName("COM3"); //设置波特率 serial.setBaudRate(QSerialPort::Baud9600); //设置数据位数 serial.setDataBits(QSerialPort::Data8); //设置奇偶校验 serial.setParity(QSerialPort::NoParity); //设置停止位 serial.setStopBits(QSerialPort::OneStop); //设置流控制 serial.setFlowControl(QSerialPort::NoFlowControl); //打开串口 serial.open(QIODevice::ReadWrite);
以上代码是QSerialPort对象的设置示例,作用是:
- 设置串口名为 COM3
- 设置波特率为9600
- 设置数据位为8位
- 设置没有奇偶校验位
- 设置停止位为1位
- 设置没有流控制
- 以可读写的方式打开串口
设置完这些就能进行读写操作了。如果遇到不理解的地方,可以选择QT的类或函数,然后按F1查阅手册。举个例子,如果我们想查看QSerialPort的其它的属性,可以选择QSerialPort的类名或成员函数,然后按F1。
二、读取数据//从接收缓冲区中读取数据 QByteArray buffer = serial.readAll();
串口在收到数据后,会将数据存入接收缓冲区。此时,我们可以通过readAll()函数将接收缓冲区的数据读出来。当串口的接收缓冲区有数据时,QSerilaPort对象会发出一个readyRead()的信号。因此,我们可以编写一个槽函数来读数据,例如:
//连接信号和槽 QObject::connect(&serial, &QSerialPort::readyRead, this, &MainWindow::serialPort_readyRead); …… //编写的槽函数 void MainWindow::serialPort_readyRead() { //从接收缓冲区中读取数据 QByteArray buffer = serial.readAll(); //处理数据 //…… }
三、发送数据
serial->write(data);
使用write函数便可以把字节数组中的字节发送出去。
四、关闭串口
serial->close();
串口不用时,可通过close()函数将其关闭。
接下来是一个实例
1、创建一个新的Widgets Appliaction工程
2、使用QtCreator的ui文件来设计上位机的界面,设计如下:
3、mainwindow.h文件内容如下:
//mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QSerialPort> #include <QSerialPortInfo> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private slots: void serialPort_readyRead(); void on_searchButton_clicked(); void on_openButton_clicked(); void on_sendButton_clicked(); void on_clearButton_clicked(); private: Ui::MainWindow *ui; QSerialPort serial; }; #endif // MAINWINDOW_H
4、mainwindow.cpp文件内容如下:
//mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include <QMessageBox> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); //连接信号和槽 QObject::connect(&serial, &QSerialPort::readyRead, this, &MainWindow::serialPort_readyRead); //发送按键失能 ui->sendButton->setEnabled(false); //波特率默认选择下拉第三项:9600 ui->baudrateBox->setCurrentIndex(3); } MainWindow::~MainWindow() { delete ui; } void MainWindow::serialPort_readyRead() { //从接收缓冲区中读取数据 QByteArray buffer = serial.readAll(); //从界面中读取以前收到的数据 QString recv = ui->recvTextEdit->toPlainText(); recv += QString(buffer); //清空以前的显示 ui->recvTextEdit->clear(); //重新显示 ui->recvTextEdit->append(recv); } void MainWindow::on_searchButton_clicked() { ui->portNameBox->clear(); //通过QSerialPortInfo查找可用串口 foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) { ui->portNameBox->addItem(info.portName()); } } void MainWindow::on_openButton_clicked() { if(ui->openButton->text()==QString("打开串口")) { //设置串口名 serial.setPortName(ui->portNameBox->currentText()); //设置波特率 serial.setBaudRate(ui->baudrateBox->currentText().toInt()); //设置数据位数 switch(ui->dataBitsBox->currentIndex()) { case 8: serial.setDataBits(QSerialPort::Data8); break; default: break; } //设置奇偶校验 switch(ui->ParityBox->currentIndex()) { case 0: serial.setParity(QSerialPort::NoParity); break; default: break; } //设置停止位 switch(ui->stopBitsBox->currentIndex()) { case 1: serial.setStopBits(QSerialPort::OneStop); break; case 2: serial.setStopBits(QSerialPort::TwoStop); break; default: break; } //设置流控制 serial.setFlowControl(QSerialPort::NoFlowControl); //打开串口 if(!serial.open(QIODevice::ReadWrite)) { QMessageBox::about(NULL, "提示", "无法打开串口!"); return; } //下拉菜单控件失能 ui->portNameBox->setEnabled(false); ui->baudrateBox->setEnabled(false); ui->dataBitsBox->setEnabled(false); ui->ParityBox->setEnabled(false); ui->stopBitsBox->setEnabled(false); ui->openButton->setText(QString("关闭串口")); //发送按键使能 ui->sendButton->setEnabled(true); } else { //关闭串口 serial.close(); //下拉菜单控件使能 ui->portNameBox->setEnabled(true); ui->baudrateBox->setEnabled(true); ui->dataBitsBox->setEnabled(true); ui->ParityBox->setEnabled(true); ui->stopBitsBox->setEnabled(true); ui->openButton->setText(QString("打开串口")); //发送按键失能 ui->sendButton->setEnabled(false); } } void MainWindow::on_sendButton_clicked() { //获取界面上的数据并转换成utf8格式的字节流 QByteArray data = ui->sendTextEdit->toPlainText().toUtf8(); serial.write(data); } void MainWindow::on_clearButton_clicked() { ui->recvTextEdit->clear(); }
5、main.cpp文件内容如下:
#include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
4、测试(将USB转TTL模块发送和接收引脚短接,自己发自己收)
新的工程已经上传至:https://download.csdn.net/download/u014695839/10881180 (2018年12月27日更新)
以前的工程在这里可以下载:http://download.csdn.net/detail/u014695839/9763670
以上内容若有问题,大家务必提醒,我定会马上更正!
希望能与大家多多交流。
-
匿名上位机
2018-03-04 11:33:45◤2:高级收码:高级收码从基本收码升级而来,上位机收到数据后,若高级收码的开关是打开的,那么就会对接收到的数据进行解析,数据的格式由通信协议定义。分为固定格式和自定义格式两大部分。自定义格式是留给大家... -
DALIMaster上位机
2014-12-09 15:36:29DALIMaster上位机软件。编码测试通用 -
英威腾上位机
2012-05-24 16:27:16英威腾上位机 -
CH341上位机
2018-03-22 16:47:39CH341上位机 delphi 源码 CH341上位机 delphi 源码 -
上位机设计
2015-06-08 21:00:45适合毕业设计,上位机软件设计,VB 节点数据接收和发送 -
摄像头 上位机
2014-07-17 10:14:12摄像头 上位机 C++编写 有源码 有 软件 -
LabVIEW上位机
2014-06-10 13:22:40LabVIEW上位机,用以实时查看数据变化 -
51单片机VB上位机控制数码管(含上位机程序下位机源码)
2020-12-19 12:16:1451单片机VB上位机控制数码管(含上位机程序下位机源码),通过上位机需要显示数码管的内容 -
xmodem上位机代码
2016-03-16 11:16:46xmodem上位机 -
WIFI小车上位机
2017-05-02 14:00:18WIFI小车上位机 -
倍福与上位机
2019-04-03 16:32:11c#编写上位机程序控制倍福plc一些步骤