C++のlpBufferReadFileとWriteFile、Windows XP ベースの PC とマイクロコントローラー ベースのシステムとの間で通信する関数に使用する変数の型は何ですか? PC には VS2010 C++/CLI の WinForm アプリケーションがあります。マイクロコントローラーのファームウェアは ANSI C です。
私のPCは、コマンド文字(「S」、「C」など)に続いてコマンド終了文字0xd(10進数13の16進数)を送信することになっています。マイクロコントローラベースのシステムは、ASCII 文字と 16 進数の混合である 5 ~ 10 バイトで応答します。たとえば、'V' の後に続く0x41 0x72などです。
PC が送信し、マイクロコントローラーが受信します。
TxMessageとして宣言し、2 のままにしておくPP1と、マイクロコントローラーは 'S' の代わりに'S'を受け取ります。pTxcharnNumberOfBytesToWrite0x530xC30xdTxMessageとして宣言し、2 のままにしておくPP1と、マイクロコントローラーは「S」のみを受け取ります。pTxwchar_tnNumberOfBytesToWrite0x53TxMessageとして宣言し、4 のままにしておくPP1と、マイクロコントローラーは「S」に続いて正しく受信します。pTxwchar_tnNumberOfBytesToWrite0x530xd
上記の送信と受信の 3 番目のスキームは、予想されるソリューションの動作を満たしています。しかし、ここで混乱が生じます。PC は 4 バイト (2 つのwcharタイプ) を送信している可能性がありますが、マイクロコントローラーは0x53'S' の 2 バイトを受信し、その後に0xD.
マイクロコントローラーが送信し、PC が受信します。
wchar_tこれが の正しい選択であると仮定すると、マイクロコントローラーから 10 バイトを受信するにはlpBuffer、何を選択すればよいでしょうか? nNumberOfBytesToReadReadFile は により 20 バイトを期待しますがwchar_t、マイクロコントローラーは 10 バイトしか送信しません。
驚くべきことに、 ( RxMessage、PP2and pRx) をwchar_t、charorとして宣言してもunsigned char、 ReadFile はマイクロコントローラーから 10 バイトを受け取ります (私の予想されるソリューションの動作を満たしています)。しかし、問題は、マイクロコントローラーから「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";}
}