精华内容
下载资源
问答
  • 上位机

    千次阅读 2015-12-15 13:29:36
    地图实时显示,新建线程,每五秒刷新一次,用Matplotlib画图,不过Matplotlib这个是第三方库,见这里写链接内容这里提供了百度地图api这里...python上位机语言用python,安装完之后,要安装pyserial,用来进行串口通信,

    地图

    实时显示,新建线程,每五秒刷新一次,用Matplotlib画图,不过Matplotlib这个是第三方库,见这里写链接内容

    这里提供了百度地图api这里写链接内容

    我要用百度的地图,所以,我先去百度注册了开发者,
    但是有很多不足。先不考虑。

    谷歌地图也可以用,但是在puthon测试的时候,出错,估计是被屏蔽了。

    python

    上位机语言用python,安装完之后,要安装pyserial,用来进行串口通信,有一个小问题,解决在这里这里写链接内容
    就是write的时候有错误,需要转码。

    #!/usr/bin/env python
    # -*- coding: utf-8 -*
    
    import serial
    
    
    t = serial.Serial('com1',9600)  
    n = t.write('you are my world'.encode('utf-8'))
    
    str = t.read(3)
    print(str)
    
    n = t.write('wangtaonice'.encode('utf-8'))
    

    以上就是串口测试程序。有读有写。一定要注意编码问题。
    问题是read的时候,程序会等待,知道这句话满足条件,才进行下一句,因此,有必要考虑多进程或多线程。这里是一个例子:这里写链接内容
    这个帖子有界面的东西:这里写链接内容
    以下为上面引用的:
    我用的是“线程轮寻”方式。
    就是打开串口后,启动一个线程来监听串口数据的进入,有数据时,就做数据的处理(也可以发送一个事件,并携带接收到的数据)。 我没有用到串口处理太深的东西。

    python文件路径不要有中文,否则会出现各种莫名其妙的错误

    数据

    json是一种轻量级数据结构,arduino支持,python也支持,因此,将之选为信息传输的方案。参见:这里写链接内容
    一个更好的讨论区:这里写链接内容
    python中json解析文件的很好示例:这里写链接内容
    主要代码如下:

    #!/usr/bin/python
    import json
    #Function:Analyze json script
    #Json is a script can descript data structure as xml, 
    #for detail, please refer to "http://json.org/json-zh.html".
    
    #Note:
    #1.Also, if you write json script from python,
    #you should use dump instead of load. pleaser refer to "help(json)".
    
    #json file:
    #The file content of temp.json is:
    #{
    # "name":"00_sample_case1",
    # "description":"an example."
    #}
    #f = file("temp.json");
    #s = json.load(f)
    #print s
    #f.close
    
    #json string:
    s = json.loads('{"name":"test", "type":{"name":"seq", "parameter":["1", "2"]}}')
    print s
    print s.keys()
    print s["name"]
    print s["type"]["name"]
    print s["type"]["parameter"][1]

    可以看出,结构化非常利于输出数据。
    那么,问题来了,如何从串口的数据组装json数据?
    ajson的github网址这里写链接内容
    ajson库的加入非常简单,从github下载完zip文件之后,在arduino的菜单里加载库即可,不需要解压。

    上位机程序集成

    现在,首先用虚拟串口工具虚拟出多对串口,然后通过python接收数传的数据,通过虚拟出来的串口将数据发到不同的程序,比如jy901自带的显示程序,上面的三维显示不错,还有各数据显示,是个不错的工具。
    这种用python+虚拟串口方法,实验还是可以的。
    问题是,速度。
    下一步设想建立线程来解决。

    代码

    python串口输出16进制
    可以参见:这里写链接内容

    json的处理:这里写链接内容

    python语言最常见的括号有三种,分别是:小括号( )、中括号[ ]和大括号也叫做花括号{ }。其作用也各不相同,分别用来代表不同的python基本内置数据类型。
    1、python中的小括号( ):代表tuple元组数据类型,元组是一种不可变序列。创建方法很简单,大多时候都是用小括号括起来的。

    tup = (1,2,3)
    tup
    (1, 2, 3)

    ()#空元组
    ()

    55,#一个值的元组
    (55,)

    2、python中的中括号[ ]:代表list列表数据类型,列表是一种可变的序列。其创建方法即简单又特别,像下面一样:

    list(‘python’)
    [‘p’, ‘y’, ‘t’, ‘h’, ‘o’, ‘n’]

    3、python大括号{ }花括号:代表dict字典数据类型,字典是由键对值组组成。冒号’:’分开键和值,逗号’,’隔开组。用大括号创建的方法如下:

    dic={‘jon’:’boy’,’lili’:’girl’}
    dic
    {‘lili’: ‘girl’, ‘jon’: ‘boy’}

    json的key和值一定要用双引号包起来(数值除外),json字符串最外面用单引号:

    '{"wife":"wang","baby":22}'

    python 串口

    这里有arduino跟pc python通信的例子:
    这里写链接内容

    展开全文
  • 1. 上位机作用 在嵌入式项目开发中,无论是单片机项目、嵌入式Linux项目、FPGA项目,上位机始终是一个很重要的部分,主要用于: 数据显示(波形、温度等) 用户控制(LED,继电器等) 文件传输(图像、音频等) 下...
  • 上位机作为物联网与工业企业智能化的媒介,承担着非常重要的作用上位机的应用是从事开发的工程师们,在工业企业中是一个非常重要的就业方向。课程资源分为三个部分,分别是.NET上位机基础实战课程,以及C#上位机...
  • Matlab上位机开发

    千次阅读 2020-04-01 21:52:17
    Matlab上位机开发1 了解上位机1.1 上位机作用1.2 常用上位机开发方式1.2.1 Windows上位机(基于串口通信)1.2.2 Android上位机(基于网络通信)1.3 教程概况1.3.1 C#上位机开发教程1.3.2 IoT App开发1.3.3 Matlab...

    Matlab上位机开发


    转载自:mculover666微信公众号
    向前辈学习!

    1 了解上位机

    1.1 上位机的作用

    在嵌入式项目开发中,无论是单片机项目、嵌入式Linux项目、FPGA项目,上位机始终是一个很重要的部分,主要用于:

    • 数据显示(波形、温度等)
    • 用户控制(LED,继电器等)
    • 文件传输(图像、音频等)

    下位机(单片机)与 上位机之间进行数据通信有四种主要方式:

    1. 串口
      主要适用于下位机和上位机在一起的系统,使用USB转串口与PC相连,也可以使用无线透传串口模组,将串口信号转化为射频信号传输;
    2. USB
      速度相较于串口大幅提升,适合于工控设备传输文件(比如3D打印机、激光切割机等),但是对下位机要求较高,需要支持USB协议;
    3. 网络
      一方面适用于物联网项目,一方面适用于嵌入式Linux系统(已经移植支持了网络);
    4. 蓝牙
      不多用。

    1.2 常用上位机开发方式

    上位机软软件开发主要包括以下两种:

    1.2.1 Windows上位机(基于串口通信)

    1. WinForm或者WPF(C#)
      在Windows上,最早用VB语言开发,后来由于C++的发展,采用MFC开发,再后来微软发布了基于.NET框架的面向对象语言C#,更加稳定安全,再配合微软强大的VS进行开发,效率奇高;

    c#和Java的语法类似,WPF相较于WinFormden优势在于,可以使用xml语言编写更加炫酷的界面;

    1. Qt(C++)
      一方面可以跨平台运行,另一方面,对于嵌入式Linux中已经熟练掌握Qt开发的开发者,使用Qt再来开发上位机非常方便;

    2. Labview
      有着更加丰富好看的数据显示控件和逼真的交互控件,并且可以图形化开发;

    3. Matlab
      多适合于需要上位机进行信号处理的项目,比如本身掌握Matlab中基本信号处理的科研人员,只需要使用下位机(Arduino)来读取ADC的数据并发送到PC进行处理,还可以进行图像处理,语音信号处理等;

    1.2.2 Android上位机(基于网络通信)

    1. 使用Java或者kotlin编写(APP)
      利用Android Studio开发,多适用于物联网项目的数据显示和控制;

    2. 使用XML+CSS+JavaScript编写(小程序)
      微信提供了开发工具,多适用于物联网项目的数据显示和控制,相对APP比较轻量级,并且开发方式和网页开发类似。

    1.3 教程概况

    目前作者已经出的教程有:

    1.3.1 C#上位机开发教程

    在这里插入图片描述
    地址:https://blog.csdn.net/mculover666/category_8632945.html

    1.3.2 IoT App开发

    这个系列教程由作者和B站up主“阿正啷个哩个啷”联合出品,有文字教程和视频教程,非常简单粗暴,没有Java基础也能开发:

    • 文字教程:
      在这里插入图片描述
      地址:https://blog.csdn.net/mculover666/category_9780817.html

    • bilibili视频教程:在这里插入图片描述
      地址:https://space.bilibili.com/265908761/video

    1.3.3 Matlab上位机开发

    从本篇文章开发,我将带领大家一起掌握如何通过 Matlab 开发上位机,目前计划的有以下这些,敬请期待:

    • Matlab上位机开发(二)Hello,World
    • Matlab上位机开发(三)波形显示(幅度和频率可调节)
    • Matlab上位机开发(四)Matlab调用自带摄像头或者USB摄像头并显示
    • Matlab上位机开发(五)Mtalab串口通信
      希望本系列教程可以给你带来帮助~

    注:Matlab2018可以在作者提供的不限速下载站下载,点击阅读原文即可跳转。

    2 Hello,World

    2.1 启动GUIDE

    在Matlab命令行输入guide启动Matlab的图形界面设计工具,选择创建一个空白的GUI:
    在这里插入图片描述
    创建之后界面如图:
    在这里插入图片描述

    2.2 拖动控件,开始设计

    2.2.1 控件栏

    控件栏中提供了13个控件,分别为:

    • 按钮
    • 滑动条
    • 单选按钮
    • 复选按钮
    • 可编辑文本
    • 静态文本
    • 弹出式菜单
    • 列表框
    • 切换按钮
    • 坐标轴
    • 面板
    • 按钮组

    2.2.2 静态文本显示控件

    首先从左边控件栏拖动到设计画布中:
    在这里插入图片描述
    然后双击画布中的控件,即可打开该控件的属性设置页面:
    在这里插入图片描述
    属性非常多,可以根据自己的需要进行设置,这里我调整字体大小(fontsize)为28,字体内容(string)为“HelloWorld”:
    在这里插入图片描述
    这些属性切换到分类模式下就很好理解了:
    在这里插入图片描述
    一些顾名思义的属性不再赘述,只讲述一些matlab中特有的:

    ① 控件风格和外观
    CData:在控件上显示的图像;
    ② 控件回调函数的执行控制
    BusyAction:处理回调函数的中断,有两种选项:即Cancel:取消中断事件,queue:排队(默认设置);
    Interruptible:指定当前的回调函数在执行时是否允许中断,去执行其他的函数;
    ③ 控件对象创建和删除控制
    CreateFcn:在对象产生过程中执行的回调函数;
    DeleteFcn:删除对象过程中执行的回调函数;
    ④ 控件标识信息
    Tag:控件的标识信息,可以自定义;

    2.2.3 按钮控件

    同样,拖动一个按钮控件到画布中,并修改其属性:
    在这里插入图片描述

    2.3 回调函数,让界面动起来

    Matlab中控件(比如按钮),和用户交互的机制是设置回调函数,什么是回调函数呢?

    当用户在点击按钮之后,程序中需要调用来处理该按钮点击事件的函数,称为该按钮的回调函数!

    设置一个控件的回调函数非常简单,只需要右击该按钮即可查看其所有的回调函数:
    在这里插入图片描述
    这里点击Callback即可跳转到该函数:
    在这里插入图片描述
    其中hObject为发生事件的源控件,eventdata为事件数据结构,handles为传入的对象句柄,在该回调函数中添加下面的这行代码,来修改静态文本显示控件的属性值:

    set(handles.text3,'String','按钮按下啦~');
    

    第一个参数根据传入的对象句柄和控件的唯一标识来寻找控件,第二个参数为要改哪个属性,第三个参数为改变的属性值,举一反三,其它的操作也是一样。

    2.4 大功告成,试试效果

    点击运行或者按F5,程序启动后如图:
    在这里插入图片描述
    点击按钮后,程序变为:
    在这里插入图片描述

    3 波形显示(幅度和频率可调节)

    3.1 控件布局

    打开Matlab,在命令行输入guide启动GUI设计工具,拖动控件开始设计:

    3.1.1 波形显示控件(axes)

    波形显示控件可以用于绘制各种波形,拖动控件到画布中即可,然后根据需要调整控件大小:
    在这里插入图片描述

    3.1.2 滑动条控件(slider)

    滑动条可以用于滑动调节波形的频率和幅度,并拖动两个静态文件控件用于说明:在这里插入图片描述
    双击频率的滑动条,设置其最大值和最小值,以及默认值:
    在这里插入图片描述
    同样,设置幅度的属性值:
    在这里插入图片描述

    3.1.3 可编辑文本框(edit)

    可编辑文本框有两个功能:

    • 用于直接设置波形的频率和幅度;
    • 用于显示滑动条设置的频率值和幅度值;

    拖动两个编辑框并在属性中设置其默认值:
    在这里插入图片描述

    3.1.4 按钮控件

    按钮控件用于启动波形显示:
    在这里插入图片描述

    3.1.5 保存设计

    设计完成之后,点击保存按钮或者按Ctrl+S保存设计:
    在这里插入图片描述

    3.2 回调函数,让界面动起来

    3.2.1 滑动条和编辑框联动

    首先编辑滑动条的回调函数,实现拖动滑动条,编辑框可以显示对应的值:

    v1 = get(handles.slider1, 'Value');
    s1 = sprintf("%f", v1);
    set(handles.edit1, 'String', s1);
    

    在这里插入图片描述
    点击运行,查看效果:

    同样,编写另一个滑动条的回调函数:

    v2 = get(handles.slider2,'Value');
    s2 = sprintf("%f", v2);
    set(handles.edit2, 'String', s2);
    

    实现的效果如下:
    在这里插入图片描述
    再来编写频率文本编辑框的回调函数,当输入一个值的时候,滑动条的值跟着变化:

    s1=get(handles.edit1,'String');
    v1=str2double(s1);
    set(handles.slider1,'Value',v1);
    

    同样,再来编写幅度文本框的回调函数:

    s2=get(handles.edit2,'String');
    v2=str2double(s2);
    set(handles.slider2,'Value',v2);
    

    3.2.2 编写一个绘制波形的自定义函数

    点击按钮、调节滑动条,都需要重新绘制波形,所以先编写一个自定义函数,供其它函数调用:

    function draw_wave(handles)
    global Fs
    global A
    Fs = 44100;
    dt=1.0/Fs;
    T =2;
    N=T/dt;
    t=linspace(0,T,N);
    s1=get(handles.edit1,'String');
    F=str2double(s1);
    s1=get(handles.edit2,'String');
    A=str2double(s1);
    x =A*sin(2*pi*F*t);
    plot(handles.axes1,t,x,'b','LineWidth',1.5);
    axis(handles.axes1,[0, 0.01, -2500,2500]);
    grid(handles.axes1);
    

    3.2.3 点击按钮,显示波形

    编写按钮的回调函数,在回调函数里调用之前编写的自定义函数显示波形:

    draw_wave(handles);
    

    运行效果如下:
    在这里插入图片描述

    3.2.4 添加频率滑动条调节波形功能

    继续编辑滑动条的回调函数,添加波形显示功能:

    频率调节滑动条完整的回调函数如下:

    v1 = get(handles.slider1, 'Value');
    s1 = sprintf("%f", v1);
    set(handles.edit1, 'String', s1);
    global Fs
    Fs = v1;
    draw_wave(handles);
    

    运行效果如下:
    在这里插入图片描述

    3.2.5 添加幅度滑动条调节波形功能

    继续编辑滑动条的回调函数,添加波形显示功能:

    幅度调节滑动条完整的回调函数如下:

    v2 = get(handles.slider2,'Value');
    s2 = sprintf("%f", v2);
    set(handles.edit2, 'String', s2);
    global A
    A = v2;
    draw_wave(handles);
    

    运行效果如下:
    在这里插入图片描述

    3.2.6 添加编辑框调节频率和幅度的功能

    同样,在频率编辑框的回调函数中添加代码,完整的回调函数如下:

    s1=get(handles.edit1,'String');
    v1=str2double(s1);
    set(handles.slider1,'Value',v1);
    global Fs
    Fs = v1;
    draw_wave(handles);
    

    在幅度编辑框的回调函数添加同样的功能,完整的回调函数如下:

    s2=get(handles.edit2,'String');
    v2=str2double(s2);
    set(handles.slider2,'Value',v2);
    global A
    A = v2;
    draw_wave(handles);
    

    运行即可看到效果,请参考下一节的完整演示效果。

    3.3 演示效果

    整个程序的完整演示效果如下:
    在这里插入图片描述

    4 Matlab获取自带摄像头或者USB摄像头数据

    4.1 两种获取摄像头的方式

    Matlab自身不支持直接读取摄像头数据,需要安装硬件支持包才可以获取,目前常用的有两个包:
    在这里插入图片描述
    第一个是 MATLAB Support Package for USB Webcams,这个包可以获取任何USB摄像头的图像(UVC),也可以获取电脑自带摄像头的数据,兼容 R2014a 到 R2020a 的版本。

    第二个是Image Acquisition Toolbox Support Package for OS Generic Video Interface,更加通用,它也兼容 R2014a 到 R2020a 的版本。(推荐)

    4.2 使用Image Acquisition Toolbox

    4.2.1 安装硬件支持包

    首先执行这条命令打开摄像头,测试是否可以调用videoinput函数:

    video_source = videoinput('winvideo',1)
    

    如果出现图中的错误,那么恭喜你,需要手动安装硬件支持包了。
    在这里插入图片描述
    点击获取附加功能中的获取硬件支持包:
    在这里插入图片描述
    按照图中所示找到该支持包:
    在这里插入图片描述
    安装支持包:
    在这里插入图片描述
    在这里插入图片描述
    这个安装之前需要登录Matlab账号,安装过程也比较慢。

    4.2.2 玩转摄像头

    ① 查看电脑上已经安装的图像适配器 Matlab的图像获取工具箱(第一步安装的硬件支持包)中提供了函数,可以获取查询当前PC上已经连接的摄像头信息,函数如下:

    imaqhwinfo()
    

    在这里插入图片描述
    其中InstalledAdaptors的值给出了当前电脑上已经安装的摄像头适配器个数,这里我的电脑上只有一个:winvideo
    ② 查看摄像头设备具体参数
    使用该命令查看上一步获取到的图像适配器的具体参数:

    win_info = iimaqhwinfo('winvideo')
    

    在这里插入图片描述
    可以看到其中给出了该图像适配器具体的一些参数,特别需要注意的是,该函数返回了连接在当前图像适配器winvideo上的所有摄像头的设备ID和设备信息!

    当前我的电脑上一共有两个摄像头,一个是笔记本电脑内置的摄像头,另一个是我连接的USB 2.0 摄像头,接下来以USB摄像头为例,说明如何查看摄像头的设备ID和具体信息:

    在工作区找到保存信息的变量win_info,双击查看其值:
    在这里插入图片描述
    可以看到,两个摄像头的设备ID分别为1和2,一般来说,电脑内置的摄像头的ID为1。
    同样,双击win_info.DeviceInfo变量,可以查看摄像头的具体参数:
    在这里插入图片描述
    这里摄像头支持的格式有40多种,不方便查看,我们可以在命令行查看:

    win_info.DeviceInfo.SupportedFormats
    

    在这里插入图片描述
    ③ 创建视频输入对象

    使用如下的命令来创建一个视频输入对象:

    video_obj = videoinput(adaptorname,deviceID,format)
    

    该函数的三个参数说明如下:

    • adaptorname:适配器名称(必须)
    • deviceID:设备ID号(必须)
    • format:视频采集格式(不填写则使用默认)
      如下,我要创建USB摄像头的视频输入对象:
    video_obj = videoinput('winvideo',2)
    

    在这里插入图片描述
    ④ 预览视频对象
    使用如下命令即可预览视频对象,该函数会自动打开一个窗口,播放摄像头画面:

    preview(video_obj)
    

    在这里插入图片描述

    4.3 使用USB Webcams包

    4.3.1 安装硬件支持包

    点击获取附加功能中的获取硬件支持包:
    在这里插入图片描述
    按照图中所示找到该支持包:
    在这里插入图片描述
    安装支持包:
    在这里插入图片描述
    这个包不需要授权,只需要安装之前登录Matlab账号即可,安装过程非常快。

    4.3.2 玩转摄像头

    ① 查看当前摄像头设备列表

    webcamlist
    

    在这里插入图片描述
    需要注意,使用webcam的时候,下标从1开始,1对应USB Camera,2对应Integrated Camera。

    ② 获取视频对象 一行代码即可获取,非常舒服,比如获取外接USB摄像头的输入对象:

    cam1 = webcam(1)
    

    在这里插入图片描述
    同样可以获取电脑自带摄像头的输入对象:

    cam1 = webcam(2)
    

    在这里插入图片描述
    ③ 预览视频对象
    使用如下命令即可预览视频对象,该函数会自动打开一个窗口,播放摄像头画面:
    在这里插入图片描述
    ④ 查看摄像头支持的分辨率并修改:

    <刚刚获取的设备对象>.AvailableResolutions
    

    在这里插入图片描述
    然后根据修改为需要的分辨率:

    <刚刚获取的设备对象>.Resolution = <指定的分辨率>
    

    在这里插入图片描述
    再次preview之后即可看到分辨率改变。

    ⑤ 用完之后清除对象

    clear <刚刚获取的对象>
    

    4.4 在GUI中显示视频流并拍照

    在Gui界面中显示视频流尽量使用Image Acquisition Toolbox。

    4.4.1 拖动控件,设计界面

    在命令行输入guide启动设计界面,新建一个设计文件。

    设计的界面如下:
    在这里插入图片描述

    4.4.2 实时显示摄像头画面

    点击开启按钮后,在第一个坐标区实时显示摄像头画面,回调函数代码如下:
    首先创建一个全局的视频输入对象:

    global video_obj;
    video_obj = videoinput('winvideo', 2, 'YUY2_640x480');
    

    然后设置图像格式为RGB:

    set(video_obj,'ReturnedColorSpace','rgb');
    

    获取视频输入对象的信息,用于在坐标区显示:

    videoRes = get(video_obj, 'VideoResolution');
    nBands = get(video_obj, 'NumberOfBands');
    

    转换,将视频输入对象与坐标区控件关联起来:

    hImage = image(zeros(videoRes(2), videoRes(1), nBands),'parent',handles.axes1);
    

    开始显示:

    preview(video_obj,hImage);
    start(video_obj);
    

    完整的代码如下:

    global video_obj;
    video_obj = videoinput('winvideo', 2, 'YUY2_640x480');
    set(video_obj,'ReturnedColorSpace','rgb');
    videoRes = get(video_obj, 'VideoResolution');
    nBands = get(video_obj, 'NumberOfBands');
    hImage = image(zeros(videoRes(2), videoRes(1), nBands),'parent',handles.axes1);
    preview(video_obj,hImage);
    start(video_obj);
    

    接下来启动后,点击开启按钮,就可以在第一个坐标区看到摄像头实时画面了。

    4.4.3 关闭摄像头实时显示

    点击关闭按钮后,关闭在第一个坐标区实时显示的摄像头画面,回调函数代码如下:

    global video_obj;
    stop(video_obj);
    closepreview(video_obj);
    delete(video_obj);
    

    接下来启动后,点击关闭按钮,就可以关闭在第一个坐标区看到摄像头实时画面了。

    4.4.4. 拍照(抓取画面)

    点击拍照按钮,即可抓取当前视频流的画面,显示在第二个坐标区控件,回调函数代码如下:

    global video_obj
    mypic = getsnapshot(video_obj);
    axes(handles.axes2);
    imshow(mypic);
    

    如果需要对抓取的图片进行处理,则将图片变量mypic设为全局变量!

    启动后即可看到效果。

    5 Matlab串口通信

    5.1 Matlab串口通信

    Matlab提供了串口通信的功能,串口通信的流程如下:

    5.1.1 创建串口对象

    创建一个串口对象的API如下:

    scom = serial('<串口号>');
    

    串口号为COM8的形式,这个API有个缺点:不能自动检测目前电脑中存在中的串口。

    创建之后设置该串口对象的属性:

    • InputBufferSize:输入缓冲区大小(单位字节)
    • OutputBufferSize:输出缓冲区大小(单位字节)
    • ReadAsyncMode:数据读取模式
    • BaudRate:波特率
    • Parity:校验位
    • StopBits:停止位
    • DataBits :数据位
    • Terminator:触发中断的字符(一般是换行符)
    • FlowControl:流控
    • timeout:一次操作超时时间
    • BytesAvailableFcnMode:设置数据读入格式
    • BytesAvailableFcnCount:触发中断的数据数量
    • BytesAvailableFcn:串口接收中断回调函数
      常用设置如下:
    scom.InputBufferSize = 512;
    scom.OutputBufferSize = 512;
    scom.ReadAsyncMode = 'continuous';
    scom.BaudRate = 115200;
    scom.Parity = 'none';
    scom.StopBits = 1;
    scom.DataBits = 8;
    scom.Terminator = 'CR';
    scom.FlowControl = 'none';
    scom.timeout = 1;
    scom.BytesAvailableFcnMode = 'byte';
    scom.BytesAvailableFcnCount = 1024;
    scom.BytesAvailableFcn = @callback;
    

    5.1.2 打开串口

    打开串口的API为:

    fopen(scom);
    

    打开串口可能会发生异常,所以此函数建议放在try..catch..end中执行:

    try
        fopen(scom);
    catch
        <捕获到异常时需要打印或者显示的信息>
    end
    

    5.1.3 写入数据

    向串口写入数据的API有两个:

    fwrite(scom,A); % 以二进制形式向串口对象写入数据A
    fprintf(scom,str); %以字符(ASCII码)形式向串口写数据str(字符或字符串)
    

    如果BytesAvailableFcnMode设置的为byte,则使用 fwrite

    5.1.4 读取数据

    从串口读取数据的API也有两个:

    A = fread(scom,size); %从串口对象中读取size字节长短的二进制数据,以数组形式存于A
    str = fscanf(scom); %从串口对象中读取字符或字符串(ASCII码)形式数据,以字符数组形式存于str
    

    如果BytesAvailableFcnMode设置的为byte,则使用 fread

    5.1.5 关闭串口

    在不使用串口或者关闭界面之前,必须要关闭串口,否则下次将无法打开该串口:

    close(scom)
    

    5.2 串口中断

    上面讲述了使用fread手动读取数据的方式,但是实际应用中,需要使用串口中断自动接收并处理数据。

    5.2.1 触发中断的条件

    触发串口Bytes available事件有两种条件:

    • 当接收到的字符数达到指定的数目时(BytesAvailableFcnCount 属性);
    • 当接收到指定字符时(Terminator 属性);

    5.2.2 串口中断处理回调函数

    在上一节设置属性的最后有这样一行代码:

    scom.BytesAvailableFcn = @callback;
    

    这行代码就是设置串口中断处理回调函数,如果是纯m文件可以这样设置,但是在GUI界面中还要传入handles调用控件,如下:

    scom.BytesAvailableFcn = {@calllback,handles};
    

    这里我设置的函数名为callbcak,回调函数自己实现即可:

    function callback(s,event,handles)
    
    展开全文
  • 使用上位机编程、汇编及传送程序 使用SCB—I单片单板机,可以由上位机进行编程和汇编,并通过串行口将目标程序下载到单板机执行。 1) 上位机的SCB—I系统软件: 序号 文件名 说 明 序号 文件名 说 明 1 MAINC.EXE ...

    SCB-1单板机的基本操作

    1.          键盘操作

    SCB-1单板机键盘参见附录三.键盘操作参见附录五。

    1)状态设置键  MON   与  USE

    监控系统采用设置待命状态的方法实现一键两用。

    按  MON  键进入待命状态0,显示器提示符为“P”,这时各功能键执行第一功能;按 USE  键进入待命状态1,显示器提示符为“P.”,这时各功能键执行第二功能。系统复位时自动进入待命状态0,显示 “CPU—51” 。按这两个键可以退出当前的键功能,返回相应的待命状态。

    2)数字键  0 ~F

    数字键用于输入地址、数据或修改指令机器码。输入的数字立即在显示器上显示,左四位是地址,右两位是指令或数据。

    3)检查命令键  EXA

    第一功能:进入存储器检查功能,检查外部存储器(含I/O端口)或内部存储器的内容。

    第二功能:E2PROM写入。

    4)写入命令键  WRI

    第一功能:在输入或修改存储器内容时确认数据写入。

    第二功能:与上位机进行串行通信的数据发送命令。

    5)倒后检查/串行接收命令键  RDS

    第一功能:由  EXA  命令进入检查功能后, RDS  用于地址减一的检查。

    第二功能:进入串行通信的等待接收状态,用于从上位机接收程序或数据。

    6)传送地址设定键  [F]

    为数据块传送(或E2PROM编程)设定源块首、末地址与目标块首地址。输入操作顺序是:

    [源块首地址]  [F]  [源块尾地址]  [F]  [目标块首地址]  MOV

    7)块传送命令键  MOV

    第一功能:数据块传送。

    第一功能:E2PROM编程。

    8)执行程序命令键  EXE

    第一功能:从指定地址开始连续执行程序。

    第二功能:单步执行程序。用单步功能须先将S2左边两针短接。

    2.使用上位机编程、汇编及传送程序

    使用SCB—I单片单板机,可以由上位机进行编程和汇编,并通过串行口将目标程序下载到单板机执行。

    1) 上位机的SCB—I系统软件:

    序号

    文件名

    说    明

    序号

    文件名

    说    明

    1

    MAINC.EXE

    SCB系统主程序

    6

    COMMUN.EXE

    COM1通信发送程序

    2

    EDLIN.COM

    DOS行编辑

    7

    COMMUN2.EXE

    COM2通信发送程序

    3

    QE.EXE

    全屏文本编辑

    8

    RECOMM.EXE

    COM1通信接收程序

    4

    MCS51.EXE

    51汇编程序

    9

    RECOMM2.EXE

    COM2通信接收程序

    5

    MU.EXE

    51反汇编程序

    10

    SCB_I.ASM

    SCB-1监控源程序

    2) 开机操作

    接通单板机电源,LED显示“CPU-51”,表示单板机工作正常。

    接通PC机电源,在DOS状态下进入C:\SCB\ 子目录,运行MAINC.EXE程序,就可以进入SCB-1主菜单。

    3) SCB-1主菜单

    1

    Edit   File.

    编辑源程序

    2

    MCS-51  Assembler.

    程序汇编

    3

    MCS-51  Disassembler.

    程序反汇编

    4

    Communication.

    向SCB-1下载目标程序

    5

    Recomm.

    接收SCB-1送来的数据

    6

    Return to DOS.

    返回DOS

    选择菜单项并根据提示操作。

    4) 在DOS提示符下直接操作

    在熟悉菜单操作后,可以在DOS提示符下直接运行相关的程序,或通过批处理文件进行操作。例如,

    ê      程序汇编:

    使用批处理命令ASM.BAT。如源程序为TEST.ASM,只需键入:

    C:\SCB>ASM  TEST    (切不可加扩展名)

    ê      编辑源程序或浏览列表文件    C:\SCB>QE  文件名

    ê      向SCB-1下载目标程序        C:\SCB>COMMUN

    屏幕提示“INPUT FILENAME:”,如目标程序为TEST.OBJ,在设置单板机进入接收等待后,输入  驱动器名:TEST.OBJ

    展开全文
  • 默纳克电梯上位机

    2018-05-24 12:44:57
    默纳克系统电梯PC端调试系统,包括故障代码查询,电梯参数修改等
  • 上位机开发介绍

    千次阅读 2019-10-22 13:22:15
    1、 上位机介绍  上位机是指可以直接发出操控命令的计算机,一般是PC,通常用于屏幕上显示各种信号变化(液压,水位,温度等),并将这些数据存储下来,供分析。  下位机是直接控制设备,获取设备状况的计算机,...

    1、 上位机介绍

     上位机是指可以直接发出操控命令的计算机,一般是PC,通常用于屏幕上显示各种信号变化(液压,水位,温度等),并将这些数据存储下来,供分析。
     下位机是直接控制设备,获取设备状况的计算机,一般是PLC(Programmable Logic Controller)/单片机(考虑一块板子上单片机与传感器的关系)。
     

    2、 与下位机交互

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

    3、应用实例

     下面举个上下位机应用的实例场景。我们现在有个房间,我们需要实时监测这个房间的环境状态,主要是监测房间的温度、湿度,让它们维持在一定的值左右,过高过低都不行。
     
     传统情况下,我们会在房间里装上温湿度计,然后派个工作人员,定期的去查看房间内温湿度计的值,针对过高过低的情况,采取一些措施。那么这种情况,有些不足,一是需要人定时去看,很麻烦,二是实时性非常差,很有可能环境的状态已经异常了,这个时候工作人员不在场,导致不能及时地采取措施调整环境而引发意外。
     
     若我们使用一套自动化的环境监测设备,那么我们可以在房间中,装上电子远传式的温湿度计(下位机),将温湿度计的状态实时远传到监测系统(上位机)。工作人员只需要坐在电脑前,查看远传而来房间状态,若出现异常,可以通过上位机控制室内处理异常的设备(如温度过高,远程开空调),就可以不到现场便能处理异常。甚至如果设备系统更加自动化,上位机本身便可以根据通过下位机发来的数据是否正常,而做出一些操作,都不需要人来操作。
     
     当然,实际环境可能会有所差异,举这个土味的例子只是为了形象地介绍上、下位机。
     

    4、两者关系

     看到这边你会发现上位机的存在实际上是依赖下位机的(需要硬件支撑)。如果没有下位机,上位机就没有数据来源,没有任何作用。而没有上位机,对下位机来说没有太大影响,下位机可以在自身的程序中添加一定自动化的功能,很多时候不需要上位机也行。
     
     但实际上大多数情况上下位机是相辅相成的,一个合理有效的上位机可以节省大量人力物力。甚至很多情况下,如恶劣的环境、复杂的环境监测、精密的设备控制,上位机是必不可少的。
     
     总的来讲,上位机对下位机的操作大类上只有两种,读&写。改变下位机状态,操控下位机,都是写操作。获取设备数据便是读操作。两者的基本关联非常简单。因此,或许你会认为上位机是技术含量较低的程序。其实不然,凭我个人理解,下位机的代码逻辑通常较单一,但是下位机种类非常多变,每种设备上的外设都不大一样。而上位机,通常运行的环境是比较单一的,但是要与多种下位机通信,还会涉及到UI,存储,复杂点的还有数据分析,庞大的上位机程序代码逻辑还是挺复杂的,涉及的技术也广。一个优秀的上位机复用性非常强,对相近设备的操控,仅仅需要修改协议即可。
     

    5、开发工具

     上位机开发通常使用c++(Qt、mfc)、c#(.net)、vb。其中就目前的情况来看,Qt和.net应该是目前应用相对比较广的。vb和mfc都是比较老旧的工具,做的界面也比较有年代感。其中,新版本的Qt还支持用Python来编写,制作的上位机程序也是不错的。其他,一些组态软件是专门做上位机软件的,像组态王、力控,相当于是二次开发,门槛较低一些,操作也比较简单,但是拓展性差。

    展开全文
  • Vc编写上位机

    2011-10-10 12:21:31
    Vc串口通信在当今越来越多的发挥其作用,学好Vc串口通信的作用也不言而喻。
  • 上位机与下位机之间的连接》由会员分享,可在线阅读,更多相关《上位机与下位机之间的连接(8页珍藏版)》请在人人文库网上搜索。1、第一章 上位机与下位机1.1 上位机与下位机的概念上位机和下位机,一般是指集中...
  • c#上位机开发(三)——串口通信上位机开发1

    千次阅读 多人点赞 2019-08-21 16:57:43
    今天主要做一个跟市面上差不多的稍微简单点的上位机软件,效果如下图所示 1.功能概述 (1)端口扫描,主要是扫描出可用的端口用来连接 (2)波特率的选择,使用一个下拉框进行选择相应的波特率数值 (3)发送...
  • python开发之HighGUI上位机开发文章首发:python开发之HighGUI上位机开发(一)_ywsydwsbn的博客-CSDN博客​blog.csdn.net作者:ywsydwsbn字数:5702时间:2020-8-24 16:56简介:先点赞在看,养成习惯!!!HighGUI...
  • 串口通讯具有简单易用的特点广泛应用于测试设备的通讯和数据传递、单片机与计算机的通讯等,本案例基于Python语言制作一个用于接收燃油质量流量计的串口通讯上位机,实现数据的读取和保存。1. 相关知识点:1.1 ...
  • 0 引言  上位机设计是智能家居系统的一个重要组成部分,担负着管理、控制、维护和用户界面操作的重任,高效可靠的上位机设计是整个系统正常... 首先,必须认识计算机在智能家居系统的作用,可以概括为以下几个方面:
  • 用LabVIEW编写上位机

    万次阅读 多人点赞 2015-04-01 14:40:37
    用LabVIEW编写上位机1、下载、安装LabVIEW现在网上搜,能搜出来一大推LabVIEW下载和安装以及破解教程,因此这里不做详细介绍。请自行百度~~。另外,提醒一下,下载LabVIEW时尽量下载那种带注册机,因为如果不对...
  • 目录(哈喽,上位机

    千次阅读 多人点赞 2020-02-09 17:47:23
    1.1-什么是上位机,什么是下位机? 1.2-上位机开发应该选择哪个编程语言? 1.3-上位机开发应该选择哪个开发平台? 1.4-什么是面向过程设计,什么是面向对象设计 二、通信 2.1-串口通信编程 2.2-串口小助手开发 2.3-...
  • 上位机控制相关

    2019-07-24 11:27:26
    //定义covariance协方差矩阵,作用为解决文职和速度的不同测量的不确定性 float covariance[36] = {0.01, 0, 0, 0, 0, 0, // covariance on gps_x 0, 0.01, 0, 0, 0, 0, // covariance on gps_y 0, 0, 99999, 0, 0...
  • 上位机在智能车调试中起着重要作用,尤其是通过无线串口,实现数据实时收发接收,极大地方便了智能车调试。现以VC6.0为平台使用MFC,简单介绍串口上位机设计
  • QT5串口编程——编写简单的上位机 https://blog.csdn.net/u014695839/article/details/50611549 首先,QT5是自带QSerialPort这个类的,使用时需要在pro文件里面添加一行: QT += serialport 然后直接引用头文件就...
  • QT5串口编程——编写简单的上位机

    万次阅读 多人点赞 2016-01-30 15:51:48
    最近在学习嵌入式,而上位机又是一个不可缺少的工具,于是就开始接触QT,学习编写上位机。刚开始的时候什么都不懂,发现《Qt 学习之路 2》有比较好的入门教程。学习了前面部分,对QT有了大概的了解后,就开始在网上...
  • 这是我很久之前写串口通信程序时编的,网上这写资料很少,我是看着MATLAB的帮助文档自己一点点写的,虽然最后放弃了matlab上位机程序的方案,但是还是整理了一下之前的一些收获,写下以下的说明。编译环境:MATLAB ...
  • ANO_TC匿名上位机
  • 请问下位机通过串口线连接的上位机,是怎么和上位机进行日期的同步的,下位机是否有能力自己获取日期而不依赖上位机
  • 0 引言  上位机设计是智能家居系统的一个重要组成部分,担负着管理、控制、维护和用户界面操作的重任,高效可靠的上位机设计是整个系统正常... 首先,必须认识计算机在智能家居系统的作用,可以概括为以下几个方面
  • electron-vue编写上位机

    2020-10-27 16:10:51
    启动框架 npm install -g vue-cli vue init simulatedgreg/electron-vue ele-vue cd myapp npm ...vuex dipatch不起作用 参考 https://zhuanlan.zhihu.com/p/66244402 解决,我用的是方法一,方法二没有效果 未完待续
  • Ubuntu+Python环境做上位机

    千次阅读 2018-11-27 16:57:17
    最近需要制作程控电阻箱的上位机,使得大学毕业后就不再接触硬件的我无从下手.拿到机器后不知道怎么与其进行通信,Google上的资料也很少,现将我的环境搭建过程记录下来,希望对和我一样的小白有所帮助. 软件环境: ...
  • 因项目需求,于是开发了一个如下简陋功能的上位机: stm32单片机的温度和距离数据通过串口传输到上位机上位机读取数据后显示在面板并同时将数据写入数据库。 系统开发环境:WIN10 64位 ①首先搭建qt和数据库...
  • WiFi控制上位机软件

    千次阅读 2017-06-21 01:00:26
    using System;//引入核心命名空间,是一切类的基础 using System.Collections.Generic; using System.ComponentModel; using System.Data;...//语言集成查询(LINQ)是.net3.5以后推出的API,主要作用是对集合进行
  • 匿名上位机使用方法分享--波形显示

    万次阅读 2018-11-03 14:26:33
    波形显示可以说是上位机的功能重点,是各种调试、数据分析的有力助手,下面对匿名上位机的波形显示功能做一个详细使用介绍。 主界面: 主界面左侧为功能区,顶部有功能按钮,稍后做详细说明。中间部分为波形名称...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,056
精华内容 1,622
关键字:

上位机作用