#include "serialworker.h" #include "thermalwidget.h" #include #include #include QVector g_qvecf_time; QVector g_qvecf_cur_time; QVector g_qvecd_temper; QVector g_qvecd_dsc; QVector g_qvecd_riserate; QVector g_qvecf_cooltemper; int g_send_flag; QVector g_real_temper; QVector g_real_dsc; extern QuadraticFitResult g_result1; SerialWorker::SerialWorker(QObject *parent) : QObject(parent) { m_recBuf.clear(); port = new QSerialPort(this); m_bOpen = false; g_send_flag = 0; m_write_flag = 0; m_read_flag = 0; ///init_port(); connect(port, SIGNAL(readyRead()), this, SLOT(handle_data()), Qt::QueuedConnection); //Qt::DirectConnection } SerialWorker::~SerialWorker() { port->close(); port->deleteLater(); } void SerialWorker::init_port(QString comName) { m_comName = comName; port->setPortName(comName); //串口名 port->setBaudRate(115200); //波特率 port->setDataBits(QSerialPort::Data8); //数据位 port->setStopBits(QSerialPort::OneStop); //停止位 port->setParity(QSerialPort::NoParity); //奇偶校验 port->setFlowControl(QSerialPort::NoFlowControl); //流控制 qDebug() << "Port init ok "<setPortName(m_comName); //串口名 // port->setBaudRate(115200); //波特率 // port->setDataBits(QSerialPort::Data8); //数据位 // port->setStopBits(QSerialPort::OneStop); //停止位 // port->setParity(QSerialPort::NoParity); //奇偶校验 // port->setFlowControl(QSerialPort::NoFlowControl); //流控制 if (port->open(QIODevice::ReadWrite)) { qDebug() << "Port have been opened"; emit show_success_msgbox(); m_bOpen = true; port->setDataTerminalReady(true); } else { qDebug() << "open COM failed"; emit show_failed_msgbox(); } qDebug() << "init_port thread is:" << QThread::currentThreadId(); } void SerialWorker::close_serial_port() { if(m_bOpen==true) { port->close(); emit close_serial_port_success(); m_bOpen = false; } } void SerialWorker::change_send_flag() { ///m_send_flag = 1; } void SerialWorker::change_test_start_flag_slot() { m_test_start_flag = 1; } void SerialWorker::handle_data() { int valid_data=0; int valid_len=0; uint16_t crcrec = 0; unsigned char* objBuf= NULL; unsigned char* validBuf = NULL; unsigned char* crcdataBuf=NULL; unsigned char* dealBuf= NULL; unsigned char* sendBuf= NULL; QByteArray recBuf= port->readAll(); ///m_recBuf.append(recBuf); emit receive_data(recBuf); int lenbuf = recBuf.size(); //总数据长度 objBuf = (unsigned char*)std::malloc(lenbuf); std::memcpy(objBuf, (unsigned char*)recBuf.data(), lenbuf); for(int i=0; i<(lenbuf-1); i++) { if((objBuf[i]==0xA5)&&(objBuf[i+1]==0x5A)) { valid_data = i; ///qDebug() << "in for i = "<< i <> 1) ^ wCPoly; else wCRCin = wCRCin >> 1; } } return (wCRCin); } void SerialWorker::InvertUint16(unsigned short *dBuf,unsigned short *srcBuf) { int i; unsigned short tmp[4]={0}; for(i=0;i< 16;i++) { if(srcBuf[0]& (1 << i)) tmp[0]|=1<<(15 - i); } dBuf[0] = tmp[0]; } //CRC16计算函数 uint16_t SerialWorker::ModbusCRC16(QByteArray senddata) { int len=senddata.size(); uint16_t wcrc=0XFFFF;//预置16位crc寄存器,初值全部为1 uint8_t temp;//定义中间变量 int i=0,j=0;//定义计数 for(i=0;i>=1;//先将数据右移一位 wcrc^=0XA001;//与上面的多项式进行异或 } else//如果不是1,则直接移出 wcrc>>=1;//直接移出 } } temp=wcrc;//crc的值 return wcrc; } void SerialWorker::write_data(QByteArray SendBytes) { // 串口未打开 if ( !m_bOpen ) { qDebug() << "串口未打开,发送失败!" << Qt::endl; emit serial_port_not_open(); return; } if ( !SendBytes.isEmpty() ) { port->write(SendBytes); qDebug() << "写端口完成!" << Qt::endl; } m_dealSendBytes = SendBytes; qDebug() << "write_id is:" << QThread::currentThreadId(); }