我正在尝试编写一个简单的程序,通过COM端口将单个字符发送到程序,并阅读我得到的答案。我想我有工作脚本,我至少可以通过com端口发送命令,但是当ReadFile
函数开始时它会冻结。我将通讯超时设置为100毫秒,所以我不认为它正在锁定端口,但我可能错了。我没有收到任何错误,编译时没有任何警告。我是C ++的新手(通常使用python),所以请尽可能清楚地了解你的答案。
// comtest.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <string>
#include <sstream>
#include <dos.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <windows.h>
int main(int argc, char **argv)
{
std::cout << "TOP! \n";
char buffer[1];
HANDLE file;
COMMTIMEOUTS timeouts;
DWORD read, written;
DCB port;
char init[] = ""; // e.g., "ATZ" to completely reset a modem.
// open the comm port.
file = CreateFile(L"COM1",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
std::cout << "file made \n";
// get the current DCB, and adjust a few bits to our liking.
memset(&port, 0, sizeof(port));
port.DCBlength = sizeof(port);
// set short timeouts on the comm port.
timeouts.ReadIntervalTimeout = 100;
timeouts.ReadTotalTimeoutMultiplier = 1;
timeouts.ReadTotalTimeoutConstant = 100;
timeouts.WriteTotalTimeoutMultiplier = 1;
timeouts.WriteTotalTimeoutConstant = 100;
int N = 10;
while (N > 1)
{
std::cout << "i'm in the loop!" << N << " loops left \n";
char command [1];
char * commandbuff;
std::cin >> command;
commandbuff = &command[1];
WriteFile(file, commandbuff, sizeof(commandbuff),&written, NULL);
Sleep(1000);
std::cout << "I just slept \n";
ReadFile(file, buffer, sizeof(buffer), &read, NULL);
N--;
}
// close up and go home.
CloseHandle(file);
return 0;
答案 0 :(得分:2)
您的代码似乎没有实际调用SetCommTimeouts
,因此您定义的超时无法应用。
答案 1 :(得分:0)
从com接收数据,除非先发送命令或得到响应的内容,否则不要开始读取。然后,最好一次只读取一个字节,但是如果像我一样发送modbus/at commands,并且知道您期望返回8个字节,那么可以使用readfile读取8个字节。在读取该单个字节之前,大多数C ++ com端口示例都具有SetCommState,SetCommTimeouts,SetCommMask和WaitCommEvent。
我的ReadFile的第二个参数上带有“&”。 MS Visual C ++虽然。 状态= ReadFile(fileusb,&ReadData,sizeof(ReadData),&NoBytesRead,NULL);