- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
C++ ReadFile
和 WriteFile
函数的 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 接收:
TxMessage
、PP1
和 pTx
声明为 char
并保留 nNumberOfBytesToWrite
为 2,使微 Controller 接收 0x53
用于“S”,后跟 0xC3
而不是 0xd
。
TxMessage
、PP1
和 pTx
声明为 wchar_t
并保持 nNumberOfBytesToWrite
为 2,使微 Controller 仅接收 'S' 的 0x53
。
TxMessage
、PP1
和 pTx
声明为 wchar_t
并保持 nNumberOfBytesToWrite
为 4,使微 Controller 正确接收 0x53
后跟 0xd
的 'S'。
上面发送和接收的第三种方案符合我对解决方案的预期行为。但问题在于:虽然 PC 可能传输 4 个字节(对于两种 wchar
类型),但微 Controller 接收到 2 个字节 0x53
用于“S”,正确遵循通过 0xD
。
微 Controller 发送和PC接收:
假设 wchar_t
是 lpBuffer
的正确选择,我的 nNumberOfBytesToRead
应该是什么来接收 10 个字节从微 Controller ? ReadFile 将凭借 wchar_t
期望 20 个字节,而微 Controller 将仅传输 10 个字节。
令人惊奇的是,无论将 (RxMessage
、PP2
和 pRx
) 声明为 wchar_t
、char
或 unsigned char
,ReadFile 从微 Controller 接收 10 个字节(满足我对解决方案的预期行为)。但问题是,从微 Controller 传输“A”10 次,PC 端的 ReadFile 收到垃圾,如“S”、0x0
、0xd
、 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
指向的内存中。 WriteFile
从 lpcBuffer
指向的内存中将指定数量的字节写入文件/设备。这些函数的内存缓冲区只是一 block 已分配内存的区域,其大小至少与您在第三个参数中告诉这些函数的字节数一样多。
wchat_t
是一种多字节类型。它的大小可以大于一个字节。因此,您的 TxMessage[0]='S'; TxMessage[1]=0xd;
实际上可能不会在内存中填充两个字节,而是 4 个字节。例如,它可以是 x0053
, x000D
在 wchar_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/
我正在尝试使用 C++ 代码将 AT 命令发送到通过 USB 连接的调制解调器。我正在使用“AT+MDN”进行测试,它在这个特定的调制解调器上返回其电话号码,并且在通过连接到其串行端口的 Putty
为了测试并确保我已经把所有东西都放下了,以便以后可以开始扩展,我正在尝试创建一个文件句柄,将给定的字节缓冲区写入该文件句柄,然后读取部分该文件放入新的测试缓冲区。 我有代码: const size_t
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我正在设计一个将时间序列数据写入文件的系统。数据是 8 字节的 block ,分为两个 4 字节的部分:时间和负载。 根据 MSDN,如果写入的数据大小小于一个扇区,则 WriteFile 函数是原子
我不知道如何在 JSON 文件上写入。我正在开发一个单一应用程序页面,主要使用 AngularJS 和 Node.js 这是我的代码: --index.html-- ... --a
作为学习练习,我正在编写一个在运行时输出 DLL 的程序。 我已经编写了 PE header ,并使用 WriteFile 成功将 DOS header 、NT header 、可选节 header
我正在尝试将参数发送到我的arduino。所以我编写了这段代码: #include #include #include #include HANDLE serialPortHandler;
代码: #include #include #include #include HANDLE creatFile(void); long WriteBuffer(HANDLE); char *
一般来说,我是 node.js 和 javascript 的新手,但我无法理解为什么 writeFile 函数正在写入一个空白文件。我认为 for 循环应该是一个 Promise,但我不确定如何编写它
我正在尝试使用 WriteFile 函数将 wstring 写入 UTF-8 文件。我希望文件包含这些字符“ÑÁ”,但我得到的是“�”。 这是代码 #include #include #inclu
嘿,我的 write 和 readFile 方法有问题。这些方法不做任何事情。该方法应该将动态数组的元素写入名为 C++ 的文件中。然后对于读取文件,该方法应该读取 ArrayList 的元素。 这是
我正在尝试将文件从资源复制到 %localappdata%。我有这样的东西: HINSTANCE hInstance = GetModuleHandle(NULL); HANDLE hFile = I
我正在尝试写入文本文件。我可以写入控制台,但是无法写入文本文件。我注意到的一件事是,如果我只是打印到控制台,则 String data 不包含任何数据,这可能就是我的文本文件中没有出现任何内容的原因。
我遇到了一个很奇怪的问题。 我正在连接到 Xbox 360 上的 Winsock 功能,发送。在我试图从中转储 Http 请求信息的应用程序中多次调用此函数。 首先我将展示代码并解释我的问题: Wri
我正在编写一个 activex 控件,它将访问并行端口并将字节写入其中。我能够成功打开端口,但是当我写入时它卡在 WriteFile 函数上。我在这里错过了什么吗?我正在使用 Windows 7 HA
我正在尝试将 16 字节数据写入串行端口,但我无法将值转换为 lpcvoid,这是我的代码, unsigned char Buffer[16]; for (int i=0; i<16; i++
我想写入一个随机输出,其中STD_OUTPUT_FILE即可。我想用WriteFile,但是好像什么都没写。 HANDLE outH = GetStdHandle ( STD_OUTPUT_HANDL
我正在尝试移植一些使用 read() 和 write() 函数发送套接字的 C。我正在尝试将其移植到 Windows,建议(根据我所阅读的内容)使用 WriteFile 和 ReadFile 来完成我
我正在尝试将 unsigned short 和 unsigned char 数组内容写入 .img 文件。我正在使用 WriteFile 方法来做同样的事情。似乎 WriteFile 函数成功地将数组
我想创建一个包含一些文本的简单文本文件。 import java.io.*; class TextFileWriter{ public static void writeTextFile(String
我是一名优秀的程序员,十分优秀!