ReadFile () выдает ошибку 998 при попытке прочитать данные с USB-порта - PullRequest
0 голосов
/ 21 мая 2018

Я пытаюсь отправить данные с платы обнаружения STM32 на хост-компьютер через USB с помощью моего собственного приложения.Мне удалось отправить данные в STM.Я использовал WriteFile для этого.Для чтения данных я вызываю функцию readSerialPort(), которая вызывает функцию ReadFile().

В main.c readSerialPort() вызывается в цикле while.Всякий раз, когда я отправляю некоторые тестовые данные (4 случайных байта) на ПК, я вижу, что status.cbInQue увеличивается с 4, но ReadFile не возвращает TRUE, чтобы показать, что он закончил помещать данные в указатель буфера, ведущий к receivedData().

Когда я делаю GetLastErrror(), он возвращает код ошибки 998. Что означает ERROR_NOACCESS , обычно это означает, что выделенный массив не совпадает с buf_size, но это так.Итак, что вызывает эту ошибку и делает невозможным получение данных от STM через USB?

(Я довольно новичок в вопросе о Stackoverflow, поэтому дайте мне знать, если мне нужно улучшить то, как язадавать этот вопрос)

main.c

char* receivedData[31];     
uint32_t id = 0;        
while(1) {  
if (readSerialPort(*receivedData, 31)) {
    printf("%d - %s\n", id, receivedData);
    id++;       
} else {            
    printf("error %u\n", GetLastError());       
}

comm.c

#include "comm.h"

HANDLE handler;
uint8_t connected;

COMSTAT status;
DWORD errors;

int connectSerial(char* portName) {
    connected = 0;
    handler = CreateFileA(portName,
                                GENERIC_READ | GENERIC_WRITE,
                                0,
                                0,
                                OPEN_EXISTING,
                                FILE_ATTRIBUTE_NORMAL,
                                0);
    if (handler == INVALID_HANDLE_VALUE) {
        if (GetLastError() == ERROR_FILE_NOT_FOUND) {
            printf("ERROR: Handle was not attached. Reason: %s not available\n", portName);
        } else {
            printf("ERROR!!!");
        }
    } else {
        DCB dcbSerialParameters = { 0 };

        if (!GetCommState(handler, &dcbSerialParameters)) {
            printf("failed to get current serial parameters");
        } else {
            connected = 1;
            PurgeComm(handler, PURGE_RXCLEAR | PURGE_TXCLEAR);
            //  Sleep(2000);
        }
    }
}

void disconnectSerial() {
    if (connected) {
        connected = 0;
        CloseHandle(handler);
    }
}

uint8_t readSerialPort(char* buffer, unsigned int buf_size) {
    DWORD bytesRead;
    unsigned int toRead;

    ClearCommError(handler, &errors, &status);

    if (status.cbInQue > 0) {
        if (status.cbInQue > buf_size) 
            toRead = buf_size;
        else
            toRead = status.cbInQue;
    }

    if (ReadFile(handler, buffer, toRead, &bytesRead, NULL))
        return bytesRead;
    return 0;
}

uint8_t writeSerialPort(char* buffer, unsigned int buf_size) {
    DWORD bytesSend;

    if (!WriteFile(handler, (void*)buffer, buf_size, &bytesSend, 0)) {
        ClearCommError(handler, &errors, &status);
        return 0;
    }
    else return 1;
}

1 Ответ

0 голосов
/ 22 мая 2018

Первый комментарий Джонни решил мою проблему:

char* receivedData[31]; - это массив неинициализированных указателей.Вы имели в виду char receivedData[31];?А затем позвоните: if (readSerialPort(receivedData, 31)) {

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