【短信计划源码】【环境gis系统源码】【接口测试平台源码】串口工具源码_串口工具源码是什么

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

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

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

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

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

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

       1. 串口通讯

       2. TCP通讯

       3. 小工具

       4. 支持中英文双语切换

       5. 检查版本更新

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

       一、源码源码串口通讯

       串口通讯详细功能:

       1. 支持手动刷新串口设备列表。环境gis系统源码

       2. 支持流控。

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

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

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

       6. 发送支持循环发送。

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

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

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

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

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

       . 可将接收区显示的字符实时保存到本地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项目文件中,yum下载openssl源码实现自动检查更新并提供下载连接的功能。

       五、相关开源项目

       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,持续分享嵌入式知识。

更多内容请点击【知识】专栏

精彩资讯