【随手笔记】电脑端上位机初涉(一)

news2024/11/28 1:42:19

实现电脑端上位机的方式及其学习难度和知识点

在嵌入式开发中,电脑端上位机程序用于与嵌入式设备进行通信和控制。以下是几种常见的实现方式,以及它们的学习难度和所需的知识点:

  1. Python + PySerial

    • 学习难度:低
    • 知识点
      • Python 基础:变量、数据类型、控制结构、函数、类等。
      • PySerial 库:如何配置和使用串口,读写数据。
      • 异常处理:处理串口通信中的异常情况。
    • 优点
      • Python 语法简洁,易于上手。
      • 社区资源丰富,文档详细。
      • 适用于快速原型开发和简单的上位机应用。
    • 示例代码
      import serial
      import time
      
      def main():
          port = 'COM3'  # 根据实际情况修改串口号
          baud_rate = 9600  # 根据实际情况修改波特率
          timeout = 1  # 读取超时时间
      
          try:
              ser = serial.Serial(port, baud_rate, timeout=timeout)
              print(f"Connected to {port} at {baud_rate} baud rate")
      
              while True:
                  message = "Hello, Arduino!\n"
                  ser.write(message.encode())
                  print(f"Sent: {message.strip()}")
      
                  response = ser.readline().decode().strip()
                  if response:
                      print(f"Received: {response}")
      
                  time.sleep(1)
      
          except serial.SerialException as e:
              print(f"Error opening serial port: {e}")
          except KeyboardInterrupt:
              print("Program terminated by user")
          finally:
              if ser.is_open:
                  ser.close()
                  print("Serial port closed")
      
      if __name__ == "__main__":
          main()
      
  2. C# + Visual Studio

    • 学习难度:中
    • 知识点
      • C# 基础:变量、数据类型、控制结构、类、对象等。
      • .NET Framework:如何使用 System.IO.Ports 命名空间进行串口通信。
      • Windows 窗体应用:如何创建和设计用户界面。
    • 优点
      • 强大的开发环境,支持复杂的用户界面和功能。
      • 适用于需要图形界面的上位机应用。
    • 示例代码
      using System;
      using System.IO.Ports;
      using System.Windows.Forms;
      
      public class MainForm : Form
      {
          private SerialPort _serialPort;
          private Button _sendButton;
          private TextBox _messageTextBox;
          private TextBox _responseTextBox;
      
          public MainForm()
          {
              _serialPort = new SerialPort("COM3", 9600);
              _serialPort.DataReceived += SerialPort_DataReceived;
      
              _sendButton = new Button { Text = "Send", Location = new System.Drawing.Point(10, 10) };
              _sendButton.Click += SendButton_Click;
      
              _messageTextBox = new TextBox { Location = new System.Drawing.Point(10, 40) };
              _responseTextBox = new TextBox { Location = new System.Drawing.Point(10, 70), Multiline = true, Height = 100 };
      
              this.Controls.Add(_sendButton);
              this.Controls.Add(_messageTextBox);
              this.Controls.Add(_responseTextBox);
          }
      
          private void SendButton_Click(object sender, EventArgs e)
          {
              string message = _messageTextBox.Text + "\n";
              _serialPort.WriteLine(message);
          }
      
          private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
          {
              string response = _serialPort.ReadLine();
              _responseTextBox.Invoke(new Action(() => _responseTextBox.AppendText(response)));
          }
      
          [STAThread]
          static void Main()
          {
              Application.EnableVisualStyles();
              Application.SetCompatibleTextRenderingDefault(false);
              Application.Run(new MainForm());
          }
      }
      
  3. LabVIEW

    • 学习难度:中
    • 知识点
      • 图形化编程:如何使用 LabVIEW 的图形化界面进行编程。
      • VI(虚拟仪器):如何创建和使用 VI。
      • 串口通信:如何配置和使用串口通信模块。
    • 优点
      • 适合没有编程经验的用户。
      • 内置丰富的串口通信功能和数据处理工具。
    • 步骤
      • 安装 LabVIEW 软件。
      • 使用图形化界面配置串口通信。
      • 拖拽和连接模块来实现数据的读取和发送。
  4. MATLAB

    • 学习难度:中
    • 知识点
      • MATLAB 基础:变量、数据类型、控制结构、函数等。
      • 串口通信工具箱:如何使用 serial 函数配置和操作串口。
      • 数据处理:如何处理和分析接收到的数据。
    • 优点
      • 强大的数学和数据分析功能。
      • 适用于需要数学和数据分析功能的项目。
    • 示例代码
      s = serial('COM3', 'BaudRate', 9600);
      fopen(s);
      
      try
          while true
              message = 'Hello, Arduino!\n';
              fprintf(s, message);
              response = fscanf(s, '%s');
              if ~isempty(response)
                  disp(['Received: ', response]);
              end
              pause(1);
          end
      catch
          fclose(s);
          delete(s);
          disp('Serial port closed.');
      end
      
  5. JavaScript + Node.js + SerialPort

    • 学习难度:中
    • 知识点
      • JavaScript 基础:变量、数据类型、控制结构、异步编程等。
      • Node.js:如何使用 Node.js 进行服务器端编程。
      • SerialPort 库:如何配置和使用串口通信。
    • 优点
      • 适用于需要跨平台的上位机应用。
      • 适用于前端开发者。
    • 示例代码
      const SerialPort = require('serialport');
      const Readline = require('@serialport/parser-readline');
      
      const port = new SerialPort('COM3', { baudRate: 9600 });
      const parser = port.pipe(new Readline({ delimiter: '\n' }));
      
      port.on('open', () => {
          console.log('Serial port opened');
      });
      
      port.on('error', (err) => {
          console.error(`Error opening serial port: ${err.message}`);
      });
      
      parser.on('data', (data) => {
          console.log(`Received: ${data}`);
      });
      
      setInterval(() => {
          const message = 'Hello, Arduino!\n';
          port.write(message, (err) => {
              if (err) {
                  console.error(`Error writing to serial port: ${err.message}`);
              } else {
                  console.log(`Sent: ${message}`);
              }
          });
      }, 1000);
      

总结

  • Python + PySerial:适合初学者和快速原型开发,学习难度低。
  • C# + Visual Studio:适合需要复杂功能和图形界面的项目,学习难度中等。
  • LabVIEW:适合没有编程经验的用户和需要快速实现复杂功能的项目,学习难度中等。
  • MATLAB:适合需要数学和数据分析功能的项目,学习难度中等。
  • JavaScript + Node.js + SerialPort:适合需要跨平台的上位机应用和前端开发者,学习难度中等。

根据你的具体需求和编程经验,选择合适的方式可以大大提高开发效率。如果你是初学者,建议从 Python + PySerial 开始,因为它的学习曲线较为平缓,社区资源丰富。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2248745.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】从C语言到C++学习指南

如果你也是从C语言一路过来的,那么请一起看下去吧! 文章目录 面型对象程序设计C基础C和C一些语法区别C在非对象方面对C语言的扩充C的一些标准(兼容旧标准) 首先,在C的学习中,我们要时刻清醒一点&#xff1…

Fakelocation Server服务器/专业版 ubuntu

前言:需要Ubuntu系统 Fakelocation开源文件系统需求 Ubuntu | Fakelocation | 任务一 任务一 更新Ubuntu(安装下载不再赘述) sudo -i # 提权 sudo apt update # 更新软件包列表 sudo apt upgrade # 升级已安装的软…

探索Python的HTTP之旅:揭秘Requests库的神秘面纱

文章目录 **探索Python的HTTP之旅:揭秘Requests库的神秘面纱**第一部分:背景介绍第二部分:Requests库是什么?第三部分:如何安装Requests库?第四部分:Requests库的五个简单函数使用方法第五部分&…

WPF——ICON按钮制作

前言 首先ICON按钮,即带图标按钮,即图标按钮。 图标按钮在开发时,主要是有两种方式来进行。一是在Button的Content内添加Image,然后设置Image的属性Source来实现,这种方式主要是简单易操作,对于初学者来说…

【MySQL篇】持久化和非持久化统计信息的深度剖析(第一篇,总共六篇)

💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨ 💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️…

三开关VUE组件

一、使用效果 <template><QqThreeSwitch v-model"value" /><!-- <SqThreeSwitch v-model"value" :options"[test1, test2, test3]"><template #left-action><div style"display: flex"><IconMoon…

线段树与树状数组 (C++)

线段树&#xff1a;基于分治思想的二叉树&#xff0c;用于维护区间信息&#xff08;区间和&#xff0c;区间最值等&#xff09;&#xff0c;区间修改和区间查询的时间复杂度为logn 叶子节点存储元素本身&#xff0c;非叶子节点存取区间信息 1.节点&#xff1a;是一个结构体&a…

vue3 uniapp 扫普通链接或二维码打开小程序并获取携带参数

vue3 uniapp 扫普通链接或二维码打开小程序并获取携带参数 微信公众平台添加配置 微信公众平台 > 开发管理 > 开发设置 > 扫普通链接二维码打开小程序 配置链接规则需要下载校验文档给后端存入服务器中&#xff0c;保存配置的时候会校验一次&#xff0c;确定当前的配…

数据结构(初阶6)---二叉树(遍历——递归的艺术)(详解)

二叉树的遍历与练习 一.二叉树的基本遍历形式1.前序遍历(深度优先遍历)2.中序遍历(深度优先遍历)3.后序遍历(深度优先遍历)4.层序遍历&#xff01;&#xff01;(广度优先遍历) 二.二叉树的leetcode小练习1.判断平衡二叉树1&#xff09;正常解法2&#xff09;优化解法 2.对称二叉…

spring boot2.7集成OpenFeign 3.1.7

1.Feign Feign是一个声明式web服务客户端。它使编写web服务客户端更容易。要使用Feign&#xff0c;请创建一个接口并对其进行注释。它具有可插入注释支持&#xff0c;包括Feign注释和JAX-RS注释。Feign还支持可插拔编码器和解码器。Spring Cloud增加了对Spring MVC注释的支持&…

基于Redis内核的热key统计实现方案|得物技术

一、Redis热key介绍 Redis热key问题是指单位时间内&#xff0c;某个特定key的访问量特别高&#xff0c;占用大量的CPU资源&#xff0c;影响其他请求并导致整体性能降低。而且&#xff0c;如果访问热key的命令是时间复杂度较高的命令&#xff0c;会使得CPU消耗变得更加严重&…

CTF-Hub SQL 报错注入(纯手动注入)

​ 当输入1时&#xff0c;发现只有查询正确&#xff0c;基本上可以判断出没有回显 开始注入(工具hackerBar) 题目是报错注入&#xff0c;方向就比较明显&#xff0c;大致说一下用到的函数和原理。 常见报错注入函数&#xff1a; 通过 floor() 报错注入通过 extractValue() …

Elasticsearch中的节点(比如共20个),其中的10个选了一个master,另外10个选了另一个master,怎么办?

大家好&#xff0c;我是锋哥。今天分享关于【Elasticsearch中的节点&#xff08;比如共20个&#xff09;&#xff0c;其中的10个选了一个master&#xff0c;另外10个选了另一个master&#xff0c;怎么办&#xff1f;】面试题。希望对大家有帮助&#xff1b; Elasticsearch中的节…

linux安装mysql8.0.40

一、下载MySQL安装包 1.查看glibc版本 rpm -qa | grep glibc 2.到mysql官网下载安装包 ​ 二、解压安装 1.上传压缩包纸/usr/local 目录下&#xff0c;解压&#xff1a; tar -xvf mysql-8.0.40-linux-glibc2.17-x86_64.tar.xz 2.重命名&#xff1a; mv mysql-8.0.40-linux-…

【大数据学习 | Spark-Core】RDD的五大特性(包含宽窄依赖)

分析一下rdd的特性和执行流程 A list of partitions 存在一系列的分区列表A function for computing each split 每个rdd上面都存在compute方法进行计算A list of dependencies on other RDDs 每个rdd上面都存在一系列的依赖关系Optionally, a Partitioner for key-value RDDs…

在 Taro 中实现系统主题适配:亮/暗模式

目录 背景实现方案方案一&#xff1a;CSS 变量 prefers-color-scheme 媒体查询什么是 prefers-color-scheme&#xff1f;代码示例 方案二&#xff1a;通过 JavaScript 监听系统主题切换 背景 用Taro开发的微信小程序&#xff0c;需求是页面的UI主题想要跟随手机系统的主题适配…

【C语言】int *p[ ] 与 int (*p)[ ] 的区分辨析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 &#x1f4af;前言&#x1f4af;基本概念&#xff1a;数组与指针&#x1f4af;理解 int *p[10] 与 int (*p)[10]1. int *p[10]&#xff1a;存放指针的数组2. int (*p)[10]&#xff1a;指向数组的指针 …

Vue3 el-table 默认选中 传入的数组

一、效果&#xff1a; 二、官网是VUE2 现更改为Vue3写法 <template><el-table:data"tableData"border striperow-key"id"ref"tableRef":cell-style"{ text-align: center }":header-cell-style"{background: #b7babd…

MT6769/MTK6769核心板规格参数_联发科安卓主板开发板方案

MT6769安卓核心板具有集成的蓝牙、FM、WLAN和GPS模块&#xff0c;是一个高度集成的基带平台&#xff0c;结合了调制解调器和应用处理子系统&#xff0c;以支持LTE/LTE-A和C2K智能手机应用。 该芯片集成了两个工作频率高达2.0GHz的ARMCortex-A75内核、六个工作频率高达1.70GHz的…

在Excel中处理不规范的日期格式数据并判断格式是否正确

有一个Excel表&#xff0c;录入的日期格式很混乱&#xff0c;有些看着差不多&#xff0c;但实际多一个空格少一个字符很难发现&#xff0c;希望的理想格式是 1980-01-01&#xff0c;10位&#xff0c;即&#xff1a;“YYYY-mm-dd”&#xff0c;实际上数据表中这样的格式都有 19…