天天看點

Qt-CAN資料傳輸-模闆

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

Qt-CAN資料傳輸-模闆
主界面,有三大部分組成,最中間的這是按鈕,左邊的裝置資訊和右邊的CAN資料資訊
Qt-CAN資料傳輸-模闆
設定裡面暫時就隻添加了裝置切換的功能,參數配置寫死。目前不需要
Qt-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;
}      

上面代碼就是目前的線程類,主要負責資料的采集

後面的資料解析就不貼代碼了,

繼續閱讀