Qt 周立功USBCAN總線上位機

Qt 周立功USBCAN總線上位機

目的、要求

做一個USBCAN總線的shan上位機,使用周立功提供的SDK。要有參數設置的xu選項、接發數據、數據過濾等功能。

簡介

我這邊的CAN卡型號是USBCAN_4E_U,所以要使用USBCAN_4E_U這個dll。使用周立功提供的哪個dll,是根據你的CAN卡來決定的。周立功提供的vs2008編寫的MFC例子會起到一定的誤解。因爲那個例子直接使用了ControlCAN這個dll。在進行類型設置的時候選擇了31,也就是USBCAN_4E_U這個dll。而Qt用這樣的方法不行。

首先是Qt調用第三方的dll。有顯示和隱式2種方式。我這邊使用了顯示調用。剩下的就是加入頭文件,然後定義函數指針。然後根據周立功提供的開發文檔進行相應的開發。開發文檔對每個函數的使用和參數的含義做了詳細的解釋。

做對應開發的情況下,看你編譯器的版本,如果是64位,就選擇64位的dll。如果是32位就選擇32位的版本。大家千萬別用錯了,然後找不到原因。

配置方面大家可以參考這篇文章:https://www.cnblogs.com/judes/p/6952079.html

CAN的通訊都放在線程裏,通過信號與槽與UI界面進行交互

效果

代碼

void DataThread::transmitCanThread(QString idStr, QString chStr, int sendFrameTypeInt)
{
    if(m_connect == false)
    {
        return;
    }
    
    char* id = idStr.toLatin1().data();
    char* ch = chStr.toLatin1().data();
    
    //QByteArray id = idStr.toLatin1();
    //QByteArray ch = chStr.toLatin1();
    
    VCI_CAN_OBJ frameinfo;
    char szFrameID[9];
    unsigned char FrameID[4]={0,0,0,0};
    memset(szFrameID,'0',9);
    unsigned char Data[8];
    char szData[25];
    BYTE datalen=0;
    
    if(strlen(id) > 8)
    {
        qDebug() << "ID值超過範圍...";
        emit sendStateInfoToUI("ID值超過範圍...");
        return;
    }
    
    if(strlen(ch) > 24)
    {
        qDebug() << "數據長度超過範圍,最大爲8個字節...";
        emit sendStateInfoToUI("數據長度超過範圍,最大爲8個字節...");
        return;
    }
    
    if(sendFrameTypeInt == 0)
    {
        if(strlen(ch) % 3 == 1)
        {
            qDebug() << "數據格式不對,請重新輸入...";
            emit sendStateInfoToUI("數據格式不對,請重新輸入...");
            return;
        }
    }
    
    memcpy(&szFrameID[8- strlen(id)],id,strlen(id));
    strtodata((unsigned char*)szFrameID,FrameID,4,0);
    
    datalen=(strlen(ch)+1)/3;
    //strcpy(szData,(LPCTSTR)ch);
    strcpy(szData,ch);
    strtodata((unsigned char*)szData,Data,datalen,1);
    
    frameinfo.DataLen = datalen;
    memcpy(&frameinfo.Data,Data,datalen);
    
    frameinfo.RemoteFlag = m_remoteFlag;
    frameinfo.ExternFlag = m_externFlag;
    
    if(frameinfo.ExternFlag==1)
    {
        frameinfo.ID=((DWORD)FrameID[0]<<24)+((DWORD)FrameID[1]<<16)+((DWORD)FrameID[2]<<8)+
                ((DWORD)FrameID[3]);
    }
    else
    {
        frameinfo.ID=((DWORD)FrameID[2]<<8)+((DWORD)FrameID[3]);
    }
    frameinfo.SendType=m_sendType;
    
    int ret = pTransmitCAN(m_devtype,m_devind,m_canind,&frameinfo,1);
    if(ret==1)
    {
        qDebug() << "寫入成功...";
        emit sendStateInfoToUI("寫入成功...");
    }
    else
    {
        qDebug() << "寫入失敗...";
        emit sendStateInfoToUI("寫入失敗...");
    }
}

void DataThread::resetCanThread()
{
    if(m_connect == false)
    {
        return;
    }
    
    if(pResetCAN(m_devtype,m_devind,m_canind) == STATUS_ERR)
    {
        qDebug() << "復位失敗";
        emit sendStateInfoToUI("復位失敗");
        pCloseDevice(m_devtype,m_devind);
    }
    else
    {
        qDebug() << "復位成功";
        emit sendStateInfoToUI("復位成功");
    }
}

void DataThread::run()
{
    while(!m_stopped)
    {
        receiveCanThread();
    }
    m_stopped = false;
}

 

 

exe體驗地址(百度網盤鏈接):

鏈接:https://pan.baidu.com/s/1rGvkr4qMg9UypjqV_yFdyg 
提取碼:0oac 

[email protected] 備註博客標題

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章