2016-09-24 4 views
4

Я пытаюсь поговорить с устройством RS232, которое ожидает кодирования ASCII-символов.C# hamming закодированный последовательный выход

Следующая таблица представлена ​​производитель:

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 

Я написал эту функцию C# для кодирования каждого байта (ASCII символов), но устройство декодирует только жаргон на его экране.

/// <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 hamming. Поэтому мне нужно сделать еще несколько исследований, чтобы понять, что пытается сказать таблица. –

+1

Таблица, вероятно, относится к кодированию за один кусочек (4 бит). Разделите данные на высокие и низкие глыбы и закодируйте их отдельно. – Mitch

ответ

0

Использование RealTerminal, я захватил необработанный вывод HEX из унаследованного программного обеспечения, которое я пытаюсь повторить. В протоколе, который я указываю, текст, отправленный в буфер устройства, должен быть закодирован (таблица предлагает 8/4 hamming), однако на самом деле это выглядит как нечетная кодировка четности.

Я написал метод ниже для кодирования символов с нечетной четностью, и устройство теперь правильно декодирует слова.

/// <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(), и добавить:

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 в случае по умолчанию. –

Смежные вопросы