# sem_control **Repository Path**: ucas-sem-work-2/sem_control ## Basic Information - **Project Name**: sem_control - **Description**: sem上位机程序,基于qt 5.14.2 - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: develop - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2024-03-03 - **Last Updated**: 2025-11-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ucas_sem ## 协议 每一行的数据如下 ``` scan_line(\x00\x00)@\x00\x00,\x01\x90@.......# ``` `\x00\x00` 为行号(从0开始), `\x01\x90` 是每行点数(以400为例),每点1字节,`.......` 代表数据 ## 读取细节 ```cpp void serial::serial_read_line(){ buffer=SerialPort.readAll(); if(!buffer.isEmpty()){ data->append(buffer); if(data->size()>=(linelen+21)*2){ int head_index=data->indexOf(QByteArray("scan_line")); uint linenumcode=0; if(head_index>=0){ do { if(data->mid(20+linelen+head_index,1)==QByteArray("#")){ linenumcode=(uint)data->mid(10+head_index,2).toHex().toUInt(nullptr,16); piclinedata=data->mid(20+head_index,linelen); memcpy(picdata+linenumcode*linelen,piclinedata.data(),linelen); if(linenumcode==uint(linenum-1)){ emit pic_receive_done(); } ui->pic_process->setValue(linenumcode); data->remove(0,head_index+21+linelen); } else { data->remove(0,head_index+9); } head_index=data->indexOf(QByteArray("scan_line")); } while (data->size()>(linelen+21)*3&&(head_index>=0&&head_index<=(data->size()-(linelen+21)))); } } } } ``` 每识别一行数据,就改变全局变量 `picdata` (一维数组,大小为打开串口前设置的分辨率决定,为 `linelen*linenum` ) 若读到最后一行就发送信号 `pic_receive_done` ,可以对 `picdata` 进行数据处理(待完成)