C++的lpBufferReadFile
和函数应该使用什么变量类型WriteFile
在基于 Windows XP 的 PC 和基于微控制器的系统之间进行通信?PC 有 VS2010 C++/CLI 中的 WinForm 应用程序。微控制器固件为 ANSI C。
我的 PC 应该传输命令字符(比如“S”、“C”等),然后是命令终止字符0xd
(十进制 13 的十六进制)。基于微控制器的系统将响应 5 到 10 个字节,这些字节将混合 ASCII 字符和十六进制数字,例如“V”后跟0x41
0x72
等。
PC发送和微控制器接收:
TxMessage
,PP1
并pTx
声明为char
并保持nNumberOfBytesToWrite
为 2,使微控制器接收0x53
到 'S' 后跟0xC3
而不是0xd
。TxMessage
,PP1
并pTx
声明为wchar_t
并保持nNumberOfBytesToWrite
为2,使微控制器0x53
仅接收'S'。TxMessage
,PP1
并pTx
声明为wchar_t
并保持nNumberOfBytesToWrite
为4,使微控制器正确接收0x53
到'S'后跟0xd
。
上面的第三种发送和接收方案符合我预期的解决方案行为。但混乱就在这里:虽然 PC 可能正在传输 4 个字节(对于两种wchar
类型),但微控制器接收到 2 个字节0x53
的“S”,正确地后面跟着0xD
.
微控制器发送和PC接收:
假设这wchar_t
是正确的选择lpBuffer
,从微控制器接收 10 个字节应该是什么?nNumberOfBytesToRead
ReadFile 将期望 20 个字节wchar_t
,而微控制器将仅传输 10 个字节。
令人惊讶的是,无论将 ( 和 ) 声明RxMessage
为PP2
或pRx
,ReadFilewchar_t
从微控制器接收 10 个字节(符合我预期的解决方案行为)。但问题是从微控制器传输'A' 10次,PC端的ReadFile收到像'S'这样的垃圾,,,,,。char
unsigned char
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";}
}