gpt4 book ai didi

c++ - C++ 函数 WriteFile 和 ReadFile 中的参数 LPVOID lpBuffer 使用什么变量类型

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:49:18 24 4
gpt4 key购买 nike

C++ ReadFileWriteFile 函数的 lpBuffer 应该使用什么变量类型来在基于 Windows XP 的 PC 和微型计算机之间进行通信基于 Controller 的系统? PC 在 VS2010 C++/CLI 中有 WinForm 应用程序。微 Controller 固件为ANSI C。

我的 PC 应该传输命令字符(例如“S”、“C”等),然后是命令终止字符 0xd(十进制 13 的十六进制)。基于微 Controller 的系统将响应 5 到 10 个字节,这些字节将是 ASCII 字符和十六进制数字的混合,例如'V' 后跟 0x41 0x72

PC 传输和微 Controller 接收:

  1. TxMessagePP1pTx 声明为 char 并保留 nNumberOfBytesToWrite 为 2,使微 Controller 接收 0x53 用于“S”,后跟 0xC3 而不是 0xd

    <
  2. TxMessagePP1pTx 声明为 wchar_t 并保持 nNumberOfBytesToWrite 为 2,使微 Controller 仅接收 'S' 的 0x53

  3. TxMessagePP1pTx 声明为 wchar_t 并保持 nNumberOfBytesToWrite 为 4,使微 Controller 正确接收 0x53 后跟 0xd 的 'S'。

上面发送和接收的第三种方案符合我对解决方案的预期行为。但问题在于:虽然 PC 可能传输 4 个字节(对于两种 wchar 类型),但微 Controller 接收到 2 个字节 0x53 用于“S”,正确遵循通过 0xD

微 Controller 发送和PC接收:

假设 wchar_tlpBuffer 的正确选择,我的 nNumberOfBytesToRead 应该是什么来接收 10 个字节从微 Controller ? ReadFile 将凭借 wchar_t 期望 20 个字节,而微 Controller 将仅传输 10 个字节。

令人惊奇的是,无论将 (RxMessagePP2pRx) 声明为 wchar_tchar unsigned char,ReadFile 从微 Controller 接收 10 个字节(满足我对解决方案的预期行为)。但问题是,从微 Controller 传输“A”10 次,PC 端的 ReadFile 收到垃圾,如“S”、0x00xd 0x54, 0x29.

/// Required designer variable.
HANDLE hCommPort;
BOOL fSuccess;
array<wchar_t> ^ TxMessage;
array<unsigned char> ^ RxMessage;

TxMessage = gcnew array<wchar_t> (12);
RxMessage = gcnew array<unsigned char> (12);


{
TxMessage[0]='S';//target cmd
TxMessage[1]=0xd;//cmd termination character
DWORD dwhandled;
if (hCommPort != INVALID_HANDLE_VALUE)
{
pin_ptr<wchar_t> pp1 = &TxMessage[0];
wchar_t *pTx = pp1;
fSuccess = WriteFile(hCommPort, pTx, 4, &dwhandled, NULL);


PurgeComm(hCommPort, PURGE_RXABORT|PURGE_TXABORT|PURGE_RXCLEAR|PURGE_TXCLEAR);

pin_ptr<unsigned char> pp2 = &RxMessage[0];
unsigned char *pRx = pp2;
fSuccess = ReadFile(hCommPort, pRx, 10, &dwhandled, NULL);

}//if IsOpen
else{
this->toolStripStatusLabel4->Text="Port Not Opened";}
}

最佳答案

ReadFile/WriteFile 不关心 C++ 类型,它们根据读/写字节进行操作。 ReadFile 从文件/设备读取指定数量的字节(如果要读取的字节较少,则更少),并将它们放入 lpBuffer 指向的内存中。 WriteFilelpcBuffer 指向的内存中将指定数量的字节写入文件/设备。这些函数的内存缓冲区只是一 block 已分配内存的区域,其大小至少与您在第三个参数中告诉这些函数的字节数一样多。

wchat_t 是一种多字节类型。它的大小可以大于一个字节。因此,您的 TxMessage[0]='S'; TxMessage[1]=0xd; 实际上可能不会在内存中填充两个字节,而是 4 个字节。例如,它可以是 x0053 , x000Dwchar_t 表示。从 WriteFile 的角度来看,它不关心你如何以及将什么放入内存。它将读取原始内存并将写入设备。因此,如果您的设备需要 x530D,它可能没有得到它,而是 x0053

总的来说,想想字节。如果您需要将 4 个字节的 x0A0B0C0D 写入您的设备,您如何为此值分配缓冲区并不重要。可以是4字节unsigned int = x0A0B0C0D,可以是char[4] = {x0A, x0B, x0C, x0D},可以是int short [ 2 ]= {x0A0B, x0C0D},它可以是任何 C++ 类型,包括自定义类。但是传递给WriteFile的内存指针指向的前4个字节的内存应该是x0A0B0C0D

同样,ReadFile 将读取您指定的字节数。例如,如果您的设备向您发送 2 个字节,ReadFile 会将 2 个字节写入您传递给它的指针指向的内存中(您有责任确保它分配了足够的字节)。同样,只要分配了 2 个字节,它就不会关心您如何分配它。之后,同样,您可以随意查看这两个字节 - 它可以是 char[ 2 ],可以是 int short 等。

关于c++ - C++ 函数 WriteFile 和 ReadFile 中的参数 LPVOID lpBuffer 使用什么变量类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18297776/

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