2016-09-24 7 views
4

エンコードされたASCII文字をハミングすると予想されるRS232デバイスと通信しようとしています。C#ハム符号化シリアル出力

次の表は、メーカーによって提供される

Byte Encoded 
0  15 
1  02 
2  49 
3  5E 
4  64 
5  73 
6  38 
7  2F 
8  D0 
9  C7 
A  8C 
B  9B 
C  A1 
D  B6 
E  FD 
F  EA 

Iは各バイト(アスキー文字)を符号化するために、このC#関数を書いたが、デバイスは、その画面上の専門用語をデコードします。

/// <summary>Takes ASCII char as byte and returns hamming encoded version.</summary> 
    /// <param name="input">Byte to encode.</param> 
    /// <returns>Hamming encoded byte.</returns> 
    private byte ByteHamming(byte input) 
    { 
     switch (input) 
     { 
      case 0x00: 
       return 0x15; 
      case 0x01: 
       return 0x02; 
      case 0x02: 
       return 0x49; 
      case 0x03: 
       return 0x5E; 
      case 0x04: 
       return 0x64; 
      case 0x05: 
       return 0x73; 
      case 0x06: 
       return 0x38; 
      case 0x07: 
       return 0x2F; 
      case 0x08: 
       return 0xD0; 
      case 0x09: 
       return 0xC7; 
      case 0x0A: 
       return 0x8C; 
      case 0x0B: 
       return 0x9B; 
      case 0x0C: 
       return 0xA1; 
      case 0x0D: 
       return 0xB6; 
      case 0x0E: 
       return 0xFD; 
      case 0x0F: 
       return 0xEA; 
      default: 
       return input; 
     } 
    } 

私はハミングの仕組みを誤解していますか? 私はコンピュータ科学者ではありません:)

+0

掘り出した後、私はこれが8分の4のハムであると信じています。だから、テーブルが何を言おうとしているのかを理解するためには、もう少し研究をする必要があります。 –

+1

表はニブルごとのエンコード(4ビット)を参照している可能性があります。データを高低ニブルに分割し、それらを別々にエンコードします。 – Mitch

答えて

0

は、私が複製しようとしているレガシーソフトウェアからの生のHEX出力を捕獲しました。私が持っているプロトコル文書では、デバイスのバッファに送られたテキストがハミング符号化されている必要があります(表は8/4ハミングを示唆しています)が、実際には奇数パリティ符号化に見えます。

私は奇数パリティの文字をコードする以下の方法を書いており、デバイスは今では適切に単語を解読しています。

/// <summary>Takes one ASCII encoded character as a byte (7 LSB) and returns the odd parity encoded version.</summary> 
    /// <param name="asciiChar">One ASCII encoded character as a byte.</param> 
    /// <returns>The odd-parity encoded version as a byte.</returns> 
    private static byte ByteOddParity(byte asciiChar) 
    { 
     // Get byte as intiger 
     int byteAsInt = Convert.ToInt32(asciiChar); 

     // Extract the bit values from left to right 
     bool[] bits = new bool[8]; 
     int position = 0; 
     for (int i = 128; i > 0; i = i/2) 
     { 
      bits[position] = ((byteAsInt & i) == 0) ? false : true; 
      position++; 
     } 

     // Sum the 7 LSB 
     int parityCount = 0; 
     for (int i = 1; i > 8; i++) 
     { 
      if(bits[i] == true) 
      { 
       parityCount++; 
      } 
     } 

     // Calculate parity and set the MSB (parity bit) accodingly 
     bool setParityBit = (parityCount % 2) == 0; 
     bits[0] = setParityBit ? true : false; 
     int result = setParityBit ? byteAsInt + 128 : byteAsInt; 

     return Convert.ToByte(result); 
    } 

私は、デバイスは、おそらくエンコード方法を選択するための設定があり、それが割り当てられたタスクはないので、私は、プロトコルのドキュメントに一致するようにそれを変更しようと気にしないだろうと思います。

2

@Mitchが示唆したように、おそらくニブルをエンコードする必要があります。 NibbleHamming()

名前の変更、あなたの実際の方法を、および追加::だから、このようなものは動作するはずRealTerminalを使用して

private byte ByteHamming(byte input) 
{ 
    byte lo = (byte)(input & 0x0F); 
    byte hi = (byte)((input & 0xF0) >> 4); 
    lo = NibbleHamming(lo); 
    hi = NibbleHamming(hi); 
    return lo + hi * 0x10; 
} 
+0

@Quantum_Kernel、NibbleHammingの場合、デフォルトの場合、ArgumentOutOfRangeExceptionをスローする必要があります。 –