You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

260 lines
6.1 KiB
C++

#include "uart.h"
#include <QSerialPortInfo>
#include <QSerialPort>
#include <QList>
#include <QDebug>
#include <stdio.h>
#include <QObject>
#include <QDebug>
#include "communications.h"
#include <QWidget>
#include "MCU_ARM.h"
#include <stdio.h>
#include "QSharedMemory"
#include <QBuffer>
#include <QTime>
#include <QTimer>
uint16_t CRC;
QSerialPortInfo *SerialPortInfo;
QSerialPort SerialPort;
QByteArray UART_READ_DATA;
MCU_ARM *ARM;
uint16_t uart0_ini = 0;
uint16_t uart1_ini = 0;
uint8_t UART_Enable = 0;
QByteArray ttt;
struct UU_data uui;
void UART::Delay_MSec(unsigned int msec)
{
QEventLoop eventloop;
QTimer::singleShot((int)msec, &eventloop, SLOT(quit()));
eventloop.exec();
}
void UART::creat_file()
{
QFile file("/home/data/incident.txt");
if(file.open(QFile::WriteOnly))
{
QTextStream set_wifi_connect(&file);
}
file.close();
}
UART::UART(QObject *parent): QObject(parent)
{
}
UART::~UART()
{
SerialPort.close();
SerialPort.deleteLater();
my_thread->quit();
my_thread->wait();
my_thread->deleteLater();
}
void UART::openserial(QString COM/*QString COM2*/)
{
QList<QSerialPortInfo> list3;
list3=QSerialPortInfo::availablePorts();
for(int i=0;i<list3.size();i++)
qDebug()<<list3[i].portName();
foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
{
if(info.portName()==COM)
{
QSerialPortInfo SerialPortInfo= info;
SerialPort.setPort(info);
setserial();
}
}
}
void UART::uart_init(QString COM,uint8_t Enable)
{
openserial(COM);
ARM->testSerialPort(1);
UART_Enable = Enable;
}
void UART::ShuJu_Read()//读取数据
{
if(SerialPort.isOpen())
{
UART_READ_DATA = SerialPort.readAll();
}
else
{
}
}
void UART::ShuJu_Write(QByteArray data)
{
SerialPort.write(data);
}
void UART::setserial()
{
SerialPort.open(QIODevice::ReadWrite);
SerialPort.setBaudRate(QSerialPort::Baud115200);
SerialPort.setDataBits(QSerialPort::Data8);
SerialPort.setParity(QSerialPort::NoParity);
SerialPort.setStopBits(QSerialPort::OneStop);
SerialPort.setFlowControl(QSerialPort::NoFlowControl);
if(SerialPort.isOpen())
connect(&SerialPort,SIGNAL(readyRead()),this,SLOT(receverDataFromSerialPort()));
}
void UART::serial_close()
{
SerialPort.close();
}
void UART::ModBusCRC16(QByteArray data)
{
int len = data.size();
uint16_t rc=0xffff;
int i, j;
uint8_t temp;
for(i=0; i<len; i++)
{
temp=data.at(i);
rc^=temp;
for(j=0;j<8;j++){
if(rc&0X0001){
rc>>=1;
rc^=0XA001;
}
else
rc>>=1;
}
}
CRC = rc;
}
/*0a 43 43 11 22 33 aa aa*/
void UART::memcpySerialData(char *data,QByteArray &A,uint16_t len)
{
if(A.isEmpty() != 0)
{
A = 0;
}
A = QByteArray(data,len);
}
void UART::happenInfoError(QByteArray data){
switch (data.at(2)) {
case 0x20:
printf("Concentrator set fail...\n");
break;
case 0x21:
printf("this function unable to use, now...%d\n");
break;
case 0x22:
printf("fan start T set fail...\n");
break;
case 0x23:
printf("fan state set fail...\n");
break;
case 0x24:
printf("fan timing set fail...\n");
break;
case 0x25:
printf("buzzer state set fail...\n");
break;
}
}
void UART::receverDataFromSerialPort(){
SerialPort.waitForReadyRead(100);
QByteArray data = SerialPort.readAll();
if(data.toStdString()!="")
{
QByteArray data1;
data1[0]=0xAA;
data1[1]=0x55;
QByteArray Sec_len;
uint32_t dataLen = 0;
uint32_t result = 0;
bool ok;
uint8_t lower_CRC = 0;
char Check[2] = {0};
QByteArray CrcCheck = data.left(data.size()-2);
if((data[0] == data1[0])&&(data[1]==data1[1]))
{
ModBusCRC16(CrcCheck);
lower_CRC = CRC;
CRC = CRC>>8;
Check[0] = lower_CRC;
Check[1] = CRC;
if((Check[0] == data[data.size()-2])&&(Check[1] == data[data.size()-1]))
{
if(data.at(2) >= 0x20)
{
dataLen = data.size();
result = data.at(dataLen - 3);
if(result == 0)
{
printf("success...\n");
}
else
{
happenInfoError(data);
}
return ;
}
else
{
char *temp = data.data();
temp = temp + 5;
char *Sec = data.data();
Sec = Sec + 4;
char *adress = data.data();
adress = adress + 6;
char *sec = data.data();
sec = sec + 6;
switch (data.at(2))
{
case 0x06:
Sec_len[0] = data[4];
Sec_len[1] = data[5];
dataLen =Sec_len.toHex().toInt(&ok,16);
uui.SecData.clear();
memcpySerialData(Sec,uui.SecData,dataLen+2);
//qDebug()<<"SecData:"<<uui.SecData<<endl;
temp = NULL;
break;
case 0x08:
Sec_len[0] = data[4];
Sec_len[1] = data[5];
dataLen =Sec_len.toHex().toInt(&ok,16);
uui.Incident.clear();
memcpySerialData(Sec,uui.Incident,dataLen+2);
creat_file();
temp = NULL;
break;
case 0x10:
ARM->testSerialPort(1);
uart0_ini = 1;
break;
}
}
}
}
}
}