目录
King_Tool多功能软件调试助手,现更新为V1.2.5,下载地址:King_Tool v1.2.5.zip - 蓝奏云
前言:最近在做软件开发的过程中,因为一些特定的环境需要用到串口助手的一些功能,并且想要增加波形调试,于是心血来潮想着做一款自己的串口调试助手,接着在后续完善和优化实现的过程中又陆续增加了其他的一些功能,最终多功能调试助手成品见下图。(后续会随着使用需求继续优化......)
![](https://img-blog.csdnimg.cn/direct/9d1aa233d7a1400d829afeac6d040a44.png)
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"
支持上位机自定义协议,点击按钮 协议配置 进入自定义协议配置界面,见下图
![](https://img-blog.csdnimg.cn/7d2616de504949ddaef9c1bcbe762b30.png)
注:上图中帧头和帧尾的数据本质上为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)
- 支持多种数据读取显示格式
- 支持读取数据的大小端转换
- 支持数据表格横向显示及扩展
![](https://img-blog.csdnimg.cn/49af9691bca14889826380547458eae3.png)
4. TCP/UDP网络通信
- 支持TCP、UDP通信协议
![](https://img-blog.csdnimg.cn/direct/75f83e9db5754686ae6a0df298427717.png)
- 支持TCP、UDP服务端一对一、一对多发送
- 支持TCP客户端自动重连服务端
- 增加连接超时、连接异常等错误标识
V1.1.0:细节优化1
- 更新软件标题为楷体
- 更新支持任意边角缩放
- 更新切换为网络配置时,状态栏同步显示网络IP+端口
V1.2.0: 细节优化2
- 更新支持软件窗体记忆,下次打开为上次定义的窗体大小
- 更新接收区最大同步支持2000条数据
V1.2.1: 软件在线更新
- 更新支持软件在线检测更新和下载
- 支持键盘按下 Enter 快捷发送数据
V1.2.2: 波形绘制优化
- 更新波形为贝塞尔平滑曲线,绘制的波形更加平滑、美观
![](https://img-blog.csdnimg.cn/direct/1820eb8af2e74fff92d829d41c4c84ee.png)
- 更新鼠标左键可选中波形进行框选放大,鼠标右键可拖动波形
![](https://img-blog.csdnimg.cn/direct/7e5d3b7a103f4725aead52569510538d.png)
- 修复bug: 取消置顶显示后出现两个关闭栏
V1.2.3: 波形绘制优化2
- 优化波形解析绘制的流畅度,提升了部分性能
- 移除部分UI主题,如有UI美化界面的构思可联系作者
- 修复bug:波形按钮的功能不够协调
V1.2.4: 细节优化3
- 优化软件整体布局,并移除了其他UI主题,采用默认UI主题配色
- 状态栏右侧新增 每日微语 接口,鼠标左键单击即可更新微语(大于30字微语默认不更新)
![](https://img-blog.csdnimg.cn/direct/563ae98c933e4b9695f807ee9d54b445.png)
V1.2.5: 功能新增
5. MQTT Client
- 新增MQTT Client功能,可实现部分物联平台的数据收发测试,暂时支持巴法云平台
![](https://img-blog.csdnimg.cn/direct/ce12c52d79874501b7a2826d70df39cf.png)
6. 文件发送
- 新增文件发送功能,可方便快捷发送多个文件数据,支持串口发送和TCP Socket发送
![](https://img-blog.csdnimg.cn/direct/238ce60e9fd2480a99791e30ffabcf01.png)
7. 软件兼容性修改
可能第一次打开会出现显示很鸡肋的情况,只需要修改一下使之适配您电脑的分辨率即可。具体解决办法如下:
1. 找到软件,鼠标右键点击属性,见下图。
![](https://img-blog.csdnimg.cn/8745928069dd4e5db01145dc043bf6a3.png)
2. 找到 兼容性 选项卡,选择 更改所有用户的设置 并进入对应的配置界面。
![](https://img-blog.csdnimg.cn/d08b3fdfb45947cc95308dfe8cbfd36d.png)
3. 选择 更改高DPI设置 选项卡,进入其配置界面。
![](https://img-blog.csdnimg.cn/a0cb18eec42c49d4a9e27576ad57e303.png)
4. 进入该界面后勾选 替代高DPI缩放行为 ,并点击下拉框选择 系统 选项卡,见下图。
![](https://img-blog.csdnimg.cn/a8cf7c04fc6c400d8f2e542117b68d55.png)
5. 接着一路点击 确定 返回即可,重新打开软件就会发现与自己的电脑进行适配了。
6.若需软件源码请访问邮箱,后续会上传到GitHub,敬请期待。
项目Github地址:https://github.com/JJKING12/King_serial,大家如果觉得还不错的话,麻烦给我点个Stars,谢谢~