C # Как поместить последовательные входные данные в очередь и удалить из очереди, используя фоновый работник - PullRequest
1 голос
/ 27 ноября 2011

Мне нужно взять входящие данные из последовательного порта, поместить строку «ReadExisting» в очередь, а затем удалить ее обратно в пользовательский интерфейс.

Во время процесса отмены очереди я буду форматировать входящую строку, чтобы удалить ненужные символы, добавить LineFeeds (во входящих нет символов EOL) и т. Д. И публиковать различные части строки в нескольких элементах управления (список, текстовое поле). ) для просмотра.

Насколько я смог создать строку (RxString) из входящих данных:

 private void serialPort1_DataReceived(object sender,
System.IO.Ports.SerialDataReceivedEventArgs e)     
 {         
 RxString = serialPort1.ReadExisting();         
 this.Invoke(new EventHandler(DisplayText));     
 } 

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

Я бы хотел обработать (DisplayText) с помощью фонового работника, чтобы последовательные данные могли поступать в очередь, чтобы не потеряться, пока фоновый работник обрабатывает размещение информации на экране. Если нет лучшего способа.

1 Ответ

2 голосов
/ 27 ноября 2011

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

И получить элементот Background-worker, просто используйте Dequeue

Вот ссылка на MSDN-статью о Queue -классе

http://msdn.microsoft.com/en-us/library/7977ey2c.aspx

Пример:

private Queue<string> data = new Queue<string>();

private void Rx_GetData(e)
{
    var rxString = e.ReadExisting();
    data.Enqueue(rxString);   
}

private void BackgroundWorker_DoWork()
{
    while(rxConn.IsConnected) // Haven't worked with serial connections, so I don't know the proper property here..
    {
        if(data.Count > 0)
        {
            var str = data.Dequeue();
            FormatString(str);
        }
        Thread.Sleep(10);
    }
}
...