AnsweredAssumed Answered

can not access Virtual Com Port in Windows

Question asked by Chinag Kuan Yi on Jul 4, 2018
Latest reply on Jul 29, 2018 by Daniel Chen

Hi, All

I meet a big problem, I don't have any idea to fix it.

sdk path: SDK_2.3.0_MAPS-KS22\boards\mapsks22\usb_examples\usb_device_cdc_vcom\bm

PC OS: window 7 64bit, MCU: mks22,

I use usb_device_cdc_vcom to develop ks22 .

I want use my PC  to access virtual com port, so I write a sample code through WINDOWS API.

here is my source code on windows:

 


void setConfig() {
DCB dcbSerialParams = { 0 }; // Initializing DCB structure
COMMTIMEOUTS timeouts = { 0 };
dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
GetCommState(hComm, &dcbSerialParams);
dcbSerialParams.BaudRate = CBR_9600; // Setting BaudRate = 9600
dcbSerialParams.ByteSize = 8; // Setting ByteSize = 8
dcbSerialParams.StopBits = ONESTOPBIT;// Setting StopBits = 1
dcbSerialParams.Parity = NOPARITY; // Setting Parity = None
//dcbSerialParams.fInX = 1;
//sdcbSerialParams.fOutX=1;
if (!SetCommState(hComm, &dcbSerialParams))
printf("SetCommState fail!\n");

GetCommTimeouts(hComm, &timeouts);
timeouts.ReadIntervalTimeout = 0; // in milliseconds
timeouts.ReadTotalTimeoutConstant = 500; // in milliseconds
timeouts.ReadTotalTimeoutMultiplier = 0; // in milliseconds
timeouts.WriteTotalTimeoutConstant = 500; // in milliseconds
timeouts.WriteTotalTimeoutMultiplier = 0; // in milliseconds
if(!SetCommTimeouts(hComm, &timeouts))
printf("SetCommTimeouts fail!\n");

}

 

int OpenCom() {
hComm = CreateFile("\\\\.\\COM12", // for COM1OM9 only use COM1
GENERIC_READ | GENERIC_WRITE, //Read/Write
0, // No Sharing
NULL, // No Security
CREATE_ALWAYS,// Open existing port only
0, // Non Overlapped I/O
NULL); // Null for Comm Devices

if (hComm == INVALID_HANDLE_VALUE) {
printf("Error in opening serial port\n");
return -1;
}
else
printf("opening serial port successful\n");

setConfig();
return 0;

}


void ComIO(PACKET_INFO packet_info) {
unsigned char pBuffer[7];
printf(" usize:%d\n", uBufSize);
memcpy(pBuffer, &packet_info, uBufSize);
for (int i = 0; i < uBufSize; i++)
printf("ComIO buffer %u is %d:\n", i, pBuffer[i]);

 

DWORD dNoOFBytestoWrite; // No of bytes to write into the port
DWORD dNoOfBytesWritten = 0; // No of bytes written to the port
dNoOFBytestoWrite = uBufSize;
printf("size of dNoOFBytestoWrite: %d\n", dNoOFBytestoWrite);
BOOL bRet = WriteFile(hComm, // Handle to the Serial port
pBuffer, // Data to be written to the port
dNoOFBytestoWrite, //No of bytes to write
&dNoOfBytesWritten, //Bytes written
NULL);
if (dNoOfBytesWritten > 0)
printf("write successful\n");
else
printf("write fail\n");
if (bRet)
{
printf("write good!\n");
}
else
{

DWORD dwError = GetLastError();


printf("error: %d\n", dwError);

}

}

 

int main(){

  XXXX // give packet_info some value in here 

  OpenCom() ;

  ComIO(packet_info);

}

 

My question is when I use my sample code to access port,

open com and write com is successful, but KS22(MCU) can not receive my send data.

but I use PUTTY to access port first,  KS22 can receive my send data. after that I run my sample code, it works too.

ks22 can receive my send data through my sample code.

 

it seems like I need use PUTTY to open port and send data first, after that I can use my sample code to access port.

it seems like PUTTY do some communicate, that my sample code didn't do.

how can I modify my sample code, makes it work.(don't need to use PUTTY access port first)

I don't have any idea, who can help me please~

 

THX

 

BR,

Nancy

Outcomes