WinAPI ReadFile возвращает 0 байт - PullRequest
2 голосов
/ 26 мая 2011

Я что-то не так делаю или устройство просто не отвечает? Как читать данные из com порта, сейчас я делаю это:

hCom = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, NULL);


Other settings ....


DWORD dwBytesCount = 0;
    unsigned char response[5] = {0};
    unsigned char command[6] = {0x0A, 0xFF, 0x03, 0x20, 0x04};
    command[5] = Crc8(command, 5);
    printf("\ncrc-8 sum is:%d", command[5]);

    if(!(WriteFile(hCom, command, 6, &dwBytesCount, NULL)) || (dwBytesCount != 6)) {
        dwErrorCode = GetLastError();
        printf("\nError in function WriteFile, error code:%ld, bytes write:%ld", GetLastError(), dwBytesCount);
        std::cin >> input;
        return false;
    }
    printf("\nwrite bytes is:%ld", dwBytesCount);

//  DWORD dwMask;
//  printf("\nWaitCommEvent");
//  if(!WaitCommEvent(hCom, &dwMask, NULL)) {
//      printf("\nError in function WaitCommEvent, error code:%ld", GetLastError());
//      std::cin >> input;
//      return false;
//  }

    for(int i = 0; i < 10; ++i) {
        printf("\nread file");
        if(!(ReadFile(hCom, response, 4, &dwBytesCount, NULL))) {
            dwErrorCode = GetLastError();
            printf("\nError in function ReadFile, error code:%ld, bytes read:%ld", GetLastError(), dwBytesCount);
            std::cin >> input;
            return false;
        }
        Sleep(100);
        printf("\nread bytes is:%ld", dwBytesCount);
    }
    printf("\nread bytes is:%ld", dwBytesCount);
    printf("\nreader response status is:%d", response[3]);
    std::cin >> input;

Он читает ноль байтов. Если я раскомментирую WaitCommEvent, программа зависнет.

Я пробовал версию с флагом OVERLAPPED и GetOverlappedResult после каждой операции, результат одинаков.

дополнение

Как я понимаю, он не может одновременно подключиться к COM-порту. http://www.ms -news.net / f3608 / CreateFile-разделяемой режим-оленья кожа-работа-2057561.html

Соединение во втором потоке дает тот же результат

Другие настройки:

            SetCommMask(hCom, (EV_RXCHAR | EV_RXFLAG | EV_BREAK | EV_CTS | EV_DSR | EV_ERR | EV_RING | EV_RLSD));

            if(!(GetCommTimeouts(hCom, &timeout))) {
                printf("Error in function GetCommTimeouts error code:%ld", GetLastError());
                std::cin >> input;
                return false;
            }

            timeout.ReadIntervalTimeout = 50;
            timeout.ReadTotalTimeoutConstant = 50;
            timeout.ReadTotalTimeoutMultiplier = 10;
            timeout.WriteTotalTimeoutConstant = 50;
            timeout.WriteTotalTimeoutMultiplier = 10;

                    //timeout.ReadIntervalTimeout = 0xFFFFFFFF;
            //timeout.ReadTotalTimeoutConstant = 1000;
            //timeout.ReadTotalTimeoutMultiplier = 0;
            //timeout.WriteTotalTimeoutConstant = 1000;
            //timeout.WriteTotalTimeoutMultiplier = 0;

            if(!(SetCommTimeouts(hCom, &timeout))) {
                printf("Error in function GetCommTimeouts error code:%ld", GetLastError());
                std::cin >> input;
                return false;
            }

        if(!(SetupComm(hCom, 128, 128))) {
            printf("Error in function SetupComm error code:%ld", GetLastError());
            std::cin >> input;
            return false;
        }

        if(!(GetCommState(hCom, &ComDCM))) {
            printf("Error in function GetCommState error code:%ld", GetLastError());
            std::cin >> input;
            return false;
        }

        ComDCM.BaudRate = 115200;
        ComDCM.ByteSize = 8;
        ComDCM.Parity = NOPARITY;
        ComDCM.StopBits = ONESTOPBIT;
        ComDCM.fAbortOnError = TRUE;
        ComDCM.fDtrControl = DTR_CONTROL_DISABLE;
        ComDCM.fRtsControl = RTS_CONTROL_DISABLE;
        ComDCM.fBinary = TRUE;
        ComDCM.fParity = FALSE;
        ComDCM.fInX = ComDCM.fOutX = FALSE;
        ComDCM.XonChar = 0;
        ComDCM.XoffChar = uint8_t(0xff);
        ComDCM.fErrorChar = FALSE;
        ComDCM.fNull = FALSE;
        ComDCM.fOutxCtsFlow = FALSE;
        ComDCM.fOutxDsrFlow = FALSE;
        ComDCM.XonLim = 128;
        ComDCM.XoffLim = 128;

        if(!(SetCommState(hCom, &ComDCM))) {
            printf("Error in function SetCommState error code:%ld", GetLastError());
            std::cin >> input;
            return false;
        }

        printf("success");
        std::cin >> input;

сложение 2

Я тестировал этот код с эмулятором com-порта, и он работает, это означает, что проблема в устройстве.

Спасибо всем за ответы и помощь

Ответы [ 2 ]

3 голосов
/ 26 мая 2011

Вам следует немного разбить эту проблему, если только какой-то другой постер уже не обнаружил ошибку.

Что-нибудь отправлено? Если вы задаете область tx или подключаетесь к другому порту, к которому подключена какая-то эффективная терминальная программа или даже HyperTerm, выходят ли командные символы? WaitCommEvent блокируется, если работает в режиме без наложения, и поэтому, если он не закомментирован, а поток блокируется на нем, вероятно, символы не принимаются вообще. Возможной причиной этого являются многие - кабели, разъемы, несоответствие скорости передачи данных, неправильное управление потоком и весь другой болезненный багаж, связанный с RS232.

Не перекрывающийся ввод-вывод лучше всего выполнять в отдельном потоке, но, тем не менее, вы должны получить что-то здесь, я думаю, если ссылка работает и партнер способен ответить.

Rgds, Martin

Кстати, «Другие настройки» - это порядок, который я использую. Работает на всех ОС от W2k до W7:

CreateFile (); SetupComm (); setCommTimeouts (); SetCommState (); SetCommMask (); ReadWriteStuff ();

Martin

1 голос
/ 26 мая 2011

Вы установили структуру COMMTIMEOUTS с правильными значениями и вызвали функцию SetCommTimeouts?Пожалуйста, обратитесь к: http://msdn.microsoft.com/en-us/library/aa363190 для получения дополнительной информации.Особенно в разделе примечаний.

Этот признак может появиться, когда ReadIntervalTimeout элемент установлен на MAXDWORD, а элементы ReadTotalTimeoutConstant и ReadTotalTimeoutMultiplier установлены на ноль, поскольку эта конкретная комбинация значений позволяет ReadFile для немедленной повторной настройки, даже если не было получено ни одного байта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...