這次這個模闆是在上次的基礎上面添加CAN子產品來寫的,上圖

最後一張是關于我們,好了,這既是模闆的東西了
代碼
說先,CAN采集資料我用了一段時間(1)加睡眠來實作,是以為了防止主線程卡死,采集資料放到了現成裡面
/*
* 擷取CAN資料類
*/
class Get_CAN_Data : public QThread
{
Q_OBJECT
public:
bool run_state = true;
virtual void run();
void close_Device();
void init(DWORD EQU_Type,DWORD EQU_Index,DWORD EQU_Number);
signals:
void signal_CanData(QString ThreadID,QString ID,QString TimeStamp,QString TimeFlag,QString SendType,QString RemoteFlag,
QString ExternFlag,QString DataLen,QString Data,QString Reserved);
void signal_Error(int error);
private:
DWORD EQU_Type; //裝置類型
DWORD EQU_Index; //裝置索引
DWORD EQU_Number; //裝置通道
};
/*
* 擷取CAN資料
*/
void Get_CAN_Data:: run()
{
static VCI_INIT_CONFIG init_config;
init_config.AccCode = 0x00000000;
init_config.AccMask = 0xffffffff;
init_config.Filter = 0;
init_config.Timing0 = 0x00;
init_config.Timing1 = 0x1c;
init_config.Mode = 0;
if(VCI_InitCAN(EQU_Type,EQU_Index,EQU_Number,&init_config) == STATUS_OK)
{
if(VCI_StartCAN(EQU_Type,EQU_Index,EQU_Number) == STATUS_OK)
{
qDebug() << "打開裝置" << EQU_Type << EQU_Index<<EQU_Number;
static VCI_CAN_OBJ frameinfo;
static VCI_ERR_INFO errinfo;
static int len=1;
while (1)
{
msleep(25);
if(run_state)
{
len=VCI_Receive(EQU_Type,EQU_Index,EQU_Number,&frameinfo,50,200);
if(len<=0)
{
//注意:如果沒有讀到資料則必須調用此函數來讀取出目前的錯誤碼,
//千萬不能省略這一步(即使你可能不想知道錯誤碼是什麼)
VCI_ReadErrInfo(EQU_Type,EQU_Index,EQU_Number,&errinfo);
//qDebug()<<"接收失敗";
}
else
{
QString CID;
if(frameinfo.ID < 16)
{
CID = "0"+QString::number(frameinfo.ID,16).toUpper();
}
else
{
CID = QString::number(frameinfo.ID,16).toUpper();
}
QString CTimeStamp;
if(frameinfo.TimeStamp < 16)
{
CTimeStamp = "0"+QString::number(frameinfo.TimeStamp,16).toUpper();
}
else
{
CTimeStamp = QString::number(frameinfo.TimeStamp,16).toUpper();
}
QString CTimeFlag= "0"+QString::number(frameinfo.TimeFlag,16).toUpper();
QString CSendType= "0"+QString::number(frameinfo.SendType,16).toUpper();
QString CRemoteFlag= "0"+QString::number(frameinfo.RemoteFlag,16).toUpper();
QString CExternFlag= "0"+QString::number(frameinfo.ExternFlag,16).toUpper();
QString CDataLen= "0"+QString::number(frameinfo.DataLen,16).toUpper();
QString CData;
for(int i = 0;i<frameinfo.DataLen;i++)
{
if(frameinfo.Data[i] <16)
{
CData += "0";
}
CData += QString::number(frameinfo.Data[i],16).toUpper()+" ";
}
QString CReserved;
for(int j = 0;j<3;j++)
{
if(frameinfo.Reserved[j] <16)
{
CData += "0";
}
CReserved += QString::number(frameinfo.Reserved[j],16).toUpper()+" ";
}
emit signal_CanData(QString::number(EQU_Number,16),CID,CTimeStamp,CTimeFlag,CSendType,CRemoteFlag,
CExternFlag,CDataLen,CData,CReserved);
}
}
else
{
break;
}
}
emit signal_Error(2);
}
}
else
{
emit signal_Error(1);
}
}
/*
* 關閉CAN裝置
*/
void Get_CAN_Data::close_Device()
{
run_state = ! run_state;
}
/*
* 初始化CAN裝置
*/
void Get_CAN_Data::init(DWORD EQU_Type, DWORD EQU_Index, DWORD EQU_Number)
{
run_state = true;
this->EQU_Type = EQU_Type;
this->EQU_Index = EQU_Index;
this->EQU_Number = EQU_Number;
}
上面代碼就是目前的線程類,主要負責資料的采集
後面的資料解析就不貼代碼了,