2017-09-23 7 views
0

パリティなしの8ビットUARTで構成された3つの異なるCOMポートからシリアルデータを受信するC#アプリケーションを作成しています。他のデバイスはバイナリでエンコードされたHEXを送受信します。 AF01h = 10101010 00000001バイトごとに2文字。私は仮想COMポートとテスト目的のための単純なアプリケーションを設定し、私はデバイスをフックする前に前後にデータを送信しています。私はデータが送信と受信でデフォルトでASCIIエンコードされていることを知っていましたが、私は両方ともバイナリエンコードHEXである必要があります。エンコードクラスでそのオプションが表示されず、他の3つのデバイスとはまったく異なるエンコーディングを使用するアプリケーションがないと思います。それはヌルまたはHexシリアルポートコード

string binarystring = String.Join(String.Empty, hexstring.Select(c => Convert.ToString(Convert.ToInt32(c.ToString(), 16), 2).PadLeft(4, '0'))); 
sport.Write(binarystring); 
txtReceive.AppendText("[" + dtn + "] " + "Sent: " + binarystring + "\n"); 

に送信されたときに今、私は、文字列を変換するには、このコードを使用していますこれは、今のところ、テスト送信のために働くが、私は最終的にバイト配列に直接2桁の16進数を配置するコードを変更します。

このコードではAF01h = 1010101000000001と入力できますが、アプリケーションの受信側では16バイトのASCIIエンコード文字が得られます。他のデバイスと同じページでアプリを入手する方法はありますか?

+0

書き込み(文字列)過負荷は使用しないでください。バイナリデータを正しくエンコードするには、byte []を使用してください。 –

+0

私はByte []に​​移動する前に、テキストボックスからASCII文字をエンコードする必要がありますか?また、バイトを送信しても、ASCIIエンコーディング/デコードはまだ適用されません。 –

答えて

0

これを行う方法がわかりました。ただ、唯一の注意点は、あなたがデータを右に置きますもう一方の端の文字

の偶数で入力する必要がある2進文字のバイト整数

string hex = txtDatatoSend.Text; //"F1AAAF1234BA01" 
int numOfBytes = HEX.Length; 
byte[] outbuffer = new byte[numOfBytes/2]; 
for (int i = 0; i < numOfBytes; i += 2) 
{ 
outbuffer[i/2] = Convert.ToByte(hex.Substring(i, 2), 16); 
} 
sport.Write(outbuffer, 0, outbuffer.Length); 
sport.DiscardOutBuffer() 

へ進の長い文字列を変換するために必要なByte []に​​戻ると、私はこれをこのようにデコードできます。

byte[] inbuffer = new byte[sport.BytesToRead]; 
sport.Read(inbuffer, 0, inbuffer.Length); 
txtReceive.AppendText("[" + dtn + "] " + "Received: " + inbuffer.Length + " bytes "); 
for (int i = 0; i < inbuffer.Length; i++) 
{ 
string hexValue = inbuffer[i].ToString("X2"); 
txtReceive.AppendText(inbuffer[i] + " is " + hexValue + "HEX "); 
} 
txtReceive.AppendText("\n"); 
sport.DiscardInBuffer();