我正在尝试使用windows.h库通过RS232与设备(SCPI通信)进行通信。我看过几个教程和指南,介绍了如何设置它,并认为我的代码应该正确工作。我可以使用WriteFile向设备发送数据。但是,我无法使用ReadFile接收任何数据(ReadFile不会生成错误,但缓冲区大小为0)。这是我的代码:
#include <stdio.h>
#include <windows.h>
void main ()
{
// CreateFile
HANDLE rs232 = CreateFileA ("\\\\.\\COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
if (rs232 == INVALID_HANDLE_VALUE)
{
printf ("fail CreateFile: %d\n", GetLastError ()); system ("pause"); return;
}
// Get & Set CommState
DCB port_configuration;
int err = GetCommState (rs232, &port_configuration);
if (err <= 0)
{
printf ("fail GetCommState: %d\n", GetLastError ()); CloseHandle (rs232); system ("pause"); return;
}
port_configuration.BaudRate = 19200;
port_configuration.ByteSize = 8;
port_configuration.Parity = 0;
port_configuration.StopBits = 0;
port_configuration.DCBlength = sizeof (port_configuration);
err = SetCommState (rs232, &port_configuration);
if (err <= 0)
{
printf ("fail SetCommState\n"); CloseHandle (rs232); system ("pause"); return;
}
// SetCommTimeouts
COMMTIMEOUTS timeout_configuration;
timeout_configuration.ReadIntervalTimeout = 1;// MAXDWORD;
timeout_configuration.ReadTotalTimeoutMultiplier = 1;// 0;
timeout_configuration.ReadTotalTimeoutConstant = 1;// 0;
timeout_configuration.WriteTotalTimeoutMultiplier = 1;// 0;
timeout_configuration.WriteTotalTimeoutConstant = 1;// 0;
err = SetCommTimeouts (rs232, &timeout_configuration);
if (err <= 0)
{
printf ("fail SetCommTimeouts: %d\n", GetLastError ()); CloseHandle (rs232); system ("pause"); return;
}
// WriteFile
DWORD buffer_size_w;
char buffer_w[128] = "*IDN?\n";
err = WriteFile (rs232, buffer_w, strlen (buffer_w), &buffer_size_w, 0);
if (err <= 0)
{
printf ("fail WriteFile: %d\n", GetLastError ()); CloseHandle (rs232); system ("pause"); return;
}
printf ("written %d characters: %s\n", buffer_size_w, buffer_w);
// ReadFile
for (int x = 0; x < 10; ++x)
{
DWORD buffer_size_r;
char buffer_r[128] = {0};
err = ReadFile (rs232, buffer_r, 128, &buffer_size_r, 0);
if (err <= 0)
{
printf ("fail ReadFile: %d\n", GetLastError ()); Sleep (250); continue;
}
printf ("read %d characters: %s\n", buffer_size_r, buffer_r);
Sleep (250);
}
CloseHandle (rs232);
system ("pause");
}下面是有关我的设置的更多信息:
以下是我到目前为止尝试过的一些事情:
在我看来,缓冲区有一些问题,但我不知道是什么。我也不确定HyperTerminal是否能够通过不同的COM端口连接接收几秒钟前被请求的信息。这个问题大概与我的编码有关,因为HyperTerminal工作得很好,但是如果我把我的代码与我在网上找到的其他代码进行比较,我似乎找不到我的代码有什么问题。
有人能帮我一下吗?
编辑:
发布于 2015-03-27 11:55:15
我解决了这个问题:
我忘记在命令结束时发送回车(\r)。显然,我用这两个设备测试的设备在实际解析请求之前都在等待组合\r\n。通过使用超级终端,我可以将\r\n附加到当前的COM端口输出缓冲区,并获得这样延迟的结果。
https://stackoverflow.com/questions/29256890
复制相似问题