From dc66beed0e50be44272e5319c79680ca65598c97 Mon Sep 17 00:00:00 2001 From: gztss <2269610337@qq.com> Date: Fri, 26 Jan 2018 19:37:03 +0800 Subject: [PATCH] 1.1.8 Add docment. --- README.md | 4 + SerialTool/SerialTool.pro | 9 +- SerialTool/doc/doc.md | 206 +++++++++++++++++++++ SerialTool/include/docmentdialog.h | 22 +++ SerialTool/include/optionsbox.h | 2 +- SerialTool/include/serialtool.h | 3 +- SerialTool/include/terminalview.h | 1 + SerialTool/include/version.h | 4 +- SerialTool/language/serialtool_zh_CN.ts | 70 ++++--- SerialTool/language/zh_cn/serialtool.qm | Bin 7131 -> 7236 bytes SerialTool/resource/doc.html | 235 ++++++++++++++++++++++++ SerialTool/resource/serialtool.qrc | 3 + SerialTool/slave/sendwave.c | 8 +- SerialTool/source/aboutbox.cpp | 2 +- SerialTool/source/docmentdialog.cpp | 25 +++ SerialTool/source/serialtool.cpp | 11 +- SerialTool/source/terminalview.cpp | 10 + SerialTool/ui/docmentdialog.ui | 70 +++++++ SerialTool/ui/optionsbox.ui | 8 +- SerialTool/ui/serialtool.ui | 8 +- SerialTool/ui/terminalview.ui | 3 - SerialTool/ver_temp.h | 2 +- 22 files changed, 656 insertions(+), 50 deletions(-) create mode 100644 SerialTool/doc/doc.md create mode 100644 SerialTool/include/docmentdialog.h create mode 100644 SerialTool/resource/doc.html create mode 100644 SerialTool/source/docmentdialog.cpp create mode 100644 SerialTool/ui/docmentdialog.ui diff --git a/README.md b/README.md index b2c0b77..5b71daf 100644 --- a/README.md +++ b/README.md @@ -32,3 +32,7 @@ SerialTool是一个实用的串口调试工具,这款工具支持串口调试 * QScintilla: [Documentation](http://pyqt.sourceforge.net/Docs/QScintilla2), [Download](https://riverbankcomputing.com/software/qscintilla/download) * [QCustomPlot](http://www.qcustomplot.com/): 源码已经包含到项目中 * 其他信息参看[readme.txt](https://github.com/Le-Seul/SerialTool/blob/master/readme.txt)文件 + +## 文档 + +[串口示波器协议说明](./SerialTool/doc/doc.md) diff --git a/SerialTool/SerialTool.pro b/SerialTool/SerialTool.pro index cf643c6..c8e167e 100644 --- a/SerialTool/SerialTool.pro +++ b/SerialTool/SerialTool.pro @@ -47,7 +47,8 @@ SOURCES += \ source/defaultconfig.cpp \ source/oscopetimestamp.cpp \ source/terminalview.cpp \ - source/serialport.cpp + source/serialport.cpp \ + source/docmentdialog.cpp HEADERS += \ include/aboutbox.h \ @@ -69,7 +70,8 @@ HEADERS += \ include/defaultconfig.h \ include/oscopetimestamp.h \ include/terminalview.h \ - include/serialport.h + include/serialport.h \ + include/docmentdialog.h DISTFILES += \ resource/images/clear.png \ @@ -96,6 +98,7 @@ FORMS += \ ui/vediobox.ui \ ui/tcpudpport.ui \ ui/terminalview.ui \ - ui/serialport.ui + ui/serialport.ui \ + ui/docmentdialog.ui LIBS += -lqscintilla2 diff --git a/SerialTool/doc/doc.md b/SerialTool/doc/doc.md new file mode 100644 index 0000000..a1c12cb --- /dev/null +++ b/SerialTool/doc/doc.md @@ -0,0 +1,206 @@ +# 串口示波器协议 + +## 概述 + +为了使用串口示波器,用户需要按照SerialTool软件的协议发送数据,我们提供了 +sendwave.c以及sendwave.h这两个文件来封装这些协议,这两个文件在源码目录的 +[slave](https://github.com/Le-Seul/SerialTool/tree/master/SerialTool/slave) +文件夹下。用户如果需要修改或者扩充协议可自行阅读源码。 + +串口示波器分为两种传输模式:点发送模式和同步发送模式。点发送模式每个点都是独 +立发送的,而同步发送模式是将所有待发送的通道数据一起发送。因此,相比同步发送 +模式,点发送那个模式各通道之间的时间轴可能存在一些偏差,一般在±1个单位时间之 +间。但是点发送模式使用起来可能更为灵活。 + +SerialTool还支持时间戳的发送,以方便数据分析。 + +## 点发送模式 + +点发送模式由以下函数来实现: + +``` C +char ws_point_int8(char *buffer, char channel, int8_t value); +char ws_point_int16(char *buffer, char channel, int16_t value); +char ws_point_int32(char *buffer, char channel, int32_t value); +char ws_point_float(char *buffer, char channel, float value); +``` + +这些函数的参数说明: + +* `buffer`: + + > 为工作缓冲区,它最多可能需要7bytes空间。 + +* `channle`: + + > 发送的通道,取值为CH1 ~ CH16。 + +* `value`: + + > 要发送的数值,其类型由使用的函数决定(包括`int8_t`, `int16_t`, + `int32_t`或者`float`)。 + +这些函数在sendwave.c中有详细的说明。以`ws_point_int16()`为例,调用方式如下: +``` C +char buffer[7], len; +int16_t value = 100; // a test value + +len = ws_point_int16(buffer, CH1, value); +sendBuffer(buffer, len); // serial port send data +``` + +## 同步发送模式 + +同步发送模式由以下函数实现: +``` C +void ws_frame_init(char *buffer); +char ws_frame_length(const char *buffer); +char ws_add_int8(char *buffer, char channel, int8_t value); +char ws_add_int16(char *buffer, char channel, int16_t value); +char ws_add_int32(char *buffer, char channel, int32_t value); +char ws_add_float(char *buffer, char channel, float value); +``` + +首先要调用`ws_frame_init()`函数来初始化缓冲区。调用`ws_frame_length()` +可以获取缓冲区占用的字节数。 + +`ws_add_xxx()`函数用于向缓冲区中添加一个数据点,参数列表如下: + +* `buffer`: + + > 已经初始化的帧缓冲区。 + +* `channle`: + + > 发送的通道,取值为CH1 ~ CH16。 + +* `value`: + + > 要发送的数值,其类型由使用的函数决定(包括`int8_t`, `int16_t`, + `int32_t`或者`float`)。 + +这些函数如果返回1就表示数据点添加成功,0表示添加失败(缓冲区达到最大长度)。 + +同步发送模式的例程如下: +``` C +char buffer[83]; // maximum use of 83 bytes +int value = 10000; // a test value + +ws_frame_init(buffer); +ws_add_int8(buffer, CH1, (int8_t)(value / 100)); +ws_add_int16(buffer, CH2, (int16_t)(value / 20)); +ws_add_float(buffer, CH3, (float)value * 0.1f); +sendBuffer(buffer, ws_frame_length(buffer)); // serial port send data +``` + +使用同步模式发送时,可以在同一帧中使用不同的数据类型,但是不建议使用重复的通道, +因为这样可能会使缓冲区很快用完并导致时间轴错乱。 + +## 时间戳 + +利用时间戳,可以将下位机的时间信息发送至上位机。上位机收到时间戳并不会显示,但是 +在存储波形文件时会记录时间戳,因此时间戳可以方便地进行数据分析。 + +下位机要发送时间戳,需要使用下列函数: +``` C +char ws_send_timestamp(char *buffer, ws_timestamp_t* ts); +``` + +`ws_timestamp_t`结构体的定义如下: +``` C +typedef struct { + uint8_t year; // 0~99 -> 2000 ~ 2099, 7 bit + uint8_t month; // month, 1 ~ 12 + uint8_t day; // day, 1 ~ 31 + uint8_t hour; // hour, 0 ~ 23 + uint8_t min; // minute, 0 ~ 59 + uint8_t sec; // second, 0 ~ 59 + uint16_t msec; // millisecond, 0 ~ 1000 + uint32_t sampleRate; // sample rate, 0 ~ 2000000 +} ws_timestamp_t; +``` + +发送时间戳的例程如下: +``` C +char buffer[10], len; + +len = ws_send_timestamp(buffer, &ts); +sendBuffer(buffer, len); // serial port send data +``` +下位机通常不需要重复发送时间戳,因为这个时间信息一般只用于记录或者辨识,相比而 +言,采样率可能在数据分析时会更有用。因此我建议下位机在以下时机发送一次时间戳: + +* 下位机运行之初。 +* 数据采样率发生变化之后。 +* 中断波形传输后准备再次发送波形数据前。 + +## 完整示例代码 + +``` C +// include file +#include "sendwave.h" + +// 串口示波器测试函数 +void plotTest(void) +{ + char buffer[100], len; // 缓冲区最大需要83bytes + static float key = 0.0f; + static ws_timestamp_t ts = { // 时间戳 + 17, 11, 20, // year, month, day + 12, 30, 45, // hour, minute, second + 120, 50 // msec, sample rate + }; + + // 每秒钟发送一次时间戳 + if ((int64_t)(key * 50.0) % 100 == 0) { + len = ws_send_timestamp(buffer, &ts); + sendBuffer(buffer, len); // 串口发送数据 + } + + // 点发送模式 int8类型(8位有符号整形) + len = ws_point_int8(buffer, CH1, (int8_t)(sinf(key) * 64)); + sendBuffer(buffer, len); // 串口发送数据 + + // 点发送模式 int16类型(16位有符号整形) + len = ws_point_int16(buffer, CH2, (int16_t)(sinf(key) * 4096)); + sendBuffer(buffer, len); // 串口发送数据 + + // 点发送模式 int32类型(32位有符号整形) + len = ws_point_int32(buffer, CH3, (int32_t)(sinf(key) * 2048)); + sendBuffer(buffer, len); // 串口发送数据 + + // 点发送模式 float类型(单精度浮点型) + len = ws_point_float(buffer, CH4, (float)(sinf(key) * 512)); + sendBuffer(buffer, len); // 串口发送数据 + + // 同步模式(帧发送模式) + ws_frame_init(buffer); + ws_add_int8(buffer, CH5, (int8_t)(sinf(key) * 128)); + ws_add_int16(buffer, CH6, (int16_t)(sinf(key) * 700)); + ws_add_int32(buffer, CH7, (int32_t)(sinf(key) * 1024)); + ws_add_float(buffer, CH9, (float)(sinf(key) * 256)); + sendBuffer(buffer, ws_frame_length(buffer)); // 串口发送数据 + + // 更新时间计数 + key += 0.02f; +} +``` + +## 移植 + +sendwave.c和sendwave.h中的代码在gcc和KEIL for ARM中可以编译通过,但是 +我们不能保证它可以在所有编译器下编译成功。这些代码需要标准库中包含stdint.h +文件,如果没有这个文件,您可以使用以下代码来替换: +``` C +// #include + +typedef signed char int8_t; +typedef signed short int16_t; +typedef signed long int32_t; +``` + +用户一般不会使用到所有的API,例如您可能不需要使用`ws_point_float()`以及 +`ws_add_float()`函数。通常,编译器不会连接未用到的函数。编译器如果会连接从未 +被调用的函数,并且要保证目标代码最少,您应当删除这些函数的源码。 + +如果您在移植串口示波器的协议时遇到了任何问题,您也可以向作者咨询。 diff --git a/SerialTool/include/docmentdialog.h b/SerialTool/include/docmentdialog.h new file mode 100644 index 0000000..18d4e73 --- /dev/null +++ b/SerialTool/include/docmentdialog.h @@ -0,0 +1,22 @@ +#ifndef DOCMENTDIALOG_H +#define DOCMENTDIALOG_H + +#include + +namespace Ui { +class DocmentDialog; +} + +class DocmentDialog : public QDialog +{ + Q_OBJECT + +public: + explicit DocmentDialog(QWidget *parent = 0); + ~DocmentDialog(); + +private: + Ui::DocmentDialog *ui; +}; + +#endif // DOCMENTDIALOG_H diff --git a/SerialTool/include/optionsbox.h b/SerialTool/include/optionsbox.h index 53395e9..e81b400 100644 --- a/SerialTool/include/optionsbox.h +++ b/SerialTool/include/optionsbox.h @@ -33,7 +33,7 @@ private slots: void setLanguage(int index); private: - Ui_optionsBox ui; + Ui_OptionsBox ui; SerialTool *serialTool; QString fontFamily, fontStyle; int fontSize; diff --git a/SerialTool/include/serialtool.h b/SerialTool/include/serialtool.h index 6e95c59..6b1a85e 100644 --- a/SerialTool/include/serialtool.h +++ b/SerialTool/include/serialtool.h @@ -1,4 +1,4 @@ -#ifndef __SERIALTOOL_H +#ifndef __SERIALTOOL_H #define __SERIALTOOL_H #include @@ -47,6 +47,7 @@ private slots: void setOptions(); void saveFile(); void about(); + void docment(); void onVedioBoxTriggered(); void onVedioBoxDelete(); void currentTabChanged(int index); diff --git a/SerialTool/include/terminalview.h b/SerialTool/include/terminalview.h index fb909fa..9a3f073 100644 --- a/SerialTool/include/terminalview.h +++ b/SerialTool/include/terminalview.h @@ -32,6 +32,7 @@ class TerminalView : public QWidget void sendDataRequest(const QByteArray &array); private: + void keyPressEvent(QKeyEvent *event); void setSendButtonEnabled(bool status); void arrayToHex(QString &str, const QByteArray &arr, int countOfLine); void arrayToAscii(QString &str, const QByteArray &arr); diff --git a/SerialTool/include/version.h b/SerialTool/include/version.h index 1fbec6b..2c87d62 100644 --- a/SerialTool/include/version.h +++ b/SerialTool/include/version.h @@ -1,7 +1,7 @@ #ifndef __VERSION_H #define __VERSION_H -#define MAIN_VERSION 1.1.7b +#define MAIN_VERSION 1.1.8 #define SOFTWARE_NAME "SerialTool" #define COPYRIGHT "Copyleft 2017 by Wenliang" @@ -9,7 +9,7 @@ #define _STR_(s) #s #define __STR(s) _STR_(s) -#define BUILD_VERSION _STR_(3396eM) +#define BUILD_VERSION _STR_(374c2M) #define SOFTWARE_VERSION __STR(MAIN_VERSION) #endif diff --git a/SerialTool/language/serialtool_zh_CN.ts b/SerialTool/language/serialtool_zh_CN.ts index 2de2486..89f929f 100644 --- a/SerialTool/language/serialtool_zh_CN.ts +++ b/SerialTool/language/serialtool_zh_CN.ts @@ -17,6 +17,15 @@ 修改绘制线条的颜色 + + DocmentDialog + + + Docment + 文档 + + + FileTransferView @@ -208,46 +217,46 @@ Port may be occupied or configured incorrectly! SerialTool - + Start Tx/Rx 开始发送/接收 - - + + Pause Tx/Rx 暂停发送/接收 - - + + Open Port 打开端口 - + Close Port 关闭端口 - + Portable Network Graphic Format (*.png);;Bitmap (*.bmp);;Portable Document Format (*.pdf);;Wave Plain Text File (*.txt) 图像文件存储格式 (*.png);;位图文件 (*.bmp);;便携式文档格式 (*.pdf);;波形纯文本文件 (*.txt) - + Terminal 终端 - + Tester 调试助手 - + Plot 波形绘制 @@ -277,79 +286,84 @@ Port may be occupied or configured incorrectly! 帮助 - + Save 保存 - + Ctrl+S - + Options 选项 - + Alt+S - + Alt+R - + Clear Buffer 清空缓冲 - + Alt+C - + Port Settings 端口设置 - + Close 关闭 - + Vedio Box 视频图传 - - + + Docment + 文档 + + + + Tool Bar 工具栏 - + File Transmit 文件传输 - + Status Bar 状态栏 - + About 关于 - + F1 @@ -458,12 +472,12 @@ Please check the port number. 发送 - + Ctrl + Enter to send Ctrl + Enter发送 - + Connect port and start transmission to enable this button 连接端口并开启传输来启用此按钮 diff --git a/SerialTool/language/zh_cn/serialtool.qm b/SerialTool/language/zh_cn/serialtool.qm index 2c2e3fe9dce5e1481354f91e21d0727f871736fa..8282d02098c6f9dd182b05d0c0ebf8323a084071 100644 GIT binary patch delta 1039 zcmZXSYesHuCR2G97Awd_r&_!a~{7|9AZk8<=^>^OB?F%oz=W@<@&iSA7cv45! z?)cDgK-vRn735z)j2lpLfY@`u>}!B83DQN0_tS00haufc0h~oPwR%YRX9MxK$sK^_ zC8X#5fVBux?>PFsg2+2U`=24!l>quNo4#_0^$kEsIcqOs{;}!ng4lNzFcTq~a{<>H zo3W!IZZaWvEhbl118O<)H#`L5nlZJpgGqOzAoC5+B@|3@lA}o%IRgb-c^>x>{>;7H zAA-Ml2@_7mjHV?B!SOn}fU?7;ryYUg%*?ePf!>KgLOSLx9nXiyVozrcD@${@y~$K7 z;OOh?Vc;8%SI;`B*b^t3zN25K)47WF);3qttTym-1=GV+w%HY#oDFyfrK-7UfFVo! zrnQ9t$42S*T|=1;N-bkHGhl_7-(3la8nJx$c|iVFtVbO8-;3G-N~>KE+lQ1Hc2)e= zu#=J(iI#9X6}u-+hc5xcYsB3EDK(3pD6fhBDF2lmi7M@K_@B0F!5E&qZF&>5wfCrmdR?n4J;eL{+Tkrv87EDj@QBij z9=#+>Vj-LKj$X#I`V5ElfCc?%GcMQo=@%+3{xm{?ui}}}P9sWfq!Emyu)-Tgc@ldj z`HX1bgddE^-yABl%DD6EDBhRa)Voaa4HMBVv*;)v5+lq8M>p-lHivhaO~FkpWQ2KT z!(Fzl(tNsj9hI16J{#h&{)z6)M)uHs(j#YAGm$(`#``Zg6MuMW^;UAMr?D%M55{`l zon@=MIV(7k)%C5ex-aEm?eb#iYyj{1E4gLGtAlGQ6|UW%*SRYemzFI%^R={6wT8_9 PXIy{FYn?e^X2g5~dZPKs delta 954 zcmXAnX>3ek6o%iKd%wHP+?mm7r?n=vG=ip)qDo?|rG{1-Z9>tcbVRAdQcDpds+Ppo zs%A=~XbGi=<%bwd+6w)F1{GTbm7v=GuoMa6?cDq4x#!+<-tV0Ed`-!(#vY3D2LQPg z(EE^Y0p~S9O#$3FK;}Kba}V-O8PL9(jLLxA5(ijgP3q$zKg$H7Hj(>TUkdrtch;$p zJ4RCX2*mW$%uj<@mj~F=O-9E+Y$yl(>Mrxe6)+iH1QECk*c&0LrUB9%~YU_(4@)Tg0yW2^GauP!*_l*;?2a)&Oe+>H8wD88P}*F~Nn0$AUPI{C2uo+@2MVpX zbhS0pu@WmPr?T#-)w+`To#is0XotxF4Q%! z!L8zQ-7PjeTs+Mts$uviui$V7HR)Dq~@-ve5U2 z6ILrZX^9j(r)*J}sCSt3bSm4t16lY$`RqN;!S1V$WD44%)!COkbReiMUE$>&XjOx^ z^ML3-YG{U&6VK7&)^erpcx}Q^I)?*V`jsDaC|@h~&kFJ2dD_9+!@MM$wHqPsNOI{p zd!I0_*L^<)g-+-z7soSxW72g;U(-q_v?{%a}~`kuA2-FKNBFZp%xSIml33 zQwQ}t<#vnbIS2Y@(*4Cge + + + + + + doc + + + + + +

串口示波器协议

+

概述

+

为了使用串口示波器,用户需要按照SerialTool软件的协议发送数据,我们提供了 sendwave.c以及sendwave.h这两个文件来封装这些协议,这两个文件在源码目录的 slave 文件夹下。用户如果需要修改或者扩充协议可自行阅读源码。

+

串口示波器分为两种传输模式:点发送模式和同步发送模式。点发送模式每个点都是独 立发送的,而同步发送模式是将所有待发送的通道数据一起发送。因此,相比同步发送 模式,点发送那个模式各通道之间的时间轴可能存在一些偏差,一般在±1个单位时间之 间。但是点发送模式使用起来可能更为灵活。

+

SerialTool还支持时间戳的发送,以方便数据分析。

+

点发送模式

+

点发送模式由以下函数来实现:

+ +

这些函数的参数说明:

+
    +
  • buffer:

    +
    +

    为工作缓冲区,它最多可能需要7bytes空间。

    +
  • +
  • channle:

    +
    +

    发送的通道,取值为CH1 ~ CH16。

    +
  • +
  • value:

    +
    +

    要发送的数值,其类型由使用的函数决定(包括int8_t, int16_t, int32_t或者float)。

    +
  • +
+

这些函数在sendwave.c中有详细的说明。以ws_point_int16()为例,调用方式如下:

+ +

同步发送模式

+

同步发送模式由以下函数实现:

+ +

首先要调用ws_frame_init()函数来初始化缓冲区。调用ws_frame_length() 可以获取缓冲区占用的字节数。

+

ws_add_xxx()函数用于向缓冲区中添加一个数据点,参数列表如下:

+
    +
  • buffer:

    +
    +

    已经初始化的帧缓冲区。

    +
  • +
  • channle:

    +
    +

    发送的通道,取值为CH1 ~ CH16。

    +
  • +
  • value:

    +
    +

    要发送的数值,其类型由使用的函数决定(包括int8_t, int16_t, int32_t或者float)。

    +
  • +
+

这些函数如果返回1就表示数据点添加成功,0表示添加失败(缓冲区达到最大长度)。

+

同步发送模式的例程如下:

+ +

使用同步模式发送时,可以在同一帧中使用不同的数据类型,但是不建议使用重复的通道, 因为这样可能会使缓冲区很快用完并导致时间轴错乱。

+

时间戳

+

利用时间戳,可以将下位机的时间信息发送至上位机。上位机收到时间戳并不会显示,但是 在存储波形文件时会记录时间戳,因此时间戳可以方便地进行数据分析。

+

下位机要发送时间戳,需要使用下列函数:

+ +

ws_timestamp_t结构体的定义如下:

+ +

发送时间戳的例程如下:

+ +

下位机通常不需要重复发送时间戳,因为这个时间信息一般只用于记录或者辨识,相比而 言,采样率可能在数据分析时会更有用。因此我建议下位机在以下时机发送一次时间戳:

+
    +
  • 下位机运行之初。
  • +
  • 数据采样率发生变化之后。
  • +
  • 中断波形传输后准备再次发送波形数据前。
  • +
+

完整示例代码

+
// include file
+#include "sendwave.h"
+
+// 串口示波器测试函数
+void plotTest(void)
+{
+    char buffer[100], len; // 缓冲区最大需要83bytes
+    static float key = 0.0f;
+    static ws_timestamp_t ts = { // 时间戳
+        17, 11, 20,      // year, month, day
+        12, 30, 45,      // hour, minute, second
+        120, 50          // msec, sample rate
+    };
+
+    // 每秒钟发送一次时间戳
+    if ((int64_t)(key * 50.0) % 100 == 0) {
+        len = ws_send_timestamp(buffer, &ts);
+        sendBuffer(buffer, len); // 串口发送数据
+    }
+
+    // 点发送模式 int8类型(8位有符号整形)
+    len = ws_point_int8(buffer, CH1, (int8_t)(sinf(key) * 64));
+    sendBuffer(buffer, len); // 串口发送数据
+
+    // 点发送模式 int16类型(16位有符号整形)
+    len = ws_point_int16(buffer, CH2, (int16_t)(sinf(key) * 4096));
+    sendBuffer(buffer, len); // 串口发送数据
+
+    // 点发送模式 int32类型(32位有符号整形)
+    len = ws_point_int32(buffer, CH3, (int32_t)(sinf(key) * 2048));
+    sendBuffer(buffer, len); // 串口发送数据
+
+    // 点发送模式 float类型(单精度浮点型)
+    len = ws_point_float(buffer, CH4, (float)(sinf(key) * 512));
+    sendBuffer(buffer, len); // 串口发送数据
+
+    // 同步模式(帧发送模式)
+    ws_frame_init(buffer);
+    ws_add_int8(buffer, CH5, (int8_t)(sinf(key) * 128));
+    ws_add_int16(buffer, CH6, (int16_t)(sinf(key) * 700));
+    ws_add_int32(buffer, CH7, (int32_t)(sinf(key) * 1024));
+    ws_add_float(buffer, CH9, (float)(sinf(key) * 256));
+    sendBuffer(buffer, ws_frame_length(buffer)); // 串口发送数据
+
+    // 更新时间计数
+    key += 0.02f;
+}
+

移植

+

sendwave.c和sendwave.h中的代码在gcc和KEIL for ARM中可以编译通过,但是 我们不能保证它可以在所有编译器下编译成功。这些代码需要标准库中包含stdint.h 文件,如果没有这个文件,您可以使用以下代码来替换:

+ +

用户一般不会使用到所有的API,例如您可能不需要使用ws_point_float()以及 ws_add_float()函数。通常,编译器不会连接未用到的函数。编译器如果会连接从未 被调用的函数,并且要保证目标代码最少,您应当删除这些函数的源码。

+

如果您在移植串口示波器的协议时遇到了任何问题,您也可以向作者咨询。

+ + diff --git a/SerialTool/resource/serialtool.qrc b/SerialTool/resource/serialtool.qrc index b3377d1..53ed4b9 100644 --- a/SerialTool/resource/serialtool.qrc +++ b/SerialTool/resource/serialtool.qrc @@ -17,4 +17,7 @@ default.ini + + doc.html + diff --git a/SerialTool/slave/sendwave.c b/SerialTool/slave/sendwave.c index 266f51e..c35ac23 100644 --- a/SerialTool/slave/sendwave.c +++ b/SerialTool/slave/sendwave.c @@ -157,7 +157,7 @@ char ws_add_int8(char *buffer, char channel, int8_t value) char *p = buffer + count + 3; // 跳过前面数据 count += 2; - if (count < 69) { // 帧最大字节数 + if (count <= 80) { // 帧最大字节数 buffer[2] = count; *p++ = channel | Format_Int8; // 通道及数据格式信息 *p = value; // 数据添加到帧 @@ -179,7 +179,7 @@ char ws_add_int16(char *buffer, char channel, int16_t value) char *p = buffer + count + 3; // 跳过前面数据 count += 3; - if (count < 69) { // 帧最大字节数 + if (count <= 80) { // 帧最大字节数 buffer[2] = count; *p++ = channel | Format_Int16; // 通道及数据格式信息 // 数据添加到帧 @@ -203,7 +203,7 @@ char ws_add_int32(char *buffer, char channel, int32_t value) char *p = buffer + count + 3; // 跳过前面数据 count += 5; - if (count < 69) { // 帧最大字节数 + if (count <= 80) { // 帧最大字节数 buffer[2] = count; *p++ = channel | Format_Int32; // 通道及数据格式信息 // 数据添加到帧 @@ -229,7 +229,7 @@ char ws_add_float(char *buffer, char channel, float value) char *p = buffer + count + 3; // 跳过前面数据 count += 5; - if (count < 69) { // 帧最大字节数 + if (count <= 80) { // 帧最大字节数 union { float f; uint32_t i; diff --git a/SerialTool/source/aboutbox.cpp b/SerialTool/source/aboutbox.cpp index 81dac53..492978a 100644 --- a/SerialTool/source/aboutbox.cpp +++ b/SerialTool/source/aboutbox.cpp @@ -1,4 +1,4 @@ -#include "aboutbox.h" +#include "aboutbox.h" #include #include "version.h" diff --git a/SerialTool/source/docmentdialog.cpp b/SerialTool/source/docmentdialog.cpp new file mode 100644 index 0000000..23e2457 --- /dev/null +++ b/SerialTool/source/docmentdialog.cpp @@ -0,0 +1,25 @@ +#include "docmentdialog.h" +#include "ui_docmentdialog.h" +#include + +DocmentDialog::DocmentDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::DocmentDialog) +{ + Qt::WindowFlags flags = Qt::Dialog; + flags |= Qt::WindowMinMaxButtonsHint; + flags |= Qt::WindowCloseButtonHint; + setWindowFlags(flags); + + ui->setupUi(this); + QFile doc(":/doc/doc.html"); + doc.open(QFile::ReadOnly); + ui->textBrowser->setHtml(doc.readAll()); + ui->textBrowser->setOpenExternalLinks(true); // 允许访问链接 + doc.close(); +} + +DocmentDialog::~DocmentDialog() +{ + delete ui; +} diff --git a/SerialTool/source/serialtool.cpp b/SerialTool/source/serialtool.cpp index 63b105e..8af48e5 100644 --- a/SerialTool/source/serialtool.cpp +++ b/SerialTool/source/serialtool.cpp @@ -7,6 +7,7 @@ #include "tcpudpport.h" #include "defaultconfig.h" #include "serialport.h" +#include "docmentdialog.h" SerialTool::SerialTool(QWidget *parent) : QMainWindow(parent) @@ -64,6 +65,7 @@ SerialTool::SerialTool(QWidget *parent) connect(ui.tabWidget, SIGNAL(currentChanged(int)), this, SLOT(tabIndexChanged(int))); connect(tabActionGroup, SIGNAL(triggered(QAction*)), this, SLOT(tabActionGroupTriggered(QAction*))); connect(ui.actionAbout, SIGNAL(triggered()), this, SLOT(about())); + connect(ui.actionDocment, SIGNAL(triggered()), this, SLOT(docment())); connect(ui.fileTransfer, &FileTransferView::sendData, this, &SerialTool::writePort); connect(ui.actionVedioBox, SIGNAL(triggered()), this, SLOT(onVedioBoxTriggered())); connect(ui.tabWidget, SIGNAL(currentChanged(int)), this, SLOT(currentTabChanged(int))); @@ -507,10 +509,17 @@ void SerialTool::cleanData() void SerialTool::about() { AboutBox aboutBox(this); - + aboutBox.exec(); } +void SerialTool::docment() +{ + DocmentDialog doc(this); + + doc.exec(); +} + void SerialTool::loadPortTool() { if (portType == ComPort) { diff --git a/SerialTool/source/terminalview.cpp b/SerialTool/source/terminalview.cpp index 2b4c7ff..0ab1f3e 100644 --- a/SerialTool/source/terminalview.cpp +++ b/SerialTool/source/terminalview.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include "ui_terminalview.h" TerminalView::TerminalView(QWidget *parent) : @@ -36,6 +37,15 @@ TerminalView::~TerminalView() delete asciiBuf; } +void TerminalView::keyPressEvent(QKeyEvent *event) +{ + if (event->modifiers() == Qt::ControlModifier) { + if (event->key() == Qt::Key_Return) { + onSendButtonClicked(); // Ctrl + Enter to send. + } + } +} + void TerminalView::retranslate() { ui->retranslateUi(this); diff --git a/SerialTool/ui/docmentdialog.ui b/SerialTool/ui/docmentdialog.ui new file mode 100644 index 0000000..994da0f --- /dev/null +++ b/SerialTool/ui/docmentdialog.ui @@ -0,0 +1,70 @@ + + + DocmentDialog + + + + 0 + 0 + 560 + 600 + + + + Docment + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Ok + + + true + + + + + + + + + buttonBox + accepted() + DocmentDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + DocmentDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/SerialTool/ui/optionsbox.ui b/SerialTool/ui/optionsbox.ui index 3804fbb..fbb906f 100644 --- a/SerialTool/ui/optionsbox.ui +++ b/SerialTool/ui/optionsbox.ui @@ -1,7 +1,7 @@ - optionsBox - + OptionsBox + 0 @@ -479,7 +479,7 @@ buttonBox accepted() - optionsBox + OptionsBox accept() @@ -495,7 +495,7 @@ buttonBox rejected() - optionsBox + OptionsBox reject() diff --git a/SerialTool/ui/serialtool.ui b/SerialTool/ui/serialtool.ui index bc3a826..a3cf8eb 100644 --- a/SerialTool/ui/serialtool.ui +++ b/SerialTool/ui/serialtool.ui @@ -139,7 +139,7 @@ 0 0 600 - 23 + 21 @@ -182,6 +182,7 @@ Help + @@ -353,6 +354,11 @@ File Transmit + + + Docment + + diff --git a/SerialTool/ui/terminalview.ui b/SerialTool/ui/terminalview.ui index 3cec02c..f233b7d 100644 --- a/SerialTool/ui/terminalview.ui +++ b/SerialTool/ui/terminalview.ui @@ -227,9 +227,6 @@ Send - - Ctrl+Return - diff --git a/SerialTool/ver_temp.h b/SerialTool/ver_temp.h index e832cc4..52fb048 100644 --- a/SerialTool/ver_temp.h +++ b/SerialTool/ver_temp.h @@ -1,7 +1,7 @@ #ifndef __VERSION_H #define __VERSION_H -#define MAIN_VERSION 1.1.7b +#define MAIN_VERSION 1.1.8 #define SOFTWARE_NAME "SerialTool" #define COPYRIGHT "Copyleft 2017 by Wenliang"