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 个字节应该是什么?nNumberOfBytesToReadReadFile 将期望 20 个字节wchar_t,而微控制器将仅传输 10 个字节。
令人惊讶的是,无论将 ( 和 ) 声明RxMessage为PP2或pRx,ReadFilewchar_t从微控制器接收 10 个字节(符合我预期的解决方案行为)。但问题是从微控制器传输'A' 10次,PC端的ReadFile收到像'S'这样的垃圾,,,,,。charunsigned char0x00xd0x540x29
/// 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";}
}