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'を受け取ります。pTx
char
nNumberOfBytesToWrite
0x53
0xC3
0xd
TxMessage
として宣言し、2 のままにしておくPP1
と、マイクロコントローラーは「S」のみを受け取ります。pTx
wchar_t
nNumberOfBytesToWrite
0x53
TxMessage
として宣言し、4 のままにしておくPP1
と、マイクロコントローラーは「S」に続いて正しく受信します。pTx
wchar_t
nNumberOfBytesToWrite
0x53
0xd
上記の送信と受信の 3 番目のスキームは、予想されるソリューションの動作を満たしています。しかし、ここで混乱が生じます。PC は 4 バイト (2 つのwchar
タイプ) を送信している可能性がありますが、マイクロコントローラーは0x53
'S' の 2 バイトを受信し、その後に0xD
.
マイクロコントローラーが送信し、PC が受信します。
wchar_t
これが の正しい選択であると仮定すると、マイクロコントローラーから 10 バイトを受信するにはlpBuffer
、何を選択すればよいでしょうか? nNumberOfBytesToRead
ReadFile は により 20 バイトを期待しますがwchar_t
、マイクロコントローラーは 10 バイトしか送信しません。
驚くべきことに、 ( RxMessage
、PP2
and pRx
) をwchar_t
、char
orとして宣言しても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";}
}