Serial Port Communication
I try to write a program to read/write a buffer from/to the port.
For synchronize purpose initially i used to read and write the same data for particular period of times. Then i start to send some data to the port and will read the acknowledgment from the port. The acknowledgment data will send by the device which is connected to the port. And I can able to see what are all the data are sending from the port device on some other console output.
My problem is the device sending the correct acknowledgment value, but while reading those value from the port i'm getting some different values.
And my code is
Code:
main(){
unsigned short SIZEIN = 2, DLE_SYN_Read_Count = 0;
char INBUFFER[20];
char inbuff[2];
char OUTBUFFER[2] = {DLE, SYN} ;
DWORD bytes_read = 0; // Number of bytes read from port
DWORD bytes_written = 0; // Number of bytes written to the port
HANDLE comport = NULL; // Handle COM port
int bStatus, i=0;
size_t result = 0;
char bufferOUT[10] = {SOH,4,251,STX,0xDE,0xAD,0xBE,0xEF,ETX,34};
DCB comSettings; // Contains various port settings
COMMTIMEOUTS CommTimeouts;
CString Par_comport;
Par_comport = "COM8";
SYSTEMTIME systemTime_Start, systemTime_End;
// Open COM port
if ((comport =
CreateFile(Par_comport, // open com5:
GENERIC_READ | GENERIC_WRITE, // for reading and writing
0, // exclusive access
NULL, // no security attributes
OPEN_EXISTING,
0,
NULL)) == INVALID_HANDLE_VALUE)
{
printf("Error: COM port Open\n");
}
GetCommState(comport, &comSettings);
comSettings.BaudRate = 115200;
comSettings.StopBits = ONESTOPBIT;
comSettings.ByteSize = 8;
comSettings.Parity = NOPARITY;
comSettings.fParity = FALSE;
comSettings.fDtrControl = TRUE;
comSettings.fRtsControl = TRUE;
bStatus = SetCommState(comport, &comSettings);
if (bStatus == 0)
{
printf("Error: COM port settings\n");
}
while(1)
{
bStatus = ReadFile(comport, // Handle
INBUFFER, // Incoming data
SIZEIN, // Number of bytes to read
&bytes_read, // Number of bytes read
NULL);
if (bStatus == 0)
{
printf("Error: Read File\n");
}
else if((INBUFFER[0]==DLE)&&(INBUFFER[1]==SYN))
{
printf("synchronize Received\n");
}
else
{
Sleep(1000);
continue;
}
break;
}
while(1)
{
if(DLE_SYN_Read_Count <= 2)
{
bStatus = WriteFile(comport, // Handle
&OUTBUFFER, // Outgoing data
2, // Number of bytes to write
&bytes_written, // Number of bytes written
NULL);
if (bStatus == 0)
{
printf("Error: Write File\n");
}
}
Sleep(1000);
bStatus = ReadFile(comport, // Handle
INBUFFER, // Incoming data
2, // Number of bytes to read
&bytes_read, // Number of bytes read
NULL);
if (bStatus == 0)
{
printf("Error: Read File\n");// error processing code goes here
}
if((INBUFFER[0]==DLE)&&(INBUFFER[1]==SYN))
{
DLE_SYN_Read_Count++;
if(DLE_SYN_Read_Count == 5)
{
break;
}
}
continue;
}
printf("synchronize Completed\n");
getch();
bStatus = WriteFile(comport, // Handle
&bufferOUT, // Outgoing data
10, // Number of bytes to write
&bytes_written, // Number of bytes written
NULL);
if (bStatus == 0)
{
printf("Error: Write File\n");
}
Sleep(1000);
bStatus = ReadFile(comport, // Handle
inbuff, // Incoming data
2, // Number of bytes to read
&bytes_read, // Number of bytes read
NULL);
printf("bStatus = %d\tbytes_read = %d\t%d\t%d\n",bStatus,bytes_read,inbuff[0],inbuff[1]);
if (bStatus == 0)
{
printf("Error: Read File\n");
}
if((inbuff[0]==DLE)&&(inbuff[1]==ACK))
{
printf("ACK Received\n");
}
else if((inbuff[0]==DLE)&&(inbuff[1]==NAK))
{
printf("NAK Received\n");
}
else
printf("Receiption of ACK fault\n%d\t%d\n",inbuff[0],inbuff[1]);
CloseHandle(comport);
getch();
return 0;
}
The last ReadFile function always get some other values in its buffer.
I guess, it might be a small mistake.