gpt4 book ai didi

c++ - 无法在 COM 端口上正确使用 windows.h ReadFile。 WriteFile 似乎工作正常

转载 作者:行者123 更新时间:2023-11-28 06:21:25 24 4
gpt4 key购买 nike

我正在尝试使用 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");
}

以下是有关我的设置的更多信息:

  • 我使用的是 Windows 7 x64 和 Microsoft Visual Studio 2013
  • 该项目被编译为 Win32 控制台
  • 我使用 FTDI Chipi-X USB 到 COM 端口转换器电缆
  • 我尝试连接 Newport 运动 Controller 和 Thorlabs 压电 Controller

以下是我到目前为止尝试过的事情:

  1. 更新 Chipi-X VCOM 的驱动
  2. 按照在线指南将 COMMTIMEOUTS 更改为各种不同的值
  3. 使用 HyperTerminal,我能够与设备完全来回通信。如果我使用自己的程序发送请求设备某些内容的命令,例如“*IDN?\n”,那么我自己的 ReadFile 将不返回任何内容。但是,当我再次连接 super 终端时,我可以按 ENTER 键接收请求的信息。
  4. 使用 SetupComm() 更改缓冲区大小
  5. 一次将 ReadFile 缓冲区大小更改为 1 个字节
  6. 按照本指南中的说明实现 OVERLAPPED 方法:https://msdn.microsoft.com/en-us/library/ff802693.aspx .它给出了与上面的非重叠代码完全相同的问题:Windows 函数不会产生错误,但读取缓冲区将保持为空。
  7. 我尝试与不同的设备通信,这很有趣:我再次能够使用 super 终端完全来回通信。每当我使用自己的程序发送时,我总是会收到我使用 ReadFile 发回的确切字符串。再次,可以通过重新连接 super 终端来检索实际请求的信息。

在我看来,缓冲区存在一些问题,但我不知道是什么。我也不确定 super 终端是否能够通过不同的 COM 端口连接获取几秒钟前请求的请求信息。假设问题与我的编码有关,因为 HyperTerminal 工作正常,但如果我将它与我在网上找到的其他代码进行比较,我似乎无法找到我的代码有什么问题。

有人可以帮我吗?

编辑:

  1. 我使用以下示例创建了一个新的 CLR/C++ 测试应用程序:https://msdn.microsoft.com/en-us/library/system.io.ports.serialport(v=vs.110).aspx .这再次导致无法接收请求的完全相同的问题。
  2. 我试过 Roline USB 到 RS232 电缆: super 终端可以工作,但我的编程不行。底层硬件或驱动程序可能不是这里的问题。

最佳答案

我解决了这个问题:

我忘记在我的命令末尾发送回车符 (\r)。显然,我正在测试的设备在实际解析请求之前正在等待组合\r\n 。通过使用 super 终端,我可以通过某种方式将\r\n 附加到当前 COM 端口输出缓冲区,并获得像这样延迟的结果。

关于c++ - 无法在 COM 端口上正确使用 windows.h ReadFile。 WriteFile 似乎工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29256890/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com