Skip to main content
2 of 4
added 43 characters in body
Bhoke
  • 321
  • 3
  • 11
#include <windows.h>

std::string portNumber;
HANDLE hSerial;
bool connected;
COMSTAT status;
DWORD errors;

bool connectPrinter(char *portName){

    //Connects to the port.
    this->hSerial = CreateFileA(portName,
    GENERIC_READ | GENERIC_WRITE,
    0,
    NULL,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    NULL);

    if(this->hSerial==INVALID_HANDLE_VALUE)
    {
        if(GetLastError()==ERROR_FILE_NOT_FOUND){
            printf("ERROR: Handle was not attached. Reason: %s not available.\n", portName);
            return false;
        }
        else
        {   
            //If port is in use by another program or did not closed previous process.
            printf("ERROR!!! \n");
            CloseHandle(hSerial);
            return false;
        }
    }
    else
    {
        
        DCB dcbSerialParams = {0};

        if (!GetCommState(this->hSerial, &dcbSerialParams))
        {
            printf("failed to get current serial parameters!");
            return false;
        }
        else
        {
            // Set Serial Port specifications.
            //TODO:Different Baudrates will be added with respect to Combobox baudRateList selection.
            dcbSerialParams.BaudRate=CBR_115200;
            dcbSerialParams.ByteSize=8;
            dcbSerialParams.StopBits=ONESTOPBIT;
            dcbSerialParams.Parity=NOPARITY;

             if(!SetCommState(hSerial, &dcbSerialParams))
             {
                printf("ALERT: Could not set Serial Port parameters");
                return false;
             }
             else
             {
                 this->connected = true;
                 printf("Connection Successful for :%s !!! \n" ,portName);
                 //Wait 2s as the arduino board will be reseting
                 return true;
                 Sleep(ARDUINO_WAIT_TIME);
             }
        }
    }

}


int readData(char *buffer,unsigned int nbChar){

    DWORD bytesRead;
    DWORD dwCommModemStatus;
    
        //Set the type of data to be caught.(RXCHAR -> Data available on RX pin.)
        SetCommMask (this->hSerial, EV_RXCHAR );

        while (this->hSerial != INVALID_HANDLE_VALUE) 
        {
          // Wait for an event to occur for the port.
          WaitCommEvent (this->hSerial, &dwCommModemStatus, 0);
          if (dwCommModemStatus & EV_RXCHAR ) 
          {
                //unsigned int toRead;
                //ClearCommError(this->hSerial, &this->errors, &this->status);
                if(this->status.cbInQue>0)
                do 
                {
                  // Read the data from the serial port.
                    ReadFile (this->hSerial, buffer, 1, &bytesRead, 0);
                  // Display the data read.
                  if (bytesRead == 1)
                      printf ("%s" ,buffer);

                } while (bytesRead > 0);
          }

        }

    //}
    
    //If nothing has been read, or that an error was detected return -1
    return -1;
}


    void main() {
    
    char* buffer = new char (32768);
    int nbChar= 32768;

    connectPrinter("COMx"); // Use your port number to connect
    readData(buffer,nbChar);
    
    }

try this one, it should work. Comment below if it does not work. You have to reset Arduino to read data in method void setup() in Arduino code. I recommend you to use C#, Java or Python for efficiency.

Bhoke
  • 321
  • 3
  • 11