上位机模块之序列化与反序列化,二进制序列化

12 篇文章 0 订阅
本文介绍了如何在.NET中使用不可读序列化处理Halcon的Hobject和Htuple对象,如模板匹配模板文件和仿射变换矩阵,并展示了如何使用Newtonsoft.Json进行序列化和反序列化操作,以保存和读取模块文件。
摘要由CSDN通过智能技术生成

在常规的上位机编写中需要用到许多存储数据,存储对象的时候,我们存储数据的过程就是序列化,我们提取数据的过程就是反序列化。当然.net为我们提供了一个可读与不可读(二进制)的序列化方式,在这里我主要说明和记录不可读序列化形式。
在计算机中,任何数据的本质都是二进制编码的数据,所以我们在使用二进制序列化时可以将任意的数据进行序列化。其中尤为重要的是我们在halcon中的Hobject与Htuple对象同样可以被序列化。在halcon中自带的算子提供了许多序列化方式,当然都是针对某些特殊的形式,比如模板匹配的模板文件.shm或者仿射变换矩阵等。由于他们本质上都是二进制的数据,所以在使用.net的序列化时,我们可以将我们的模块文件(Halconhandle)进行序列化保存。
我们可以在网上直接下载Newtonsoft.Json的DLL文件即可,在项目中引用。
先上代码:

namespace ModuleInPack
{
    [Serializable]//将类标记为可序列化类
    public class Serialization
    {
        [Serializable]//将结构体标记为可序列化
        public struct MarkPoint
        {
            public Calibration calibration;//在访问结构体中的结构体时,需新建对象
            public Model model;
            [Serializable]//将结构体标记为可序列化
            public struct Calibration
            {
                public HTuple Calibration1 { get; set; }//被序列化的Htuple对象(标定的仿射变换矩阵)
                public double SpinCenterX { get; set; }
                public double SpinCenterY { get; set; }
            }
            [Serializable]
            public struct Model
            {
                public List<HTuple> ModelHandels { get; set; }//模板匹配的模板句柄
                public List<HObject> ModelMatchRoi1 { get; set; }//模板匹配的ROI框
            }
     }
}
//保存序列化文件
Serialization.MarkPoint Now_Mark = new Serialization.MarkPoint();
Now_Mark.model.ModelHandels= Model;//模板句柄
BinaryFormatter formatter = new BinaryFormatter();
//将序列化文件保存在指定路径中
using (var fs = new FileStream("Serialization\\1.ModuleInPack", FileMode.OpenOrCreate))
{
   //序列化到文件
   formatter.Serialize(fs, Now_Mark);
}
//反序列化文件
using (var fs = new FileStream("Serialization\\1.ModuleInPack", FileMode.OpenOrCreate))
{
       Now_Mark = (Serialization.MarkPoint)formatter.Deserialize(fs);
       Model=Now_Mark.model.ModelHandels;//读取序列化的halcon模型并赋值到变量中
}

序列化与反序列化的过程非常简单。序列化经常要用于保存各种各样的通用文件,使得上位机可以快捷的保存或者读取各类型的参数。

### 回答1: QT是一种GUI(图形用户界面)开发工具,在串口通信方面非常强大。QT提供了一些串口通信库和类,可以很方便地用来制作串口上位机。以下是在QT中制作串口上位机的基本步骤: 1.配置串口:QT可以通过QSerialPort类来配置串口,设置参数如波特率、数据位、停止位、校验位等,以达到和目标串口的通信。 2.打开串口:打开串口是进行通信的前提条件,需要使用open()函数打开串口。 3.发送数据:使用write()函数向串口发送数据,可以发送二进制数据或ASCII码数据。 4.接收数据:使用readyRead()函数来获取串口接收到的数据。如果需要实时接收数据,需要在槽函数中处理接收到的数据。 5.关闭串口:使用close()函数关闭串口。 在这个基本框架下,你可以自己定义需要实现的功能。例如实现字节发送、循环发送、数据展示等。QT还提供了很多基于串口通信的实际应用,例如控制机器人、自动化系统等。 ### 回答2: Qt是一款功能强大的跨平台GUI开发框架,它不仅可以开发图形化界面,还可以进行串口通信。如果想要制作串口上位机,可以通过以下步骤实现: 1. 打开Qt Creator,并新建一个Qt Widgets应用程序工程,命名为SerialPortUppercomputer。 2. 在工程树中添加一个按钮控件,用于发送数据给串口设备。 3. 在程序中通过Qt串口库进行串口通信的配置和读写操作。 4. 配置串口参数,例如串口号、波特率、数据位等。 5. 使用信号和槽机制来响应串口设备的数据,例如当数据到达串口时,自动读取并在上位机界面上显示出来。 6. 设计界面并添加交互控件,例如文本框控件用于显示串口设备的返回信息。 7. 编写程序逻辑,例如当用户点击发送按钮时,将数据发送到串口设备。 8. 测试程序,调试完善。 总结:使用Qt开发串口上位机可以快速完成串口通信功能的开发和优化,而且具有跨平台特性,可适用于多种操作系统和设备。在具体实现时需要考虑一些细节问题,例如串口参数的正确设置、数据的读写方式等,可以根据具体情况进行调整。 ### 回答3: Qt是一个跨平台的C++开发框架,同时也提供了强大的GUI界面设计功能和丰富的库函数。在Qt中,制作串口上位机非常容易,只需要引用Qt SerialPort模块,就能轻松地与串口进行通信。 下面是制作串口上位机的具体步骤: 1.创建Qt工程并选定SerialPort模块。在Qt Creator中新建Qt Widgets Application项目,选定SerialPort项目模板。 2.添加串口通信的参数设置。例如:波特率、停止位、数据位、校验位等。 3.编写串口通信的代码。qt中使用QSerialPort类进行串口通信。首先需要调用QSerialPort构造函数创建串口对象,然后使用setPortName()函数、setBaudRate()函数等设置串口参数,调用open()函数打开串口,调用write()函数向串口发送数据,调用read()函数读取串口数据。 4.设计上位机界面。在Qt Creator的设计器中,拖拽需要的控件,如按钮、文本框等,布局好后,使用信号槽机制,将按钮点击和串口通信的代码连接起来,实现通信的启动、关闭和数据的显示等功能。 5.编译运行。使用Qt Creator对工程进行编译,生成可执行文件和动态链接库。然后可以进行运行和测试,观察串口数据是否正确地被获取和显示。 总之,使用Qt制作串口上位机相对简单,只需要具备一定的C++编程能力和序列通信的基本知识,就可以轻松实现自己的上位机应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值