2010-02-24 3 views
2

я подал заявку в C#, который отправляет 11 байт данных в последовательный порт, используя:Проблема с SerialPort в C# приложения

  port = new SerialPort("COM1"); 
      port.BaudRate = 9600; 
      port.DataBits = 8; 
      port.Parity = Parity.None; 
      port.StopBits = StopBits.One; 
      port.ReadTimeout = 1000; 
      port.WriteTimeout = 1000; 
      port.Open(); 

      byte[] buffer = new byte[11]; 
      buffer[0] = 0; 
      buffer[1] = 0; 
      buffer[2] = 0; 
      buffer[3] = 3; 
      buffer[4] = 2; 
      buffer[5] = 4; 
      buffer[6] = 1; 
      buffer[7] = 20; 
      buffer[8] = 50; 
      buffer[9] = 0; 
      buffer[10] = 120; 
      port.Write(buffer, 0, 11); 

Затем я написал другое приложение, чтобы проверить предыдущую. Я хотел бы проверить, правильно ли отправлено 11 байтов. В этой заявке я использую:

 using (SerialPort port = new SerialPort("COM1")) 
     { 
      // configure serial port 
      port.BaudRate = 9600; 
      port.DataBits = 8; 
      port.Parity = Parity.None; 
      port.StopBits = StopBits.One; 
      port.Open(); 

      for (; ;) 
      { 
       byte[] b = new byte[11]; 
       port.Read(b, 0, 11); 
       StringBuilder sb = new StringBuilder(); 
       for (int i = 0; i < 11; ++i) 
       { 
        sb.Append(b[i]); 
        sb.Append(" "); 
       } 
       Console.WriteLine(sb.ToString()); 
      } 
     } 

для получения байтов. Проблема заключается в том, что после отправки что-то вроде этого:

0 0 0 3 2 4 1 20 50 0 120 

я получаю:

0 0 0 0 0 0 0 0 0 0 0 
0 0 3 2 1 4 20 50 0 120 0 

Почему это происходит? Какая ошибка в моем коде? Спасибо

+2

Если вы смотрите последовательный порт с HyperTerminal, он видит правильные 11 байтов? – mtrw

+0

@mtrw Я отправил двоичные данные, а Hyper Terminal показывает их со странными символами. Есть ли способ конвертировать их в числовом формате? –

+1

Извините, я пропустил ваш вопрос. Я не знаю, как заставить HyperTerminal обрабатывать двоичные данные, но такие инструменты, как PortMon (http://technet.microsoft.com/en-us/sysinternals/bb896644.aspx), полезны для этой ситуации. Во всяком случае, я рад, что ваша проблема, похоже, решена. – mtrw

ответ

3

Вы не проверяете результат от port.Read(). Он возвращает количество байтов , прочитанное, а не количество байтов запрошено. Выходной цикл тогда должен использовать этот результат как верхний предел.

Хотя вы настроили тайм-ауты на отправляющей стороне, вам также понадобятся они и на читателе.

+0

Я решил свою проблему. Есть два пути. Первое - это то, что вы описали. Второй: зарегистрируйте дескриптор события DataReceived и вызовите Read с байтами BytesToRead. –

1

Чтобы проверить, что происходит на последовательное соединение на моем компьютере я использую два инструмента:

  • com0com: эмулятор, который создает два последовательных порта на компьютере, которые могут взаимодействовать друг с другом. Единственный недостаток, с которым я столкнулся, заключается в том, что вы должны установить для COM-порта ниже 10.

  • Free Serial Port Monitor: Он нюхает на COM-порту и может отображать каждый байт, который проходит по линии. Единственный недостаток, с которым я столкнулся, заключается в том, что он иногда имеет проблемы для разъединения и будет запускаться только после перезагрузки всего ПК. Поэтому, если вы запустили сеанс с ним, убедитесь, что вы не отключили или случайно не закрыли приложение, прежде чем закрыть соединение в своем тестовом приложении.

+0

Очень полезные инструменты, спасибо вам большое. –

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