Как ускорить чтение из данных последовательного порта - PullRequest
0 голосов
/ 02 мая 2019

Я пишу небольшое приложение, которое клиент будет использовать для считывания данных со шкалы.

Проблема, с которой я сталкиваюсь, заключается в том, что существует ОГРОМНАЯ задержка с момента, когда весы действительно имеют вес, и онотображение в программном обеспечении.С гипертерминалом это точно и быстро, с кодом ниже после того, как он был запущен в течение приблизительно минуты, мне нужно подождать около 40 секунд для обновления счетчика.

Шкала установлена ​​на скорость 19200 BAUD и не можетупадет ниже или пропустит показания.

Я использую SerialDataReceivedEventHandler, но я не уверен, что это самый быстрый из возможных способов.

ниже мой код, есть ли в любом случае, я могу ускорить это?

и я не могу позволить себе пропустить какие-либо показания

Как мне установить буфер или ускорить его, или я должен читать в байтах вместо использования readline?

Я попытался удалить все форматирование изстрока и просто записать ее в текстовый файл, к сожалению, это только сделало его медленнее.

 private void StartReadBtn_Click(object sender, EventArgs e)
    {
        port = new SerialPort(ComLbl.Text, Convert.ToInt32(BaudLbl.Text), Parity.None, 8, StopBits.One);
        try
        {
            port.Open();
        }
        catch
        {
            port.Close();
            port.Open();
        }
        port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
    }

    //Event Handler to read com port data
    private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        try
        {
            sp.Open();
        }
        catch
        {

        }
        CommData = sp.ReadLine();
        if (readingcount < 7)
        {
            readingcount++;

        }
        else
        {
            OldCom = Convert.ToInt32(oldData);
            try
            {
                NewCom = Convert.ToDecimal(CommData.Substring(5, 5));
            }
            catch
            {
              //incase a string is caught with incorrect characters 
            }
            label1.Invoke(new Action(() => label1.Text =CommData));

        }

    }

Мне нужно, чтобы это было достаточно отзывчивым, чтобы я мог фактически читать данные в программное обеспечение в реальном времени, а несекунд позади шкалы.Если я посмотрю на Гипертерминал, то масштаб передает около 60 строк данных каждую секунду, и мне нужно иметь возможность поймать их всех, жить

1 Ответ

1 голос
/ 02 мая 2019

Возможно, потому что вы используете ReadLine () так, как думаете сами.

ReadLine () предполагает, что текстовые данные заканчиваются значением свойства NewLine. Он не заканчивается, пока не получит код значения NewLine или не истечет время ожидания.

Вместо ReadLine () прочитайте Свойство BytesToRead , укажите размер данных и выполните Read () .

Затем тщательно проверьте, соответствуют ли полученные данные формату данных, описанному в руководстве по программированию для устройства масштабирования.

В противном случае неправильно делать Open () в начале DataReceivedHandler. Если это действительно необходимо, в другом месте может быть что-то не так, и для этого потребуется Open ().

Кроме того, создание объекта SerialPort каждый раз, когда вы нажимаете StartReadButton, является неправильным использованием.

Руководство по программированию для устройства масштабирования, по-видимому, описывает команды, такие как чтение старт / стоп и нулевая шкала, и способы их использования. Создайте программу в соответствии с этим.

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