2013-02-28 2 views
1

У меня очень странная проблема, я передачи 105 байт [] буфера, и постоянно приема 116 байт на другой стороне.SerialPort Write() посылает больше байт, чем в буфере передачи

Последние 2 байта на исходных данных является CRC16

код, который я использую для передачи есть, его зацикливание.

static SerialPort sp = null; 
    static void Main(string[] args) 
    { 
     //105 bytes send buffer 
     byte[] data = new byte[] {0xa,0x03,0x64,0x0e,0x15,0x00,0x01,0x00, 
            0x01,0x00,0x06,0x00,0x23,0x00,0x5f,0x00, 
            0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00, 
            0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
            0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff, 
            0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00, 
            0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
            0x00,0x00,0x00,0x25,0xb8,0x00,0x05,0xff, 
            0x23,0x00,0x00,0x00,0x00,0x00,0xa2,0x00, 
            0x00,0x02,0x20,0x00,0x04,0x00,0x03,0x00, 
            0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
            0x01,0x00,0x00,0x00,0x01,0x00,0x1f,0x00, 
            0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xae, 
            0x1f 
     }; 

     Console.WriteLine("Serial Port Test"); 
     sp = new SerialPort("COM1", 19200); 
     sp.Open(); 
     if (sp.IsOpen) 
     { 
      Console.WriteLine("Begining to transmit serial data.."); 
     } 
     for (; ;) 
     { 
      Thread.Sleep(1000); 
      sp.Write(data,0,data.Length); 
      sp.DiscardOutBuffer(); 
     } 

     Console.WriteLine("End of transmission"); 
     Console.ReadKey(); 
    } 

Что я постоянно получать на другой стороне следующие 116 байт (Как странно это, что сообщение заканчивается с первоначальными CRC байт ??)

0xa, 0x03, 0x64, 0x0e, 0x15, 0x00, 0x01, 0x00, 
0x01, 0x00, 0x06, 0x00, 0x23, 0x00, 0x5f, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xb8, 0x00, 
0x05, 0xff, 0xff, 0x23, 0x00, 0x00, 0x00, 0x00, 
0x00, 0xa2, 0x00, 0x00, 0x02, 0x20, 0x00, 0x04, 
0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 
0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0xae, 0x1f, 

Любая помощь будет понятно, чтобы устранить эту проблему,

Спасибо

+2

Итак, вы получаете двойные всплески во всех байтах 0xFF. У вас есть код приемника? – Corey

+0

Привет, ресивер - это модуль Tibbo RS232 для IP. Я тестировал этот модуль с ведомым устройством Modbus, и он работает, это просто приложение .net, которое не может правильно передать исходные данные. –

+0

Почему вы вызываете 'sp.DiscardOutBuffer()'? Если в аппаратном буфере последовательного порта есть какие-либо байты, они будут отбрасывать их. Кажется, что это происходит. –

ответ

1

Я нашел этот вопрос,

Кажется, что на модуле Tibbo включен параметр «Inband commands», и после его отключения он прекратил «заполнение» байтов 0xFF дополнительными байтами 0xFF.

Очень странно, поскольку он не делает этого с оригинальным ведомым устройством Modbus, который отправляет много байтов 0xFF.

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