1 Star 0 Fork 2

SantaPasser_by/huasi_protocol_parse

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
serialport.cpp 8.81 KB
一键复制 编辑 原始数据 按行查看 历史
teh-c 提交于 2020-01-08 10:11 +08:00 . add program source code.
#include "serialport.h"
#include <QMessageBox>
#include <qDebug>
#include <QByteArray>
SerialPort::SerialPort(SerialConfigInfo *serialConfigInfo):
serialConfigInfo(serialConfigInfo)
{
initSlots();
serialReceiveDeal = new SerialReceiveDeal(&this->serialPort);
}
SerialPort::SerialPort()
{
initSlots();
serialReceiveDeal = new SerialReceiveDeal(&this->serialPort);
}
SerialPort::~SerialPort()
{
}
// 函数:打开串口
// 描述:打开串口前,检查串口配置是否正确,无误后将开启串口。
SerialConfigInfo::Serial_Err SerialPort::openSerial()
{
// 尝试从MainTab中传递过来的serialConfigInfo判断串口名称是否正确
// if(serialConfigInfo->serialPortNum.contains("com", Qt::CaseInsensitive))
// {
serialPort.setPortName(serialConfigInfo->serialPortNum);
serialPort.setBaudRate(serialConfigInfo->baudRateValue.toInt());
serialPort.setDataBits(QSerialPort::DataBits(serialConfigInfo->dataBitsValue.toInt()));
serialPort.setStopBits(QSerialPort::StopBits(serialConfigInfo->stopBitsValue.toInt()));
serialPort.setParity(QSerialPort::Parity(serialConfigInfo->parityValue.toInt()));
if(!serialPort.open(QIODevice::ReadWrite))
return SerialConfigInfo::Serial_Err::SERIAL_OPEN_FAILED;
serialReceiveDeal->start();
return SerialConfigInfo::Serial_Err::SERIAL_OK;
// }
// return SerialConfigInfo::Serial_Err::SERIAL_UNCONFIG;
}
// 接口:closeSerial
// 描述:仅仅通过QSerialPort提供的close()接口释放串口资源。
void SerialPort::closeSerial()
{
serialReceiveDeal->set_thread_run_state(false);
serialReceiveDeal->quit();
serialReceiveDeal->wait();
serialPort.close(); // 关闭串口操作
}
// 接口:setSerialConfigInfo
// 描述:设置SerialConfigInfo
void SerialPort::setSerialConfigInfo(SerialConfigInfo *serialConfigInfo)
{
this->serialConfigInfo = serialConfigInfo;
}
// 接口:initSlots
// 描述:连接信号槽
void SerialPort::initSlots()
{
// Qt5.8之后不支持WIN XP,为了支持WIN XP,加入以下判断,因为5.8版本的errorOccurred在5.6版本中使error
#if (QT_VERSION <= QT_VERSION_CHECK(5,8,0))
connect(&serialPort, SIGNAL(error(QSerialPort::SerialPortError)),this, SLOT(serialError(QSerialPort::SerialPortError)));
#else
connect(&serialPort, SIGNAL(errorOccurred(QSerialPort::SerialPortError)),this, SLOT(serialError(QSerialPort::SerialPortError)));
#endif
//connect(&serialPort, SIGNAL(readyRead()), this, SLOT(receive_data()));
}
// 接口:serialError
// 描述:串口错误处理
void SerialPort::serialError(QSerialPort::SerialPortError error)
{
if(error != QSerialPort::NoError)
{
switch(error)
{
// 串口无效(串口意外移除)
case QSerialPort::ResourceError:
QMessageBox::warning(NULL,
"错误",
"当前串口意外断开,检查无误后请再重新连接。",
QMessageBox::Ok);
break;
// 串口无法打开(串口被占用了)
case QSerialPort::OpenError: // 重复打开
case QSerialPort::PermissionError: // 串口被其他设备占用
QMessageBox::warning(NULL,
"错误",
"当前串口已被占用!",
QMessageBox::Ok);
break;
// 串口号未找到
case QSerialPort::DeviceNotFoundError:
QMessageBox::warning(NULL,
"错误",
"未找到当前串口,请检查无误后再重新连接!",
QMessageBox::Ok);
break;
// 未知错误产生(此处为了防止设置端口号名称不符合"COM"产生错误,当然这个是否能正常响应仍未测试过)
case QSerialPort::UnknownError:
QMessageBox::warning(NULL,
"错误",
"未知错误产生!",
QMessageBox::Ok);
break;
// 其他错误暂不处理
default:
break;
}
emit serialErrorOccurred();
}
}
#define HUASI_PROTOCOL_HEAD 0xFE
#define HUASI_PROTOCOL_TAIL_R 0x0D
#define HUASI_PROTOCOL_TAIL_N 0x0A
void SerialPort::receive_data(void)
{
int sindex = 0;
int eindex = 0;
int prase_step;
int tmp;
QByteArray buf = serialPort.readAll();
QByteArray packet;
prase_step = HUASI_PROTOCOL_HEAD;
while(1)
{
if(prase_step == HUASI_PROTOCOL_HEAD)
{
sindex = buf.indexOf(HUASI_PROTOCOL_HEAD, sindex);
if(sindex != -1)
prase_step = HUASI_PROTOCOL_TAIL_R;
else
break;
}
if(prase_step == HUASI_PROTOCOL_TAIL_R)
{
eindex = buf.indexOf(HUASI_PROTOCOL_TAIL_R, sindex);
if(eindex != -1)
prase_step = HUASI_PROTOCOL_TAIL_N;
else
{
sindex = eindex;
prase_step = HUASI_PROTOCOL_HEAD;
}
}
if(prase_step == HUASI_PROTOCOL_TAIL_N)
{
tmp = buf.indexOf(HUASI_PROTOCOL_TAIL_N, eindex);
if((tmp != -1) && (tmp == eindex+1))
{
packet = buf.mid(sindex, eindex - sindex + 1);
buf.remove(sindex, eindex);
sindex = 0;
eindex = 0;
qDebug() << packet;
prase_step = HUASI_PROTOCOL_HEAD;
}
else
{
eindex = tmp;
prase_step = HUASI_PROTOCOL_TAIL_R;
}
}
// QString str=QString::fromLocal8Bit(buf);
}
// str.replace(QString("\r"), QString("")); // 去除'\r',不然导致receveTedit显示空白行
// emit serialReceiveDate(str);
}
void SerialPort::sendStringToSerial(QString str)
{
serialPort.write(str.toLocal8Bit());
}
SerialReceiveDeal::SerialReceiveDeal( QSerialPort *serialPort, QObject *parent):
QThread(parent),
serialPort(serialPort)
{
}
SerialReceiveDeal::~SerialReceiveDeal()
{
}
void SerialReceiveDeal::set_thread_run_state(bool state)
{
run_state = state;
}
void SerialReceiveDeal::run()
{
run_state = true;
int prase_step;
QByteArray packet;
QByteArray buf;
QByteArray buf_r;
QByteArray temp;
int sindex = 0;
int temp_index = 0;
prase_step = HUASI_PROTOCOL_HEAD;
while(run_state)
{
buf_r = serialPort->readAll();
if(buf_r.isNull())
continue;
buf += buf_r;
qDebug() << "[buf:]" << buf << "," << "[prase_step:]" << prase_step << "sindex:" << sindex;
while(1)
{
if(prase_step == HUASI_PROTOCOL_HEAD)
{
temp_index = buf.indexOf(HUASI_PROTOCOL_HEAD, sindex);
if(temp_index != -1)
{ sindex = temp_index;
qDebug() << "[Head:]" << sindex;
temp = buf.remove(0, sindex); // 过滤sindex前的内容
qDebug() << "[Buf:]" << temp;
buf = temp;
prase_step = HUASI_PROTOCOL_TAIL_R;
}else
{
buf.clear();
sindex = 0;
prase_step = HUASI_PROTOCOL_HEAD;
break;
}
}
if(prase_step == HUASI_PROTOCOL_TAIL_R)
{
temp_index = buf.indexOf(HUASI_PROTOCOL_TAIL_R, sindex);
if(temp_index != -1){ // 找到'\r',转至'\n'查找
sindex = temp_index;
prase_step = HUASI_PROTOCOL_TAIL_N;
}
else{ // 找不到,要么被截包,要么数据有误。第二种情况暂无法处理,由于协议存在缺陷。
// prase_step = HUASI_PROTOCOL_HEAD;
break; // 获取剩下内容。
}
}
if(prase_step == HUASI_PROTOCOL_TAIL_N)
{
temp_index = buf.indexOf(HUASI_PROTOCOL_TAIL_N, sindex);
if(temp_index != -1)
{
sindex = temp_index;
packet = buf.mid(0, sindex+1);
buf.remove(0, sindex+1);
sindex = 0;
qDebug() << packet;
huasiProtocol.prase(&packet);
prase_step = HUASI_PROTOCOL_HEAD;
}
else
{
prase_step = HUASI_PROTOCOL_TAIL_R;
break;
}
}
}
}
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/santapasserby/huasi_protocol_parse.git
git@gitee.com:santapasserby/huasi_protocol_parse.git
santapasserby
huasi_protocol_parse
huasi_protocol_parse
master

搜索帮助