Не срабатывает else С++ ReadFile com

136
22 декабря 2020, 13:20

Читаю данные с последовательного порта, с arduino. Нашел код в интернете, но он странно работает.

При чтении срабатывает условие считаных данных, но в противоположном случаи не срабатывает.

while(1)
{
    // memset(szBuff,0,sizeof(szBuff));
    if( ReadFile(hSerial, LPVOID(szBuff), 1, &dwBytesRead, NULL))
    {
        cout << szBuff;
    }
    else
        cout << "noooooooo";    
}

=================================

#include<Windows.h>
#include<stdio.h>
#include<iostream>
using namespace std;
void main()
{
    HANDLE hSerial;
    hSerial = CreateFile(TEXT("COM3"), 
                         GENERIC_READ | GENERIC_WRITE, 
                         0,
                         NULL, 
                         OPEN_EXISTING,                              
                         FILE_ATTRIBUTE_NORMAL,
                         //FILE_FLAG_OVERLAPPED, 
                         NULL);        
    if ( hSerial == INVALID_HANDLE_VALUE)
    {
        printf("Error initializing handler");
    } 
    else 
    {    
        // Set the parameters of the handler to the serial port.
        DCB dcb = {0};    
        dcb.DCBlength = sizeof(dcb);
        if ( !GetCommState(hSerial, &dcb) )
        {
            printf("Error setting parameters");
        }
        //FillMemory(&dcb, sizeof(dcb), 0);
        dcb.BaudRate = CBR_9600;
        dcb.ByteSize = 8;
        dcb.StopBits = ONESTOPBIT;
        dcb.Parity = NOPARITY;
        if ( !SetCommState(hSerial, &dcb) )
        {
        // error setting serial port state.
        }
        // Tell the program not to wait for data to show up
        COMMTIMEOUTS timeouts = {0};
        timeouts.ReadIntervalTimeout = 0;//20;
        timeouts.ReadTotalTimeoutConstant = 0;//20;
        timeouts.ReadTotalTimeoutMultiplier = 0;//50;
        timeouts.WriteTotalTimeoutConstant = 0;//100;
        timeouts.WriteTotalTimeoutMultiplier = 0;//100;
        //if ( !SetCommTimeouts(hSerial, &timeouts) )
        //{
        // printf("Error setting the timeouts");
        //}
        char szBuff[2] = "";
        DWORD dwBytesRead = 0;
        int i = 0;
        char test[] = "B\n";
        // int maxSamples = 10;
        // DWORD dwCommStatus;
        // WriteFile(hSerial, test, 2, &dwBytesRead, NULL);
        // SetCommMask(hSerial,EV_RXCHAR);
        // WaitCommEvent (hSerial, &dwCommStatus, 0);
        // if (dwCommStatus & EV_RXCHAR) 
        {    
            while(1)
            {
                // memset(szBuff,0,sizeof(szBuff));
                if( ReadFile(hSerial, LPVOID(szBuff), 1, &dwBytesRead, NULL))
                {
                    cout<<szBuff;
                }
                else
                    cout << "noooooooo";    
            }            
        }                      
        CloseHandle(hSerial);
    }
}
Answer 1

Функция ReadFile возвращает TRUE в случае успеха, и FALSE в случае, если произошла ошибка при чтении файла. ReadFile function, File API

READ ALSO
C++ COM с помощью fstream

C++ COM с помощью fstream

Читаю данные из ком порта делал это с помощью readFile С которым раньше серьёзно никогда не работал, код просто непонятныйПотом подумал если...

129
В чем ошибка использования strlen?

В чем ошибка использования strlen?

Почему не выводит текст с буквой t на конце? Правильно ли я пытаюсь задать конец строки?

128
SDL2 - как перемещать окно без заголовка

SDL2 - как перемещать окно без заголовка

Как правильно в SDL2 перемещать окно без заголовка, по аналогии с winapi используя WM_NCHITTEST

128