这是COM端口开放部分:
portHandle=CreateFileA(portName, GENERIC_READ|GENERIC_WRITE,0, NULL, OPEN_EXISTING, 0, NULL);
if (portHandle == INVALID_HANDLE_VALUE)
{
return -1;
}
COMMCONFIG Win_CommConfig;
COMMTIMEOUTS Win_CommTimeouts;
unsigned long confSize = sizeof(COMMCONFIG);
Win_CommConfig.dwSize = confSize;
GetCommConfig(portHandle, &Win_CommConfig, &confSize);
Win_CommConfig.dcb.Parity = 0;
Win_CommConfig.dcb.fRtsControl = RTS_CONTROL_DISABLE;
Win_CommConfig.dcb.fOutxCtsFlow = FALSE;
Win_CommConfig.dcb.fOutxDsrFlow = FALSE;
Win_CommConfig.dcb.fDtrControl = DTR_CONTROL_DISABLE;
Win_CommConfig.dcb.fDsrSensitivity = FALSE;
Win_CommConfig.dcb.fNull=FALSE;
Win_CommConfig.dcb.fTXContinueOnXoff = FALSE;
Win_CommConfig.dcb.fInX=FALSE;
Win_CommConfig.dcb.fOutX=FALSE;
Win_CommConfig.dcb.fBinary=TRUE;
Win_CommConfig.dcb.DCBlength = sizeof(DCB);
if (baudrate != -1)
{
Win_CommConfig.dcb.BaudRate = baudrate;
}
Win_CommConfig.dcb.ByteSize = 8;
Win_CommTimeouts.ReadIntervalTimeout = 50;
Win_CommTimeouts.ReadTotalTimeoutMultiplier = 0;
Win_CommTimeouts.ReadTotalTimeoutConstant = 110;
Win_CommTimeouts.WriteTotalTimeoutMultiplier = 0;
Win_CommTimeouts.WriteTotalTimeoutConstant = 110;
SetCommConfig(portHandle, &Win_CommConfig, sizeof(COMMCONFIG));
SetCommTimeouts(portHandle,&Win_CommTimeouts);
return 0;
它连接正常,我设法发出一些AT comamnds并回读OK \ n>响应,即使是上层协议之一(OBD2:命令为0100\r
)也能得到正确的答案。但是当我尝试其他命令时,例如扫描支持的pid(例如0000\n
,0101\n
,0202\n
等),整个事情要么回复我写给它的任何内容,要么只是超时。从超级终端发出相同的命令序列正常工作。这些串口是真正的虚拟模拟端口 - http://com0com.sourceforge.net/。
我错过了什么?也许某些读取/设置/重置某些引脚?自从我上次与RS232混音以来已经有一段时间了......谢谢!
答案 0 :(得分:0)
例如0000 \ n,0101 \ n,0202 \ n
这就是问题所在。它本来应该是\ r \ n,而不是\ n。超级终端有效,因为密钥会在Windows上插入\ r \ n。可能通过连接的设备对输入进行了一些验证,因此即使输入错误的终结器字符也能正常工作。