Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: SerialPort.Read() не в полном объеме читает данные.  (Прочитано 13265 раз)
0 Пользователей и 6 Гостей смотрят эту тему.
sabbatazh
Помогающий

ua
Offline Offline

« : 02-07-2013 14:48 » 

Здравствуйте уважаемые Знатоки!
Читаю данные из СОМ порта, а они приходят не в полном объеме:  использую следующую конструкцию
Код: (C#)
 private void AcceptData2(object sender, SerialDataReceivedEventArgs e)
        {
            //-- Байт для прочтения в буфере порта
            int bytes = comport.BytesToRead;
            //-- Буфер для отправки в порт
            byte[] inBuffer = new byte[bytes];
            //-- Чтение и сохранение данных из порта
            comport.Read(inBuffer, 0, bytes);
 
            //-- Отображение на форме принятых данных
            this.Invoke(new EventHandler(delegate
            {
                //-- Записываем данные в буфер  
                DataS = ComReplace(ByteArrayToHexString(inBuffer));
            }));
        }
и наблюдается следующая тенденция comport.Read(inBuffer, 0, bytes); возвращает 1 или 11 байт, а должно быть 12 ...
Кто с такой проблемой сталкивался и как поборол ее, Подскажите, поделитесь опытом ?!
Спасибо!!!
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 02-07-2013 15:00 » 

Значит на момент чтения в буфере 1 или 11 байт.


Прикольные комменты
//-- Байт для прочтения в буфере порта = Количество байт в буфере порта
//-- Буфер для отправки в порт = Буфер порта

Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
sabbatazh
Помогающий

ua
Offline Offline

« Ответ #2 : 02-07-2013 15:33 » 

Sla, ну типа того!))))
Я так понял необходимо вести подсчет Количества байт в буфере порта, или как?
Спасибо!

Добавлено через 19 часов, 32 минуты и 11 секунд:
Вопрос решен!!! http://microsin.net/programming/PC/visual-studio-sharp-dot-net-com-port.html
дополнил перед количеством байт в буфере порта, строку Sleep(500)!
Спасибо!
Тема закрыта...
« Последнее редактирование: 03-07-2013 11:05 от sabbatazh » Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #3 : 03-07-2013 11:16 » new

sabbatazh, а почему-бы не дождаться, пока не придёт данных столько, сколько надо? т.е. если Вы знаете, что должно быть указанное число данных, то сделать:
Код: (C#)
private void AcceptData2(object sender, SerialDataReceivedEventArgs e)
{
  //-- Байт для прочтения в буфере порта
  int bytes = comport.BytesToRead;
  if (bytes >= 12)
  { //-- Буфер для отправки в порт
    byte[] inBuffer = new byte[12];
    //-- Чтение и сохранение данных из порта
    comport.Read(inBuffer, 0, 12);
 
    //-- Отображение на форме принятых данных
    this.Invoke(new EventHandler(delegate
    {
      //-- Записываем данные в буфер  
      DataS = ComReplace(ByteArrayToHexString(inBuffer));
    }));
  }
}
Всё-таки, имхо, решение через Sleep() не очень правильное.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 03-07-2013 12:07 » 

Да уж, "элегантное" решение. А почему Sleep(500)? А не, например, 502, или 497? От фонаря? (упрёк не топикастеру, а источнику)
Кстати, ошибки, связанные с подобными "решениями" проблемы, трудней всего выявлять. Как следствие получается: у меня работает, а у меня нет.
Так что это не "решение", а скорее workaround, например, для сиюминутной проверки.

Я бы даже не полагался на внутренний буфер SerialPort, а сделал бы свой FIFO, в который бы помещалось ВСЁ, что приходит из COM-порта и инициировал ф-цю обработки FIFO буфера:
Код: (C#)
private void AcceptData2(object sender, SerialDataReceivedEventArgs e)
{
        int cnt = comport.BytesToRead;
        byte[] inBuffer = new byte[cnt];
        comport.Read(inBuffer, 0, cnt);
        _myFIFO.Push(inBuffer, cnt);

        //-- Вызов ф-ции обработки _myFIFO
        ...
}
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
sabbatazh
Помогающий

ua
Offline Offline

« Ответ #5 : 18-07-2013 18:51 » 

Спасибо Всем!!! я сделал через буфер...
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines