我想在115200,n,8,1从COM1读取(最好是阻塞调用,但我可以添加它。而且我不需要线程)。
我能找到的唯一代码是this question中的Stack Overflow(微软也有some useful info)。
作者说他的代码有效,我不怀疑他,但是当我运行代码时我没有收到任何字符,即使端口打开正确(如果我查看终端程序,数据是被送了。)
有人可以将URL发布到一些示例C代码吗?感谢。
FWIW,这是我的代码:
// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
E_boolean OpenCom1(void)
{
COMMTIMEOUTS timeouts;
comPorthandle = CreateFile("COM1", // Specify port device: default "COM1"
GENERIC_READ | GENERIC_WRITE, // Specify mode that open device.
0, // the device isn't shared.
NULL, // the object gets a default security.
OPEN_EXISTING, // Specify which action to take on file.
0, // default (not overlapped i/o).
NULL); // default (hTemplate must be NULL for COM devices).
if (comPorthandle == INVALID_HANDLE_VALUE)
return False;
deviceControlBlock.DCBlength = sizeof(deviceControlBlock);
if((GetCommState(comPorthandle, &deviceControlBlock) == 0))
{
// CodeMe: do what?
return False;
}
deviceControlBlock.BaudRate = CBR_115200;
deviceControlBlock.StopBits = ONESTOPBIT;
deviceControlBlock.Parity = NOPARITY;
deviceControlBlock.ByteSize = DATABITS_8;
deviceControlBlock.fRtsControl = 0;
if (!SetCommState(comPorthandle, &deviceControlBlock))
{
// CodeMe: do what?
return False;
}
#if 0
// alternative to GetCommState() and SetCommState()
// both versions succeed
if (!BuildCommDCB("115200,n,8,1", &deviceControlBlock))
{
// CodeMe: do what?
return False;
}
#endif
// set short timeouts on the comm port.
timeouts.ReadIntervalTimeout = 0;
timeouts.ReadTotalTimeoutMultiplier = 1;
timeouts.ReadTotalTimeoutConstant = 1;
timeouts.WriteTotalTimeoutMultiplier = 1;
timeouts.WriteTotalTimeoutConstant = 1;
if (!SetCommTimeouts(comPorthandle, &timeouts))
{
// CodeMe: do what?
return False;
}
return True;
}//OpenCom1()
// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
void ReadCharacterFromCom1(INPUT char *theCharacter)
{
DWORD numBytesRead;
numBytesRead = 0;
while (numBytesRead == 0)
{
ReadFile(comPorthandle, // handle of file to read
theCharacter, // store read data here
sizeof(theCharacter), // number of bytes to read
&numBytesRead, // pointer to number of bytes actually read
NULL);
}
return;
}//ReadCharacterFromCom1()
答案 0 :(得分:2)
我在这段代码中看到一个问题:
sizeof(theCharacter),
用
替换它sizeof(char),
因为你想要读取一个字节,而sizeof(char *)是4或8.可能还有别的东西,但你需要显示更多的代码。
此外,使用Portmon程序http://technet.microsoft.com/en-us/sysinternals/bb896644.aspx查看是否收到了数据 - 您可以将其与您的程序一起运行。