C # и усечение данных класса SerialPort - PullRequest
4 голосов
/ 19 января 2012

У меня есть приложение на C #, которое использует класс .NET SerialPort. Код, который я использую для сбора данных с последовательного порта, ничего особенного. Ключевые части

//Open the port
            comport.BaudRate = myPort.BaudRate;
            comport.StopBits = StopBits.One;
            comport.DataBits = 8;
            comport.Parity = Parity.None;
            comport.ReadTimeout = 20000;


            comport.PortName = myPort.PortSystemName;
            comport.Handshake = Handshake.None;
            comport.RtsEnable = true;


            comport.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
comport.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);

    private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {

            string msg = "";
            try
            {
                msg = comport.ReadExisting();

                if (comport.IsOpen)
                    comport.Close();
         }

Этот код отлично работает в Windows XP . Однако в Windows 7 возникают проблемы, при которых независимо от того, какие данные отправляются, он ТОЛЬКО выбирает первые четыре символа. Таким образом, в строке типа «123456», сообщение будет «1234». Устройство, которое собирает данные, - это RFIdeas pcProx, и я проверил, что данные в порядке. Я также проверил, что данные выглядят нормально в гипертерминале. Так что должно быть что-то странное в том, как я собираю данные в коде. Помогите!

1 Ответ

5 голосов
/ 19 января 2012

Это полностью соответствует API.Не гарантировано и никогда не было прочитано все:

Этот метод возвращает содержимое потока и внутреннего буфера объекта SerialPort в виде строки.Этот метод не использует тайм-аут.Обратите внимание, что этот метод может оставить конечные байты во внутреннем буфере, что делает значение BytesToRead больше нуля.

Кроме того, вам нужно обрабатывать «еще не во внутреннем буфере» - вы непросто читать, пока BytesToRead положительный.Обычно это включает в себя зацикливание и буферизацию, пока не будет получено все сообщение.

Ваша задача - прочитать правильное количество данных, используя маркеры, такие как конец строки или заголовок с префиксом длины.

Если он отлично работает на XP, то это только удача (и, возможно, из-за некоторых настроек времени и / или эффективности).

Все вышеперечисленное в равной степени относится к большинству входов, а не только к последовательнымпорты;например, файловый IO и сетевой IO работают по совершенно одинаковым принципам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...