King_Tool多功能调试助手

目录

V1.0.0:基础功能

1. 串口通信功能

2. 波形示波器显示

3. ModBus Poll

4. TCP/UDP网络通信

V1.1.0:细节优化1

V1.2.0: 细节优化2

V1.2.1: 软件在线更新

V1.2.2: 波形绘制优化

V1.2.3: 波形绘制优化2

V1.2.4: 细节优化3

V1.2.5: 功能新增

5. MQTT Client

6. 文件发送

7. 软件兼容性修改

END


King_Tool多功能软件调试助手,现更新为V1.2.5,下载地址:King_Tool v1.2.5.zip - 蓝奏云

        前言:最近在做软件开发的过程中,因为一些特定的环境需要用到串口助手的一些功能,并且想要增加波形调试,于是心血来潮想着做一款自己的串口调试助手,接着在后续完善和优化实现的过程中又陆续增加了其他的一些功能,最终多功能调试助手成品见下图。(后续会随着使用需求继续优化......)

King_Tool 多功能调试助手 v1.2.5

V1.0.0:基础功能

1. 串口通信功能


 - 支持软件置顶显示
 - 支持接收区暂停显示
 - 支持接收区打开/关闭自动滚屏
 - 接收区以不同颜色区分不同消息类型

- 支持鼠标悬停侧边栏收缩UI
 - 接收区最大支持500条消息,大于500条会自动清空
 - 支持软件一键主题换肤
 - 支持热插拔识别串口
 - 预设常见波特率、支持手动输入自定义的任意波特率
 - 支持数据位5、6、7、8
 - 支持停止位1、1.5、2
 - 支持校验位None、Odd、Even
 - 支持流控None、Hard、Soft
 - 支持Ascii、16进制发送和Ascii、16进制接收
 - 支持发送回车换行
 - 支持发送完毕自动清空
 - 支持定时发送
 - 支持多条发送,提供10条数据发送
 - 支持勾选依次定时自动发送
 - 支持定时保存接收区数据

2. 波形示波器显示


 - 支持波形保存为图片 
 - 支持波形数据点、范围、波特率无限制
 - 支持使用鼠标可进行缩放
 - 支持指定缩放X轴或Y轴,需要先选中该轴
 - 支持鼠标悬停波形上可显示当前数据点坐标值
 - 支持上位机修改通道名称,双击图例通道名称即可  
 - 支持上位机自定义协议("协议配置")  
 - 默认协议如下:"A5A5ch1,ch2,1.2 2.5 5A5A"  

 支持上位机自定义协议,点击按钮 协议配置 进入自定义协议配置界面,见下图

帧协议选择

        注:上图中帧头和帧尾的数据本质上为ASCII字符"A5A5"和"5A5A",实际帧数据中没有空格。图中ASCII字符中间的空格是为了方便辨认字节个数;还有一个原因是之前想要实现的帧数据的Hex解析,但后面废弃了。

因此,帧头和帧尾数据中只能输入Hex格式,非Hex格式是无法输入的,用户注意。

由上图可知,软件的默认波形协议解析格式为:"A5A5ch1,ch2,1.2 2.5 5A5A",其中:
帧头                            <--------------------------->     "A5A5"
波形通道名称              <--------------------------->     "ch1"、"ch2"
波形通道名称分隔符   <--------------------------->     ","(逗号)
波形通道数据              <--------------------------->     "1.2"、"2.5"
波形通道数据分隔符   <--------------------------->     " "(空格)
帧尾                            <--------------------------->     "5A5A"

此外也支持极简协议解析,即不需要通道名称的设定,由上位机自动分配,极简协议如下:

"A5A51.2 2.5 5A5A"

  • 其中下位机部分的C语言数据帧驱动示例代码如下:(当然您也可以尝试优化下面的驱动代码,欢迎共同探讨)

        首先需要定义一个结构体用于保存帧数据内容,结构体声明如下:

typedef struct {
    unsigned char channel_num;    // 通道数
    char          *head;          // 帧头
    char          *tail;          // 帧尾
    char          *name_split;    // 通道名称分隔符
    char          *data_split;    // 通道数据分隔符
} struct_frame_typedef;

驱动源代码如下:

// 需要引用的头文件
#include "usart.h"
#include "string.h"

// 示例代码使用的sin和cos模拟数据 所以包含了该头文件
#include "math.h"

typedef struct {
    unsigned char channel_num;    // 通道数
    char          *head;          // 帧头
    char          *tail;          // 帧尾
    char          *name_split;    // 通道名称分隔符
    char          *data_split;    // 通道数据分隔符
} struct_frame_typedef;

void frameData_send(void)
{
    // 实例化 帧结构体
    struct_frame_typedef frame;
    // 定义需要发送的帧数据缓存 若数据量过大 可适当加大缓存容量
    char frame_data[60];
    // 定义通道名称和通道数据缓存 若数据量过大 可适当加大缓存容量
    char str_channel_name[30], str_channel_data[30];
    // 定义通道名称指针数组 储存通道名称参数
    char *channel_name[frame.channel_num];
    // 定义通道数据二维数组 储存通道数据参数
    // 注意:不能使用指针数组 会导致使用sprintf函数时函数卡死(动态内存未分配)
    char channel_data[frame.channel_num][10];
    static uint8_t k = 0;
    
    frame.head = "A5A5";    // 定义帧头
    frame.tail = "5A5A";    // 定义帧尾
    frame.name_split = ","; // 定义通道名称分隔符
    frame.data_split = " "; // 定义通道数据分隔符
    frame.channel_num = 2;  // 定义通道数
    
    memset(frame_data,   0, sizeof(frame_data));
    memset(channel_name, 0, sizeof(channel_name));
    memset(channel_data, 0, sizeof(channel_data));
    memset(str_channel_name, 0, sizeof(str_channel_name));
    memset(str_channel_data, 0, sizeof(str_channel_data));
    
    /* 1.写需要发送的通道名称 */
    channel_name[0] = "sin";
    channel_name[1] = "cos";
    /* 2.通过字符串拼接函数完成通道名称的数据拼接 */
    for(uint8_t i=0; i<frame.channel_num; i++) {
        strcat(str_channel_name, channel_name[i]);
        strcat(str_channel_name, frame.name_split);
    }
    /* 3.写需要发送的通道数据 */
    sprintf(channel_data[0], "%.2f", 256 * sin(k));
    sprintf(channel_data[1], "%.2f", 1 * cos(k));
    (k<255) ? (k ++) : (k=0);
    /* 4.通过字符串拼接函数完成通道数据的数据拼接 */
    for(int i=0; i<frame.channel_num; i++) {
        strcat(str_channel_data, channel_data[i]);
        strcat(str_channel_data, frame.data_split);
    }
    /* 5.发送协议帧数据 */
    sprintf(frame_data, "%s%s%s%s", frame.head, str_channel_name, str_channel_data, frame.tail);
    USART_SendNByte(USART1, (uint8_t*)frame_data, sizeof(frame_data));
}

        上述代码注意使用二级优化(-o2),若使用0级优化会导致代码不能正常运行。

        这是由于strcat函数的源码造成的,strcat源码如下:

char *strcat(char *dest, const char *src)  
{  
    char *tmp = dest;  
    while (*dest) dest++;  
    while ((*dest++ = *src++) != '/0');  
    return tmp;  
} 

        具体原因如下:strcat在调用时,先会移动目标字符串的指针到其尾部,再进行复制。这种做法对于下标比较大的数组重复调用时,效率比较低。即当第一次调用strcat时,指针由0数到100,只不过复制了几个字符,第二次调用strcat时,指针又从0数到108,无论调用多少次,指针总是从0数起,会十分浪费系统资源。

        当然大家也可以下载我的测试代码:STM32F103C8T6.zip - 蓝奏云

 - 支持极简协议,此种协议下通道名称由上位机自动分配,极简协议如下:"A5A51.2 2.5 5A5A"  

3. ModBus Poll


 - 目前仅支持ModBus主机模式下数据读取,读者可以使用ModBus Slave开发工具进行ModBus的数据测试,软件下载地址:ModbusSlaveSetup64Bit.zip - 蓝奏云
 - 支持多种数据读取协议(ASCII、RTU、TCP)
 - 支持多种数据读取显示格式
 - 支持读取数据的大小端转换
 - 支持数据表格横向显示及扩展

ModBus测试数据表格显示

4. TCP/UDP网络通信


 - 支持TCP、UDP通信协议

TCP/UDP网络通信


 - 支持TCP、UDP服务端一对一、一对多发送
 - 支持TCP客户端自动重连服务端
 - 增加连接超时、连接异常等错误标识

V1.1.0:细节优化1

- 更新软件标题为楷体

- 更新支持任意边角缩放

- 更新切换为网络配置时,状态栏同步显示网络IP+端口

V1.2.0: 细节优化2

- 更新支持软件窗体记忆,下次打开为上次定义的窗体大小

- 更新接收区最大同步支持2000条数据

V1.2.1: 软件在线更新

- 更新支持软件在线检测更新和下载

- 支持键盘按下 Enter 快捷发送数据

V1.2.2: 波形绘制优化

- 更新波形为贝塞尔平滑曲线,绘制的波形更加平滑、美观

波形绘制

- 更新鼠标左键可选中波形进行框选放大,鼠标右键可拖动波形

框选波形放大

- 修复bug: 取消置顶显示后出现两个关闭栏

V1.2.3: 波形绘制优化2

- 优化波形解析绘制的流畅度,提升了部分性能

- 移除部分UI主题,如有UI美化界面的构思可联系作者

- 修复bug:波形按钮的功能不够协调

V1.2.4: 细节优化3

- 优化软件整体布局,并移除了其他UI主题,采用默认UI主题配色

- 状态栏右侧新增 每日微语 接口,鼠标左键单击即可更新微语(大于30字微语默认不更新)

每日微语 接口

V1.2.5: 功能新增

5. MQTT Client

- 新增MQTT Client功能,可实现部分物联平台的数据收发测试,暂时支持巴法云平台

巴法云物联平台

6. 文件发送

- 新增文件发送功能,可方便快捷发送多个文件数据,支持串口发送和TCP Socket发送

文件发送

7. 软件兼容性修改

        可能第一次打开会出现显示很鸡肋的情况,只需要修改一下使之适配您电脑的分辨率即可。具体解决办法如下:

1. 找到软件,鼠标右键点击属性,见下图。

右键属性

2. 找到 兼容性 选项卡,选择 更改所有用户的设置  并进入对应的配置界面。

兼容性 -> 更改所有用户的设置

3. 选择 更改高DPI设置 选项卡,进入其配置界面。

更改高DPI设置

4. 进入该界面后勾选 替代高DPI缩放行为 ,并点击下拉框选择 系统 选项卡,见下图。 

勾选替代高DPI缩放行为 -> 系统

5. 接着一路点击 确定 返回即可,重新打开软件就会发现与自己的电脑进行适配了。

6.若需软件源码请访问邮箱,后续会上传到GitHub,敬请期待。

        项目Github地址:https://github.com/JJKING12/King_serial,大家如果觉得还不错的话,麻烦给我点个Stars,谢谢~

END

  • 23
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值