Как читать данные устройства с последовательного порта - PullRequest
2 голосов
/ 04 мая 2010

У меня есть одно устройство, которое отправляет данные на COM-порт, скажем, на COM13. Теперь я хочу прочитать эти данные и отобразить их в RichTextBox или в любом текстовом элементе управления.

Я написал приложение с помощью IO и IO.Ports, но событие comport.DataRecived не запускается, даже если устройство отправляет данные на этот порт.

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

Есть ли способ прочитать данные?

comm.Parity = cboParity.Text;//None
comm.StopBits = cboStop.Text;//One
comm.DataBits = cboData.Text;//8
comm.BaudRate = cboBaud.Text;//9600
comm.DisplayWindow = rtbDisplay;//Null
comm.PortName = "COM13";
comm.OpenPort();

cmdOpen.Enabled = false;
cmdClose.Enabled = true;
cmdSend.Enabled = true;

public bool OpenPort()
{
    if (comPort.IsOpen)
    {
        comPort.Close();
    }

    comPort.DataReceived += new SerialDataReceivedEventHandler(comPort_DataReceived);
    comPort.PortName = _portName;
    comPort.Open();return true;
}

Ответы [ 4 ]

1 голос
/ 04 мая 2010

Обычно это происходит из-за неправильной конфигурации последовательного порта. Недостаточно просто открыть последовательный порт и ожидать поступления некоторых данных. Вы также должны установить для all SerialPort.Properties правильное значение для требуемого соединения.

Некоторые из распространенных: BaudRate, DataBits или Parity, но, чтобы быть уверенным, вы должны установить их все. Даже такие вещи, как RtsEnable или ReadTimeout.

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

Обновление

Кажется, это проблема, которую я не вижу отсюда. ; -))

Единственный совет, который я могу вам дать, - это использование Monitor tool , чтобы лучше понять, что на самом деле делает ваше другое приложение и что происходит по проводам. Кроме того, вы можете настроить два виртуальных com-порта для проверки чтения и записи на одной машине (даже в одном приложении), чтобы лучше контролировать, когда будут отправляться данные.

0 голосов
/ 11 мая 2010

Используйте PortMon для захвата рабочего программного обеспечения, а затем для захвата вашего программного обеспечения; затем сравните следы. Обратите особое внимание на все параметры конфигурации, убедившись, что они одинаковы (как упоминал Оливер).

0 голосов
/ 06 мая 2010

Фрагмент, который вы опубликовали, довольно грубый, но я бы установил для свойства ReceivedBytesThreshold значение 1. Это обеспечивает срабатывание события, когда во входящем буфере присутствует хотя бы один байт. Приветствия

0 голосов
/ 04 мая 2010

Вы прочитали документацию для события DataReceived?

С MSDN :

Событие DataReceived не гарантируется для каждого полученного байта . Используйте свойство BytesToRead, чтобы определить, сколько данных осталось для чтения в буфере.

Событие DataReceived возникает во вторичном потоке при получении данных от объекта SerialPort. Поскольку это событие возникает во вторичном потоке, а не в основном потоке, попытка изменить некоторые элементы в основном потоке, такие как элементы пользовательского интерфейса, может вызвать исключение потока. Если необходимо изменить элементы в главной форме или элементе управления, отправьте запросы на изменение обратно с помощью Invoke, который выполнит работу в соответствующей цепочке.

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