我做错了什么或设备根本没有响应? 如何从com端口读取数据,现在我正在这样做:
hCom = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, NULL);
Other settings ....
DWORD dwBytesCount = 0;
unsigned char response[5] = {0};
unsigned char command[6] = {0x0A, 0xFF, 0x03, 0x20, 0x04};
command[5] = Crc8(command, 5);
printf("\ncrc-8 sum is:%d", command[5]);
if(!(WriteFile(hCom, command, 6, &dwBytesCount, NULL)) || (dwBytesCount != 6)) {
dwErrorCode = GetLastError();
printf("\nError in function WriteFile, error code:%ld, bytes write:%ld", GetLastError(), dwBytesCount);
std::cin >> input;
return false;
}
printf("\nwrite bytes is:%ld", dwBytesCount);
// DWORD dwMask;
// printf("\nWaitCommEvent");
// if(!WaitCommEvent(hCom, &dwMask, NULL)) {
// printf("\nError in function WaitCommEvent, error code:%ld", GetLastError());
// std::cin >> input;
// return false;
// }
for(int i = 0; i < 10; ++i) {
printf("\nread file");
if(!(ReadFile(hCom, response, 4, &dwBytesCount, NULL))) {
dwErrorCode = GetLastError();
printf("\nError in function ReadFile, error code:%ld, bytes read:%ld", GetLastError(), dwBytesCount);
std::cin >> input;
return false;
}
Sleep(100);
printf("\nread bytes is:%ld", dwBytesCount);
}
printf("\nread bytes is:%ld", dwBytesCount);
printf("\nreader response status is:%d", response[3]);
std::cin >> input;
它读取零字节。 如果我取消注释WaitCommEvent,程序会冻结。
我在每次操作后尝试使用标志OVERLAPPED和GetOverlappedResult的版本,结果是一样的。
据我所知,它无法同时连接到com端口 http://www.ms-news.net/f3608/createfile-shared-mode-doesnt-work-2057561.html
在第二个流中连接会产生相同的结果
其他设置包括:
SetCommMask(hCom, (EV_RXCHAR | EV_RXFLAG | EV_BREAK | EV_CTS | EV_DSR | EV_ERR | EV_RING | EV_RLSD));
if(!(GetCommTimeouts(hCom, &timeout))) {
printf("Error in function GetCommTimeouts error code:%ld", GetLastError());
std::cin >> input;
return false;
}
timeout.ReadIntervalTimeout = 50;
timeout.ReadTotalTimeoutConstant = 50;
timeout.ReadTotalTimeoutMultiplier = 10;
timeout.WriteTotalTimeoutConstant = 50;
timeout.WriteTotalTimeoutMultiplier = 10;
//timeout.ReadIntervalTimeout = 0xFFFFFFFF;
//timeout.ReadTotalTimeoutConstant = 1000;
//timeout.ReadTotalTimeoutMultiplier = 0;
//timeout.WriteTotalTimeoutConstant = 1000;
//timeout.WriteTotalTimeoutMultiplier = 0;
if(!(SetCommTimeouts(hCom, &timeout))) {
printf("Error in function GetCommTimeouts error code:%ld", GetLastError());
std::cin >> input;
return false;
}
if(!(SetupComm(hCom, 128, 128))) {
printf("Error in function SetupComm error code:%ld", GetLastError());
std::cin >> input;
return false;
}
if(!(GetCommState(hCom, &ComDCM))) {
printf("Error in function GetCommState error code:%ld", GetLastError());
std::cin >> input;
return false;
}
ComDCM.BaudRate = 115200;
ComDCM.ByteSize = 8;
ComDCM.Parity = NOPARITY;
ComDCM.StopBits = ONESTOPBIT;
ComDCM.fAbortOnError = TRUE;
ComDCM.fDtrControl = DTR_CONTROL_DISABLE;
ComDCM.fRtsControl = RTS_CONTROL_DISABLE;
ComDCM.fBinary = TRUE;
ComDCM.fParity = FALSE;
ComDCM.fInX = ComDCM.fOutX = FALSE;
ComDCM.XonChar = 0;
ComDCM.XoffChar = uint8_t(0xff);
ComDCM.fErrorChar = FALSE;
ComDCM.fNull = FALSE;
ComDCM.fOutxCtsFlow = FALSE;
ComDCM.fOutxDsrFlow = FALSE;
ComDCM.XonLim = 128;
ComDCM.XoffLim = 128;
if(!(SetCommState(hCom, &ComDCM))) {
printf("Error in function SetCommState error code:%ld", GetLastError());
std::cin >> input;
return false;
}
printf("success");
std::cin >> input;
我已经使用com端口模拟器测试了这段代码并且它可以工作,这意味着问题出在设备中。
感谢大家的回复和帮助
答案 0 :(得分:3)
你应该稍微分解这个问题,除非其他一些海报已经发现了一个错误。
有什么事情要发送吗?如果您将tx作为范围,或连接到另一个连接了某个有效终端程序甚至HyperTerm的端口,那么命令字符是否会消失?如果在非重叠模式下运行,WaitCommEvent会阻塞,因此如果取消注释并且线程阻塞,则可能根本没有收到任何字符。可能的原因很多 - 电缆,连接器,波特率不匹配,不正确的流量控制和与RS232相关的所有其他痛苦行李。
非重叠I / O最好在它自己的一个线程中完成,但是,我认为,如果链接正常并且对等方能够响应,你应该回到这里。
RGDS, 马丁
BTW,'其他设置'在这里是我使用的订单。它适用于从W2k到W7的每个操作系统:
的CreateFile(); SetupComm(); setCommTimeouts(); setCommState(); setCommMask(); ReadWriteStuff();
马丁
答案 1 :(得分:1)
您是否已使用正确的值设置COMMTIMEOUTS
结构并调用函数SetCommTimeouts
?有关详细信息,请参阅:http://msdn.microsoft.com/en-us/library/aa363190。特别是那里的评论部分。
当ReadIntervalTimeout
成员设置为MAXDWORD
并且成员ReadTotalTimeoutConstant
和ReadTotalTimeoutMultiplier
设置为零时,可能会出现此症状,因为此特定值组合允许{{1即使没有收到任何字节,也要立即重新启动。