直接来源 | 果果小师弟
逛github时看到这个QT的串口示波器,完全开源,支持串口、TCP、波形显示、通信协议。感觉很不错,跟以前分享的那个vofa+有点像。感兴趣的可以下载下来学习学习(文末附链接)。

Sailor Project功能说明

串口调试助手功能

  • 支持传统的串口调试助手的基本收发功能,同时可以刷新大量的数据而不卡顿
  • 支持保存接收的数据
  • 支持最大200条可编辑指令的设置,并用于多条发送
  • 支持定时器发送
  • 支持换行符替换时间戳功能
  • 支持较多的中文编码格式
  • 值得注意的是支持Linux简单的串口调试
  • 支持加载csv表格数据到200条可编辑指令
  • 支持部分窗口配置的保存和重启恢复(前提是你不会删除配置文件)

操作说明

注意由于QT自带文本显示窗口加载大量数据后会造成软件卡顿,现解决方案为设定一个显示缓冲区,在有刷新数据阶段(即串口接收数据阶段),如果需要保持刷新状态(即实时显示接收得数据),则仅显示显示缓冲区的内容,你可以使用鼠标移动向上滚动条,停止数据刷新,同时当你向上移动滚动条到一定程度,便会开始加载所有数据,如果你想再次触发实时刷新数据状态,只需要将滚动条移动到最低端,并确保有数据接收。
由于保存数据为显示界面的数据,如果出于刷新状态,则无法保存所有数据,正确的做法是关闭串口后,将滚动条移动到最顶端,加载全部数据,然后保存窗口数据。

TCPServer界面

SEASKY串口通信协议

通信方式是串口,配置为波特率115200, 8位数据位, 1位停止位, 无硬件流控, 无校验位。
1、通信协议格式
帧头设备类型设备ID数据ID帧尾
protocol_header(4-byte)equipment_type(2-byte)equipment_id (2-byte)data_id(2-byte)frame_tail(2-byte,CRC16,整包校验)
2、帧头详细定义
3、串口通信协议
intparse_protocol(protocol_struct* pProtocol,uint16_t parseDataLen)
{

//解析数据,使用前需提前缓冲 pProtocol->message_st.pData
int
 ret = 
-1
;

uint16_t
 pos_offset;

    frame_struct* pFrameStruct = &pProtocol->frame_st;

    message_struct* pMessageStruct = &pProtocol->message_st;

if
 (check_protocol_heade(pMessageStruct->pData) == PROTOCOL_RESULT_OK)

    {

//更新帧头数据
        pFrameStruct->header.sof            = pMessageStruct->pData[
0
];

//获取data段的数据长度
        pFrameStruct->header.data_length    = (pMessageStruct->pData[
2
] << 
8
) | (pMessageStruct->pData[
1
]);

        pFrameStruct->header.crc_check      = pMessageStruct->pData[
3
];

//获取此次数据包长度
        pMessageStruct->data_len = pFrameStruct->header.data_length + PROTOCOL_DATA_OFFSET + 
2
;

//计算解析后得到的 data_union 数据长度
        pFrameStruct->frame_user.cmd_data.data_len = (pFrameStruct->header.data_length) / 
sizeof
(data_union);

if
(pMessageStruct->data_len<=parseDataLen)

        {

if
 (pMessageStruct->data_len <= pMessageStruct->max_data_len)

            {

if
(CRC16_Check_Sum(&pMessageStruct->pData[
0
], pMessageStruct->data_len) != 
0
)

                {

                    pFrameStruct->frame_user.equipment_type = (pMessageStruct->pData[
5
]<<
8
) | (pMessageStruct->pData[
4
]);

                    pFrameStruct->frame_user.equipment_id   = (pMessageStruct->pData[
7
] << 
8
) | (pMessageStruct->pData[
6
]);

                    pFrameStruct->frame_user.data_id        = (pMessageStruct->pData[
9
] << 
8
) | (pMessageStruct->pData[
8
]);

//拷贝 data段 指定长度数据
                    ret = (
int
)
memcpy
(&pFrameStruct->frame_user.cmd_data.pData[
0
], &pMessageStruct->pData[PROTOCOL_DATA_OFFSET], pFrameStruct->header.data_length);

                    pos_offset = pFrameStruct->header.data_length + PROTOCOL_DATA_OFFSET;

                    pFrameStruct->frame_tail = (pMessageStruct->pData[pos_offset+
1
] << 
8
) | (pMessageStruct->pData[pos_offset]);

return
 PROTOCOL_RESULT_OK;

                }

else
                {

//待解析BUFF超过预定解析数据容量,避免内存越界
                    PROTOCOL_ERROR_PRINTF(
"parse_protocol->>CRC16_Check_Sum err!\n"
);

return
 PROTOCOL_RESULT_CHECK_FRAME_ERR;

                }

            }

else
            {

//待解析BUFF超过预定解析数据容量,避免内存越界
                PROTOCOL_ERROR_PRINTF(
"parse_protocol->>data_len[%d] > max_data_len[%d]!\n"
,

                    pMessageStruct->data_len,

                    pMessageStruct->max_data_len);

return
 PROTOCOL_RESULT_OUT_OF_LEN;

            }

        }

else
        {

//通过包头计算,还未收到完整的数据包
//            PROTOCOL_ERROR_PRINTF("parse_protocol->>data_len[%d] > max_data_len[%d]!\n",
//                pMessageStruct->data_len,
//                pMessageStruct->max_data_len);
return
 PROTOCOL_RESULT_OUT_OF_LEN;

        }

    }

else
    {

//待解析BUFF超过预定解析数据容量,避免内存越界
        PROTOCOL_ERROR_PRINTF(
"parse_protocol->>check_protocol_heade err!\n"
);

return
 PROTOCOL_RESULT_CHECK_HEAD_ERR;

    }

    PROTOCOL_DEBUG_PRINTF(
"parse_protocol->>check_protocol_heade ok!\n"
);

return
 PROTOCOL_RESULT_ERR;

}

软件截图

项目开源地址:
https:
//github.com/SEASKY-Master/vSailorProject
声明:本文素材来源网络,版权归原作者所有。如涉及作品版权问题,请与我联系删除。
-END-

往期推荐:点击图片即可跳转阅读
继续阅读
阅读原文