原文链接:https://blog.csdn.net/sunxiao061015/article/details/8052080
SetCommState设置串口失败原因
bool OpenPort(UINT portNo)
{
char szPort[50];
sprintf_s(szPort, "COM%d", portNo);
hCom = CreateFile(szPort,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING, //0,
FILE_ATTRIBUTE_NORMAL, // FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
NULL);
if (hCom == INVALID_HANDLE_VALUE){
if (GetLastError() == ERROR_FILE_NOT_FOUND){
//printf("ERROR: Handle was not attached. Reason: %s not available\n",
szPort);
}else{
printf("[%s]ERROR!!!\r\n",__FUNCTION__);
}
CloseHandle(hCom);
return false;
}
return true;
}
bool PortInit(void)
{
DCB poartDCB;
COMMTIMEOUTS CommTimeouts;
//设置缓冲区大小
SetupComm(hCom, 1024, 1024); //输入缓冲区和输出缓冲区的大小都是1024
//设置超时
CommTimeouts.ReadIntervalTimeout = 1000; //1000ms//读间隔超时
CommTimeouts.ReadTotalTimeoutMultiplier = 1; //500ms//读时间系数
CommTimeouts.ReadTotalTimeoutConstant = 100; //5000ms//读时间常量
CommTimeouts.WriteTotalTimeoutMultiplier = 10; //500ms// 写时间系数
CommTimeouts.WriteTotalTimeoutConstant = 200; //2000ms//写时间常量
if(!SetCommTimeouts(hCom, &CommTimeouts)){
printf("[%s]failed to set come time outs parameters\n", __FUNCTION__);
return false;
}
//设置波特率、停止位、奇偶校验、数据位
if (!GetCommState(hCom, &poartDCB)){
printf("[%s]failed to get current serial parameters\n", __FUNCTION__);
return false;
}else{
printf("poartDCB.BaudRate : %ld\n",poartDCB.BaudRate);
printf("poartDCB.Parity : %x\n",poartDCB.Parity);
printf("poartDCB.ByteSize : %x\n",poartDCB.ByteSize);
printf("poartDCB.StopBits : %x\n",poartDCB.StopBits);
poartDCB.BaudRate = 115200; //波特率
poartDCB.Parity = 0; //奇偶校验
poartDCB.ByteSize = 8; //数据位
poartDCB.StopBits = 1; //停止位
//myDCB.fDtrControl = DTR_CONTROL_ENABLE;
if (!SetCommState(hCom, &poartDCB)){
printf("[%s]could not set Serial port parameters\n", __FUNCTION__);
return false;
}else{
PurgeComm(hCom, PURGE_RXCLEAR | PURGE_TXCLEAR);
Delay_us(1000);
}
}
return true;
}
原因为:
poartDCB.StopBits= 0,1,2对应的是1bit,1.5bits,2bits.
poartDCB.ByteSize=6,7,8时 dcb.StopBits不能为1
poartDCB.ByteSize=5时 dcb.StopBits不能为2
————————————————