Почему я получаю Тайм-аут в PortRead () в Visual C ++? - PullRequest
0 голосов
/ 15 марта 2012

Я пытаюсь использовать интерфейс jni для программирования последовательных портов, используя Microsoft Visual Studio 11 с .NET 4.0.

Я получаю следующую ошибку при попытке прочитать с порта связи:

time out happened in PortRead()

Значение времени ожидания чтения установлено на 5 секунд.

Следующее является частью кода: Кроме того, поскольку мой ноутбук 64-разрядный, я использую bafo, то есть 64-разрядный преобразователь, а затем подключаю провод RS232.

JNIEXPORT jint JNICALL Java_JavaSerial_Read(JNIEnv *env, jobject obj)
{
    jint idata = 0;
    char cdata[8];
    ERR_CODE rc = OK;
    CommPortClass* commClass;
    commClass = new CommPortClass;
    commClass->iMaxChars = 1;
    rc = PortRead(commClass);
    if (rc != OK)
        Msg("ERROR in PortRead()! ");

    sprintf_s(cdata, "%d", commClass->pcBuffer[0]);
    idata = atoi(cdata);
    delete commClass;
    return idata;
}

//Port read function
ERR_CODE PortRead(CommPortClass *hCommPort)
{
    HANDLE hThread; // handler for port read thread
    DWORD IDThread;
    DWORD Ret, ExitCode;
    DWORD dTimeout = 5000; // define time out value: 5 sec.
    ERR_CODE ecStatus = OK;
    if (!(hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) ThreadFunc, (LPVOID)hCommPort, CREATE_SUSPENDED, &IDThread) ) ) 
    // no security attributes, use default stack size, parameter to thread function, creation flag - suspended, returns thread ID
    {
        Msg("Create Read Thread failed");
        return EC_CREATE_THREAD;
    }

    ResumeThread(hThread); // start thread now
    Ret = WaitForSingleObject(hThread, dTimeout);
    if (Ret == WAIT_OBJECT_0)
    {
        // Data received & process it... need to do nothing because the data is stored in the
        // hCommPort in the Thread Function. The only thing is to close thread handle
        CloseHandle(hThread);
    }
    else if (Ret == WAIT_TIMEOUT) // Time out happened
    { 
        // Warning & kill thread
        Ret = GetExitCodeThread(hThread, &ExitCode);
        Msg("Time out happened in PortRead() ");
        if (ExitCode == STILL_ACTIVE)
        {
            TerminateThread(hThread, ExitCode);
            CloseHandle(hThread);
            return EC_RECV_TIMEOUT;
        }
        else
        {
            CloseHandle(hThread);
            Msg("ERROR in GetExitCodeThread: != STILL_ACTIVE ");
            ecStatus = EC_EXIT_CODE;
        }
    }
    else
    {
        Msg("ERROR in WaitFor SingleObject ");
        ecStatus = EC_WAIT_SINGLEOBJ;
    }
    return ecStatus;
}

//Thread() function
void WINAPI ThreadFunc(void* hCommPorts)
{
    char Byte;
    BOOL bResult, fDone;
    int nTotRead = 0;
    DWORD dwCommModemStatus, dwBytesTransferred;
    CommPortClass* CommPorts;
    ERR_CODE ecStatus = OK;
    CommPorts = (CommPortClass* )hCommPorts;
    // Specify a set of events to be monitored for the port.
    SetCommMask(hPort, EV_RXCHAR | EV_CTS | EV_DSR | EV_RLSD | EV_RING);
    fDone = FALSE;
    while (!fDone)
    {
        // Wait for an event to occur for the port.
        WaitCommEvent(hPort, &dwCommModemStatus, 0);
        // Re-specify the set of events to be monitored for the port.
        SetCommMask(hPort, EV_RXCHAR | EV_CTS | EV_DSR |EV_RLSD| EV_RING);
        if (dwCommModemStatus & EV_RXCHAR||dwCommModemStatus & EV_RLSD)
        {
            // received the char_event & loop to wait for the data.
            do
            {
                // Read the data from the serial port.
                bResult = ReadFile(hPort, &Byte, 1, &dwBytesTransferred, 0);
                if (!bResult)
                {
                    Msg("ERROR in ReadFile !");
                    fDone = TRUE;
                    break;
                }
                else
                {
                    // Display the data read.
                    if (dwBytesTransferred == 1)
                    {
                        CommPorts->pcBuffer[nTotRead] = Byte;
                        nTotRead++;
                        if (nTotRead == CommPorts->iMaxChars)
                        {
                            fDone = TRUE;
                            break;
                        }
                    }
                    else
                    {
                        if (Byte == 0x0D ||Byte == 0x0A) // null char or CR
                        {
                            Msg("Received null character ");
                            fDone = TRUE;
                            break;
                        }
                    }
                }
            } while (dwBytesTransferred == 1); //while (nTotRead < pRecv->iMaxChars);
        } // if
    } // while
    return;
}
...