皮皮网
皮皮网

【thinks源码分析】【疫情管理源码】【flutte魔塔源码】串口工具源码_串口工具源码是什么

时间:2024-11-15 15:08:10 来源:工人接单源码

1.免费串口调试助手 开源 C#
2.为什么我写的串口串口串口接收程序会一直接道数据呢
3.Qt实现串口通信
4.Qt编写Modbus从机程序

串口工具源码_串口工具源码是什么

免费串口调试助手 开源 C#

       工业控制类软件在Windows平台下,使用C#语言进行开发,工具工具既方便又快捷。源码源码在工控领域中,串口串口串口通讯是工具工具一种非常常见的需求。因此,源码源码thinks源码分析我花费时间开发了一个通用的串口串口串口调试助手工具,并将工控调试中常用的工具工具功能集成在上面,以方便用户进行调试。源码源码源码已经在gitee上开源,串口串口界面采用wpf实现,工具工具源码地址为:

       接下来,源码源码我将简单介绍一下已实现的串口串口功能。

       程序功能主要分为以下四大块:

       1. 串口通讯

       2. TCP通讯

       3. 小工具

       4. 支持中英文双语切换

       5. 检查版本更新

       6. 曲线显示读取的工具工具值。

       一、源码源码串口通讯

       串口通讯详细功能:

       1. 支持手动刷新串口设备列表。疫情管理源码

       2. 支持流控。

       3. 接收发送编码方式同时支持ASCII和HEX方式。

       4. 在ASCII模式下,可设置结束符,如回车换行等。

       5. 在HEX模式下,支持自动计算标准ModbusRTU的CRC。

       6. 发送支持循环发送。

       7. 接收区显示支持显示发送和显示接收,并可设置发送和接收的字符串颜色。

       8. 接收区显示支持显示发送和接收的时间,时间格式可自定义。

       9. 底部显示串口状态,总接收字节数和总发送字节数。各字节数可手动清零。flutte魔塔源码

       . 接收区字符串可一键清空。

       . 记录发送历史,支持记录最新的条历史记录。

       . 可将接收区显示的字符实时保存到本地txt文档。

       . 可将读取到的值以实时曲线的形式显示出来。

       二、TCP通讯

       TCP通讯详细功能:

       1. 支持TCP Client/TCP Server。

       2. 在TCP Server模式下,可显示当前连接客户端列表。

       3. TCP通讯采取异步方式通讯。

       4. 支持串口通讯功能中的3-项。

       5. 不支持TCP连接断开的自动侦测。

       三、小工具

       包含的小工具介绍:

       1. 通用校验方法中包含常用的LRC、XOR、企业官方源码CheckSum、FCS、Modbus-CRC等校验的计算。

       2. 数据转换包含整数和小数与进制HEX的转换。

       3. 与base互转。

       4. 数据采集中常用的模拟量与工程量转换计算。

       5. ASCII码表。

       6. C#颜色对照表。

       7. 拾取屏幕颜色。该功能使用鼠标hook实现。通过hook技术可实现拦截或修改键盘鼠标等的操作,有这方面需求的可参考。

       四、检查更新

       1. 检查更新方式:

       利用gitee作为更新检查的服务器,将版本号和下载连接写在gitee项目文件中,砍价add源码实现自动检查更新并提供下载连接的功能。

       五、相关开源项目

       1. 跨平台(Linux/Windows)串口通讯源码开源连接:

       xuyuanbao/BaoYuanSerial: A GUI Serial Debug Tool for Linux/Microsoft Window (github.com)

为什么我写的串口接收程序会一直接道数据呢

       以下是一段 我自己用的接收处理代码其中的sp是已经声明好的SERIPORT。

       sp.DataReceived = new SerialDataReceivedEventHandler(sp_DataReceived);

       //接收串口数据字符串

        string watcher = null,send=null;

        //串口数据接收事件

        void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)

        {

        watcher = sp.ReadExisting();//这句就是接收内容代码,如果只需要接收后面就都不需要了。

        {

        if (watcher.Length % 8 == 0)

        {

        send = watcher;

        switch (watcher)

        {

        case "I(,1)":

        //dt1.Tag = "0";

        if(dt1.Tag=="0")

        {

        sign = "d_*_auto";

        dt1.IsEnabled = true;

        dt_streamwrite.IsEnabled = true;

        }

        //sign = "d_*_auto";

        //dt1.IsEnabled = true;

        break;

        case "I(,0)":

        sign = "d_*_auto";

        sp.WriteLine("O(,,0)");

        dt_streamwrite.IsEnabled = true;

        dt1.IsEnabled = false;

        break;

        case "I(,1)":

        //dt2.Tag = "0";

        if (dt2.Tag == "0")

        {

        sign = "d_*_auto";

        dt2.IsEnabled = true;

        dt_streamwrite.IsEnabled = true;

        }

        break;

        case "I(,0)":

        sign = "d_*_auto";

        sp.WriteLine("O(,,0)");

        dt2.IsEnabled = false;

        dt_streamwrite.IsEnabled = true;

        break;

        case "I(,1)":

        //dt3.Tag = "0";

        if (dt3.Tag == "0")

        {

        sign = "d_*_auto";

        dt3.IsEnabled = true;

        dt_streamwrite.IsEnabled = true;

        }

        break;

        case "I(,0)":

        sign = "d_*_auto";

        sp.WriteLine("O(,,0)");

        dt3.IsEnabled = false;

        dt_streamwrite.IsEnabled = true;

        break;

        case "I(,1)":

        //dt4.Tag = "0";

        if (dt4.Tag == "0")

        {

        sign = "d_*_auto";

        dt4.IsEnabled = true;

        dt_streamwrite.IsEnabled = true;

        }

        break;

        case "I(,0)":

        sign = "d_*_auto";

        sp.WriteLine("O(,,0)");

        dt4.IsEnabled = false;

        dt_streamwrite.IsEnabled = true;

        break;

        case "I(,1)":

        //dt5.Tag = "0";

        if (dt5.Tag == "0")

        {

        sign = "d_*_auto";

        dt5.IsEnabled = true;

        dt_streamwrite.IsEnabled = true;

        }

        break;

        case "I(,0)":

        sign = "d_*_auto";

        sp.WriteLine("O(,,0)");

        dt5.IsEnabled = false;

        dt_streamwrite.IsEnabled = true;

        break;

        case "I(,1)":

        sign = "d_*_auto";

        dt1.Tag = "1";

        dt1.IsEnabled = false;

        dt_streamwrite.IsEnabled = true;

        break;

        case "I(,0)":

        sign = "d_*_auto";

        dt1.Tag = "0";

        dt_streamwrite.IsEnabled = true;

        break;

        case "I(,1)":

        sign = "d_*_auto";

        dt2.IsEnabled = false;

        dt_streamwrite.IsEnabled = true;

        dt2.Tag = "1";

        break;

        case "I(,0)":

        sign = "d_*_auto";

        dt2.Tag = "0";

        dt_streamwrite.IsEnabled = true;

        break;

        case "I(,1)":

        sign = "d_*_auto";

        dt3.IsEnabled = false;

        dt_streamwrite.IsEnabled = true;

        dt3.Tag = "1";

        break;

        case "I(,0)":

        sign = "d_*_auto";

        dt3.Tag = "0";

        dt_streamwrite.IsEnabled = true;

        break;

        case "I(,1)":

        sign = "d_*_auto";

        ; dt_streamwrite.IsEnabled = true;

        dt4.IsEnabled = false;

        dt4.Tag = "1";

        break;

        case "I(,0)":

        sign = "d_*_auto";

        dt4.Tag = "0";

        dt_streamwrite.IsEnabled = true;

        break;

        case "I(,1)":

        sign = "d_*_auto";

        dt5.IsEnabled = false;

        dt_streamwrite.IsEnabled = true;

        dt5.Tag = "1";

        break;

        case "I(,0)":

        sign = "d_*_auto";

        dt5.Tag = "0";

        dt_streamwrite.IsEnabled = true;

        break;

        }

        watcher = null;

        }

        }

        }

Qt实现串口通信

       为了在Qt中实现串口通信,首先需要理解相关的基本概念和操作步骤。

       串口通信涉及的关键参数包括波特率、校验位、数据位、停止位以及控制流。确保你明确了这些设置,它们将决定数据传输的速率和可靠性。

       具体操作上,涉及的主要步骤有:串口的初始化,包括打开和关闭串口、刷新设备状态以获取可用的串口、发送和接收数据,以及根据通信状态调整界面指示,例如通过LED灯来显示通信状态。当串口打开时,LED灯会显示绿色;关闭时,显示红色。

       在设计界面时,LED灯被设计为QLabel控件,宽度和高度均为像素。通过右键点击并选择“样式表”,可以添加相应的代码以控制其显示效果。

       以下是实现串口通信的源代码分步骤指导:

       在头文件中,引入QtSerialPort类相关的两个头文件是必须的。

       在工程文件中,添加必要的初始化代码。

       在头文件中,定义全局的串口对象,便于跨函数使用。

       设置参数,如在头文件中定义初始化参数的函数和变量,并在.cpp文件中实现这些函数。

       定期刷新串口,以确保数据更新和可用性。

       发送和接收数据是通信的核心,根据数据流进行相应的操作。

       控制串口的打开和关闭,状态改变时,相应地更新LED灯显示。

       下面是关键源码部分的示例:

       工程文件.pro:

       [在这里插入.pro文件代码]

       头文件源码:

       [在这里插入头文件代码]

       .cpp文件源码:

       [在这里插入.cpp文件代码]

       运行后,你可以看到串口通信的直观效果,LED灯会实时反映出通信状态。

Qt编写Modbus从机程序

       在之前的文章中,我们已经熟悉了如何使用MODSCAN软件和串口助手处理Modbus协议。今天,我们将利用之前分享的Qt串口助手源码,开发一个Modbus从机程序,使其能够与MODSCAN进行数据交互。我们的目标是实现功能码0x读取保持寄存器和0x写入单个寄存器的功能。

       当主机发送0x功能码时,程序需要读取并回应从机特定寄存器的内容。例如,如果请求读取寄存器-,其内容分别为 2B(十进制)和 , (十进制0和)。

       功能码0x用于向从机写入单个寄存器。比如,我们可以将十六进制 写入寄存器2。在0x功能码下,可以写入多个寄存器,如 0A和 到从寄存器2开始的两个位置。

       在调试中,如果主从机的寄存器地址设置不一致,可能会出现错误的数据包,如MODSIM接收到的数据包 C5 C8与 C0 F1。当地址设置一致时,响应的包将正确反映寄存器内容。

       Qt编写的Modbus从机程序需要解析接收到的串口数据,根据功能码进行响应。比如,当主机修改地址2的寄存器值为0xFF时,程序会接收并返回确认报文。注意,Modbus从机通常不主动发送数据,而是等待主机查询。

       通过这个例子,我们已经展示了基于Qt的Modbus从机程序的基本运作。更多功能码的处理和自定义串口交互,大家可以在之前的文章基础上进行深入学习。欢迎关注嵌入式从0到1,持续分享嵌入式知识。

更多内容请点击【时尚】专栏