Readline из последовательного порта блокируется - PullRequest
3 голосов
/ 25 сентября 2010

Я пытаюсь прочитать данные с интерфейса RS232.Он отправляет непрерывный поток строк ASCII через последовательный порт, который у меня проблемы с получением.Я просто хочу получить одну строку данных, которые она отправляет.Я предполагаю, что предположил, что я буду использовать Readline для получения данных, но он просто блокирует ПК при запуске.Я думаю, что он пытается получить все данные и не остановится, пока данные не остановятся?Вот код, который я использую:

private void button1_Click(object sender, EventArgs e)
    {
        serialPort1.PortName = "COM4";
        serialPort1.BaudRate = 9600;
        serialPort1.DataBits = 8;
        serialPort1.Parity = Parity.None;
        serialPort1.StopBits = StopBits.One;

        //opening the serial port
        serialPort1.Open();

        string str = serialPort1.ReadLine();

        MessageBox.Show(str);

        serialPort1.Close();

    }

Можете ли вы помочь мне определить, как получить только одну строку выходных данных и закрыть соединение?

Ответы [ 2 ]

2 голосов
/ 25 сентября 2010

SerialPort.ReadLine определен для блокировки "до первого появления значения NewLine", где NewLine по умолчанию - перевод строки. Вы отправляете перевод строки в своем потоке? Обратите внимание, что символ перевода строки (ASCII 0x0A) отличается от возврата каретки (ASCII 0x0D), который вы, возможно, отправляете.

Вы можете переопределить NewLine, если необходимо, или, если конец строки не кажется правильным, вы можете прочитать до заданной строки с помощью SerialPort.ReadTo . Вы также можете установить тайм-аут чтения .

Вы можете предпочесть чтение заданного количества байтов из порта, а не строки, с одной из перегрузок SerialPort.Read .

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

0 голосов
/ 26 сентября 2010

Идеальным решением было бы создание рабочего потока для фактического чтения из последовательного порта (таким образом, поток можно заблокировать в течение всего дня, не мешая основному потоку приложения).Как только данные были получены, он может транслировать событие, отмечая, что данные были получены и что это за данные.Поток будет связываться с основным потоком приложения через событие.

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