Проблема данных последовательной связи между Windows и встроенной системой (STM32) (C / C ++) - PullRequest
0 голосов
/ 17 января 2019

В настоящее время я пытаюсь установить связь между программой Windows и микроконтроллером. Я покажу вам код для инициализации порта:

int serialCommunication::serialInit(void){

//non overlapped communication
hComm = CreateFile( gszPort.c_str(),
                    GENERIC_READ | GENERIC_WRITE,
                    0,
                    0,
                    OPEN_EXISTING,
                    0,
                    0);

if (hComm == INVALID_HANDLE_VALUE){
    cout << "Error opening port." << endl;
    return 0;
}
else{
    cout << "Opened Port successfully." << endl;
}

if (SetCommMask(hComm, EV_RXCHAR) == FALSE){
    cout << "Error setting communications mask." << endl;
    return 0;
}
else{
    SetCommMask(hComm, EV_RXCHAR);
    cout << "Communications mask set successfully." << endl;
}

if (GetCommState(hComm, &dcbSerialParams) == FALSE){
    cout << "Error getting CommState." << endl;
    return 0;
}
else{
    GetCommState(hComm, &dcbSerialParams);
    cout << "CommState retrieved successfully" << endl;
}

dcbSerialParams.BaudRate = CBR_115200;    // Setting BaudRate = 115200
dcbSerialParams.ByteSize = 8;             // Setting ByteSize = 8
dcbSerialParams.StopBits = ONESTOPBIT;    // Setting StopBits = 1
dcbSerialParams.Parity = NOPARITY;        // Setting Parity = None

if (SetCommState(hComm, &dcbSerialParams) == FALSE){
    cout << "Error setting CommState" << endl;
    return 0;
}
else{
    SetCommState(hComm, &dcbSerialParams);
    cout << "CommState set successfully" << endl << endl;
    cout << "+---CommState Parameters---+" << endl;
    cout << "Baudrate = " << dcbSerialParams.BaudRate << endl;
    cout << "ByteSize = " << static_cast<int>(dcbSerialParams.ByteSize) << endl; //static Cast, um int auszugeben und kein char
    cout << "StopBits = " << static_cast<int>(dcbSerialParams.StopBits) << endl; //static Cast, um int auszugeben und kein char
    cout << "Parity = " << static_cast<int>(dcbSerialParams.Parity) << endl; //static Cast, um int auszugeben und kein char
    cout << "+--------------------------+" << endl;
}

/*------------------------------------ Setting Timeouts --------------------------------------------------*/

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

if (SetCommTimeouts(hComm, &timeouts) == FALSE){
    cout << "Error setting timeouts" << endl;
    return 0;
}
else{
    SetCommTimeouts(hComm, &timeouts);
    cout << "Timeouts set successfully." << endl;
    cout << "+--------------------------+" << endl;
    return 1;
}

Моя функция чтения выглядит следующим образом:

void serialCommunication::serialRead(void){
bool readStatus;
bool purgeStatus = 0;
bool correctData = 0;

cout << "Waiting for Data..." << endl; // Programm waits and blocks Port (like Polling)
readStatus = WaitCommEvent(hComm, &dwEventMask, 0);
if (readStatus == FALSE){
    cout << "Error in setting WaitCommEvent." << endl;
}
else{
    cout << "Data received." << endl;
    do{
        readStatus = ReadFile(hComm, &TempChar, sizeof(TempChar), &NoBytesRead, 0);
        SerialBuffer += TempChar; // add tempchar to the string
    }while (NoBytesRead > 0);
SerialBuffer.pop_back(); // Delete last sign in buffer, otherwise one "0" too much shows up, for example "23900" instead of "2390"
cout << endl << SerialBuffer << endl;
SerialBuffer = ""; // Reset string
}

Так что в какой-то момент мой µC отправляет строку «Инициация завершена ...! \ R \ n» после инициализации некоторых вещей. Это хорошо работает. Инициация полного доказательства

Теперь после этого сообщение вызывает ошибки. Я получаю данные, которые не должен получать. Микроконтроллер может отправлять данные только в том случае, если на ПК ему передана определенная строка. Во время отладки я мог обнаружить, что микроконтроллер никогда не получает эту конкретную строку и, следовательно, никогда не отправляет данные. На следующей картинке я покажу вам, какой бред я постоянно получаю. Получение Гиббэриш / РЕДАКТИРОВАТЬ: я постоянно получаю один и тот же бред,

Забавно, я даже получаю эти данные, когда микроконтроллер полностью выключен (последовательные кабели все еще подключены). Поэтому в порту должны быть какие-то данные, которые просто не удаляются. Я попытался перезагрузить компьютер, но это тоже не помогло.

Я также покажу вам свой цикл while на ПК:

while (testAbbruch != 1){
    pointer = acMessung(anzahlMessungen, average); // measurement with external multimeter
    cout << endl;
    cout << "Average: " << average << endl << endl;

    if (average >= 30){
        testAbbruch = 1; // there won't be a next while iteration
        befehl = "stopCalibration\r\n";
        serialTest.serialWrite(befehl);
        serialTest.serialRead();
    }
    else{
        cout << "Aktion: ";
        std::getline (cin, befehl);
        befehl = "increment"; //for debugging

        if (befehl == "increment"){
            befehl.append("\r\n"); // adding it, so the µC can detect the string correctly
            serialTest.serialWrite(befehl);
            serialTest.serialRead(); // µC has to answer
        }
        else if(befehl == "decrement"){
            befehl.append("\r\n"); // adding it, so the µC can detect the string correctly
            serialTest.serialWrite(befehl);
            serialTest.serialRead(); // µC has to answer
        }
        befehl = ""; // string leeren für nächsten Aufruf
    }
}

Я знаю, что моя программа далека от совершенства, но если я правильно понял последовательную связь с Windows, буфер будет удален во время чтения. Можете ли вы дать мне подсказку?

EDIT // Я только что написал программу, которая ожидает один из двух входов: один ввод называется «приращением», другой - «декрементом». Эти входы отправляются в микроконтроллер через последовательный порт связи. Каждый раз, когда я пытаюсь отправить «инкремент», и сразу после этого я читаю из порта, я получаю странные данные с этой картинки. Теперь, каждый раз, когда я пытаюсь отправить «декремент» и сразу после этого Я читаю из порта, я получаю странные данные с этой картинки . //

Итак, я предполагаю, что данные каким-то образом изменяются и затем возвращаются на ПК? Но почему и как?!

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