Closed. This question is off-topic。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
                        
                        5年前关闭。
                                                                                            
                
        
我有2个RFID阅读器。


读者1:port=com4baud=9600
阅读器2:port=com9baud=9600


我想同时连接2个RFID阅读器。但是,即使我在代码中实例化了两个阅读器,我也只能访问两个阅读器之一。

我执行以下操作:


MifareOne

MifareOne::MifareOne()
{
    LoadDll();
}

MifareOne::~MifareOne()
{
    CloseComm();
    CloseDll();
}

bool IsLoadDLL = false;
bool MifareOne::LoadDll()
{
    if (IsLoadDLL)
        return true;

    // TODO: Add extra initialization here
    TCHAR szBuf[MAX_PATH];
    GetModuleFileName(NULL, (LPTSTR)szBuf, MAX_PATH);

    sprintf(szBuf, "../../../CardReader\\MasterRD.dll");
    m_hInstMaster = LoadLibrary(_T(szBuf));


    if (m_hInstMaster)
    {
        IsLoadDLL = true;
        (FARPROC&)lib_ver = GetProcAddress(m_hInstMaster, _T("lib_ver"));
        (FARPROC&)des_encrypt = GetProcAddress(m_hInstMaster, _T("des_encrypt"));
        (FARPROC&)des_decrypt = GetProcAddress(m_hInstMaster, _T("des_decrypt"));
        (FARPROC&)rf_init_com = GetProcAddress(m_hInstMaster, _T("rf_init_com"));
        (FARPROC&)rf_init_device_number = GetProcAddress(m_hInstMaster, _T("rf_init_device_number"));
        (FARPROC&)rf_get_device_number = GetProcAddress(m_hInstMaster, _T("rf_get_device_number"));
        (FARPROC&)rf_get_model = GetProcAddress(m_hInstMaster, _T("rf_get_model"));
        (FARPROC&)rf_get_snr = GetProcAddress(m_hInstMaster, _T("rf_get_snr"));
        (FARPROC&)rf_beep = GetProcAddress(m_hInstMaster, _T("rf_beep"));
        (FARPROC&)rf_init_sam = GetProcAddress(m_hInstMaster, _T("rf_init_sam"));
        (FARPROC&)rf_sam_rst = GetProcAddress(m_hInstMaster, _T("rf_sam_rst"));
        (FARPROC&)rf_sam_cos = GetProcAddress(m_hInstMaster, _T("rf_sam_cos"));
        (FARPROC&)rf_init_type = GetProcAddress(m_hInstMaster, _T("rf_init_type"));
        (FARPROC&)rf_antenna_sta = GetProcAddress(m_hInstMaster, _T("rf_antenna_sta"));
        (FARPROC&)rf_request = GetProcAddress(m_hInstMaster, _T("rf_request"));
        (FARPROC&)rf_anticoll = GetProcAddress(m_hInstMaster, _T("rf_anticoll"));
        (FARPROC&)rf_select = GetProcAddress(m_hInstMaster, _T("rf_select"));
        (FARPROC&)rf_halt = GetProcAddress(m_hInstMaster, _T("rf_halt"));
        (FARPROC&)rf_download_key = GetProcAddress(m_hInstMaster, _T("rf_download_key"));
        (FARPROC&)rf_M1_authentication1 = GetProcAddress(m_hInstMaster, _T("rf_M1_authentication1"));
        (FARPROC&)rf_M1_authentication2 = GetProcAddress(m_hInstMaster, _T("rf_M1_authentication2"));
        (FARPROC&)rf_M1_read = GetProcAddress(m_hInstMaster, _T("rf_M1_read"));
        (FARPROC&)rf_M1_write = GetProcAddress(m_hInstMaster, _T("rf_M1_write"));
        (FARPROC&)rf_M1_initval = GetProcAddress(m_hInstMaster, _T("rf_M1_initval"));
        (FARPROC&)rf_M1_readval = GetProcAddress(m_hInstMaster, _T("rf_M1_readval"));
        (FARPROC&)rf_M1_decrement = GetProcAddress(m_hInstMaster, _T("rf_M1_decrement"));
        (FARPROC&)rf_M1_increment = GetProcAddress(m_hInstMaster, _T("rf_M1_increment"));
        (FARPROC&)rf_M1_restore = GetProcAddress(m_hInstMaster, _T("rf_M1_restore"));
        (FARPROC&)rf_M1_transfer = GetProcAddress(m_hInstMaster, _T("rf_M1_transfer"));
        (FARPROC&)rf_typea_rst = GetProcAddress(m_hInstMaster, _T("rf_typea_rst"));
        (FARPROC&)rf_cos_command = GetProcAddress(m_hInstMaster, _T("rf_cos_command"));
        (FARPROC&)rf_atqb = GetProcAddress(m_hInstMaster, _T("rf_atqb"));
        (FARPROC&)rf_attrib = GetProcAddress(m_hInstMaster, _T("rf_attrib"));
        (FARPROC&)rf_typeb_cos = GetProcAddress(m_hInstMaster, _T("rf_typeb_cos"));
        (FARPROC&)rf_hltb = GetProcAddress(m_hInstMaster, _T("rf_hltb"));
        (FARPROC&)rf_at020_check = GetProcAddress(m_hInstMaster, _T("rf_at020_check"));
        (FARPROC&)rf_at020_read = GetProcAddress(m_hInstMaster, _T("rf_at020_read"));
        (FARPROC&)rf_at020_write = GetProcAddress(m_hInstMaster, _T("rf_at020_write"));
        (FARPROC&)rf_at020_lock = GetProcAddress(m_hInstMaster, _T("rf_at020_lock"));
        (FARPROC&)rf_at020_count = GetProcAddress(m_hInstMaster, _T("rf_at020_count"));
        (FARPROC&)rf_at020_deselect = GetProcAddress(m_hInstMaster, _T("rf_at020_deselect"));
        (FARPROC&)rf_light = GetProcAddress(m_hInstMaster, _T("rf_light"));
        (FARPROC&)rf_ClosePort = GetProcAddress(m_hInstMaster, _T("rf_ClosePort"));
        (FARPROC&)rf_GetErrorMessage = GetProcAddress(m_hInstMaster, _T("rf_GetErrorMessage"));

        if (NULL == lib_ver ||
            NULL == des_encrypt ||
            NULL == des_decrypt ||
            NULL == rf_init_com ||
            NULL == rf_init_device_number ||
            NULL == rf_get_device_number ||
            NULL == rf_get_model ||
            NULL == rf_beep ||
            NULL == rf_init_sam ||
            NULL == rf_sam_rst ||
            NULL == rf_sam_cos ||
            NULL == rf_init_type ||
            NULL == rf_antenna_sta ||
            NULL == rf_request ||
            NULL == rf_anticoll ||
            NULL == rf_select ||
            NULL == rf_halt ||
            NULL == rf_download_key ||
            NULL == rf_M1_authentication1 ||
            NULL == rf_M1_authentication2 ||
            NULL == rf_M1_read ||
            NULL == rf_M1_write ||
            NULL == rf_M1_initval ||
            NULL == rf_M1_readval ||
            NULL == rf_M1_decrement ||
            NULL == rf_M1_increment ||
            NULL == rf_M1_restore ||
            NULL == rf_M1_transfer ||
            NULL == rf_typea_rst ||
            NULL == rf_cos_command ||
            NULL == rf_atqb ||
            NULL == rf_attrib ||
            NULL == rf_typeb_cos ||
            NULL == rf_hltb ||
            NULL == rf_at020_check ||
            NULL == rf_at020_read ||
            NULL == rf_at020_write ||
            NULL == rf_at020_lock ||
            NULL == rf_at020_count ||
            NULL == rf_at020_deselect ||
            NULL == rf_light ||
            NULL == rf_ClosePort ||
            NULL == rf_GetErrorMessage)
        {
            return false;
        }
    }
    else
    {
        int err = GetLastError();
        return false;
    }

    return true;
}

bool MifareOne::CloseDll()
{
    if(m_hInstMaster)
    {
        FreeLibrary(m_hInstMaster);
        lib_ver = NULL;
        des_encrypt = NULL;
        des_decrypt = NULL;
        rf_init_com = NULL;
        rf_init_device_number = NULL;
        rf_get_device_number = NULL;
        rf_get_model = NULL;
        rf_beep = NULL;
        rf_init_sam = NULL;
        rf_sam_rst = NULL;
        rf_sam_cos = NULL;
        rf_init_type = NULL;
        rf_antenna_sta = NULL;
        rf_request = NULL;
        rf_anticoll = NULL;
        rf_select = NULL;
        rf_halt = NULL;
        rf_download_key = NULL;
        rf_M1_authentication1 = NULL;
        rf_M1_authentication2 = NULL;
        rf_M1_read = NULL;
        rf_M1_write = NULL;
        rf_M1_initval = NULL;
        rf_M1_readval = NULL;
        rf_M1_decrement = NULL;
        rf_M1_increment = NULL;
        rf_M1_restore = NULL;
        rf_M1_transfer = NULL;
        rf_typea_rst = NULL;
        rf_cos_command = NULL;
        rf_atqb = NULL;
        rf_attrib = NULL;
        rf_typeb_cos = NULL;
        rf_hltb = NULL;
        rf_at020_check = NULL;
        rf_at020_read = NULL;
        rf_at020_write = NULL;
        rf_at020_lock = NULL;
        rf_at020_count = NULL;
        rf_at020_deselect = NULL;
        rf_light = NULL;
        rf_ClosePort = NULL;
        rf_GetErrorMessage = NULL;
        m_hInstMaster = NULL;
        return true;
    }
    return false;
}

bool MifareOne::OpenComm(int com, int baud)
{
    //save port and baud
    mCommPort = com;
    mBandRate = baud;

    //open port
    int state = 1;
    state = rf_init_com(com, baud);

    if (state != LIB_SUCCESS){
        rf_ClosePort();
        return false;
    }

    return true;  // return TRUE  unless you set the focus to a control
}

bool IsCloseComm = false;
void MifareOne::CloseComm()
{
    if (IsCloseComm)
        return;

    rf_ClosePort();
    IsCloseComm = true;
}

int MifareOne::Write(unsigned char* strData)
{
    WORD icdev = 0x0000;
    unsigned char mode = 0x60; // key A
    unsigned char secnr = '\x1';
    int state;
    unsigned char strKey[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0 };
    int nSel = 1;

    state = rf_M1_authentication2(icdev, mode, (secnr / 4) * 4, strKey);
    if (state){
        return -1;
    }

    unsigned char strEncryptData[MAX_RF_BUFFER];
    state = Encrypt(strEncryptData, strData, (unsigned char*)Encrypt_Key);
    if (state){
        return -1;
    }

    state = rf_M1_write(icdev, secnr, strEncryptData);
    if (state){
        return -1;
    }

    return 1;
}

主CPP

int main(int argc, const char* argv[])
{
    MifareOne cardReader1;
    MifareOne cardReader2;

    cardReader1.OpenComm(4, 9600);
    cardReader2.OpenComm(9, 9600);

    cardReader1.Write((unsigned char*) "testing");   // Not work
    cardReader2.Request((unsigned char*) "testing"); // Work fine
}

最佳答案

您的问题是,用于访问RFID设备的DLL仅支持一次访问一个设备。您对MifareOne::OpenComm方法进行的两个调用均在同一rf_init_com中调用同一MasterRD.dll函数。 rf_init_com方法不会返回可用于区分多个连接的任何类型的句柄,因此MifareOne::Write方法无法告诉DLL您要使用两个连接中的哪一个。

鉴于DLL不允许您一次打开多个设备,因此只有两种可能的解决方法。第一个在两个不同的进程中使用DLL,每个进程与一个不同的RFID设备通信。在这种情况下,DLL在每个进程中将具有单独的内部状态,使您可以在每个进程中使用它来打开不同的设备。然后,您必须使用Windows的许多进程间通信方法之一,以允许这两个进程相互协调或与主进程协调。

第二种是直接通过串行端口与RFID设备通信。 Windows使您可以打开在同一进程中同时打开的多个串行设备。使用此替代方法意味着您必须处理与设备进行交谈的所有低级协议详细信息。与您使用的DLL相同的低级详细信息旨在使您与之隔离。您也可能会使用异步I / O或多个线程来避免从两个设备进行读写时的死锁。

关于c++ - 如何在C++中同时连接2个RFID阅读器? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25402145/

10-12 05:38