Slow C++ serial COMM port with gyroscope

I have a gyroscope (MPU6050) attached to my Arduino UNO. I have written a Processing script to read the serial data(get the angles) from the Gyroscope and its working fine.
Now I would like to integrate it with a C++ OpenCV project. I use this tutorial class for serial communications: Arduino Playground - CPPWindows

However, the serial communications is very slow, the 256 char array is filled in around 1.5 seconds. Thats around 170 chars/sec = 1.36 kbps.

So the question is: If the serial port works fast for Processing how come it is much slower using C++? Is there any alternative way for reading the gyroscope data to C++?
here is how the serial port opened

HANDLE hPort = CreateFile( 
 PortSpecifier, 
GENERIC_READ, 
 0, 
 NULL, 
 OPEN_EXISTING, 
 0, 
 NULL 
 );

and here is how I read the data

SetCommMask (hPort, EV_RXCHAR | EV_ERR); //receive character event 
 WaitCommEvent (hPort, &dwCommModemStatus, 0); //wait for character 
 ReadFile (hPort, buffer, 256, &dwBytesTransferred, 0); // Read 256 chars

Any help will be appreciated

Where are you setting the baud rate?

 ReadFile (hPort, buffer, 256, &dwBytesTransferred, 0); // Read 256 chars

This comment is wrong. The function will read UP TO 256 characters.

The function for reading from the serial port is below. I call this function after each frame I capture from the webcam for some image processing. The function opens the port, read some chars, and then close the port. Most of the time is spent in the ReadFile function, so opening the port from the begining and just reading from the serial port after each frame wouldnt make a difference...it is still incredibly slow

int Serial::ReadandClose(char *buffer, unsigned int nbChar, const char* portName) 
{ 

	 wchar_t wtext[20];
 mbstowcs(wtext, portName, strlen(portName)+1);//Plus null
 LPWSTR PortSpecifier = wtext;

 DCB dcb; 
 int retVal; 
 BYTE Byte; 
 DWORD dwBytesTransferred; 
 DWORD dwCommModemStatus; 
 
 HANDLE hPort = CreateFile( 
 PortSpecifier, 
GENERIC_READ, 
 0, 
 NULL, 
 OPEN_EXISTING, 
 0, 
 NULL 
 ); 
if (!GetCommState(hPort,&dcb)) 
 return 0x100; 
 dcb.BaudRate = CBR_115200; 
 dcb.ByteSize = 8; //8 data bits 
 dcb.Parity = NOPARITY; //no parity 
 dcb.StopBits = ONESTOPBIT; //1 stop 
 
 if (!SetCommState(hPort,&dcb)) 
 return 0x100; 
  SetCommMask (hPort, EV_RXCHAR | EV_ERR); //receive character event 
 WaitCommEvent (hPort, &dwCommModemStatus, 0); //wait for character 
 
 if (dwCommModemStatus & EV_RXCHAR) 
	 {
		 clock_t begin =clock();
	ReadFile (hPort, buffer, 256, &dwBytesTransferred, 0);
 	clock_t end = clock();
	double elapsed_secs = double(end-begin) / CLOCKS_PER_SEC;
	cout<<elapsed_secs<<endl;
 }
else if (dwCommModemStatus & EV_ERR) 
 retVal = 0x101; 

 CloseHandle(hPort); 
 return dwBytesTransferred; 
}

I have a gyroscope (MPU6050) attached to my Arduino UNO. I have written a Processing script to read the serial data(get the angles) from the Gyroscope and its working fine. Now I would like to integrate it with a C++ OpenCV project. I use this tutorial class for serial communications: Arduino Playground - CPPWindows

However, the serial communications is very slow, the 256 char array is filled in around 1.5 seconds. Thats around 170 chars/sec = 1.36 kbps.

So the question is: If the serial port works fast for Processing how come it is much slower using C++? Is there any alternative way for reading the gyroscope data to C++?

Here is the function which is triggered after each frame I capture from the webcam to get the serial data

int Serial::ReadandClose(char *buffer, unsigned int nbChar, const char* portName) 
{ 

     wchar_t wtext[20];
 mbstowcs(wtext, portName, strlen(portName)+1);//Plus null
 LPWSTR PortSpecifier = wtext;

 DCB dcb; 
 int retVal; 
 BYTE Byte; 
 DWORD dwBytesTransferred; 
 DWORD dwCommModemStatus; 

 HANDLE hPort = CreateFile( 
 PortSpecifier, 
GENERIC_READ, 
 0, 
 NULL, 
 OPEN_EXISTING, 
 0, 
 NULL 
 ); 
if (!GetCommState(hPort,&dcb)) 
 return 0x100; 
 dcb.BaudRate = CBR_115200; 
 dcb.ByteSize = 8; //8 data bits 
 dcb.Parity = NOPARITY; //no parity 
 dcb.StopBits = ONESTOPBIT; //1 stop 

 if (!SetCommState(hPort,&dcb)) 
 return 0x100; 
  SetCommMask (hPort, EV_RXCHAR | EV_ERR); //receive character event 
 WaitCommEvent (hPort, &dwCommModemStatus, 0); //wait for character 

 if (dwCommModemStatus & EV_RXCHAR) 
     {
         clock_t begin =clock();
    ReadFile (hPort, buffer, 256, &dwBytesTransferred, 0);
    clock_t end = clock();
    double elapsed_secs = double(end-begin) / CLOCKS_PER_SEC;
    cout<<elapsed_secs<<endl;
 }
else if (dwCommModemStatus & EV_ERR) 
 retVal = 0x101; 

 CloseHandle(hPort); 
 return dwBytesTransferred; 
    }

You should be able to get 115200 baud, 11520 chars/second out of just plain serial.
But you have to set the speed to 115200 in Serial.begin().
Even 9600 baud is 960 cps.

I don't think that your problem is serial speed.

What exactly does this line of code do?

ReadFile (hPort, buffer, 256, &dwBytesTransferred, 0);

Thats the actual serial read function. It asks the COMM handle named 'hPort' to read '256' chars and fill them in buffer char array, and says how much chars were actually read in 'dwBytesTransferred'

PeterH:
What exactly does this line of code do?

ReadFile (hPort, buffer, 256, &dwBytesTransferred, 0);

So are you saying that Im having normal serial speed? I doubt that because using Processing Im getting much higher rate using the Processing function 'myPort.readStringUntil('\n')'..... without the serial communication the application is absolutely fine...Im doing alot of image processing and its taking far less time than serial communication... my gutts are telling me that I am setting the properties of the COMM port in a wrong way

GoForSmoke:
You should be able to get 115200 baud, 11520 chars/second out of just plain serial.
But you have to set the speed to 115200 in Serial.begin().
Even 9600 baud is 960 cps.

I don't think that your problem is serial speed.

vanotech:
Thats the actual serial read function. It asks the COMM handle named 'hPort' to read '256' chars and fill them in buffer char array, and says how much chars were actually read in 'dwBytesTransferred'

The important point is that it doesn't return until all 256 characters are available. Do you see how that might be causing your problem?

Why have you two separate Threads about this topic.? here

You are just dividing the possibility of getting useful information and wasting people's time.

...R

Serial speed is not your limiting factor.
Don't confuse baud rate with data transferred over time. That assumes data is always being transferred.
Either something isn't writing fast enough or something isn't reading fast enough or both.
It could be serial handshaking for all I know.

Also COM, not COMM.