C # Serial Data - потеря данных после форматирования полученной строки данных - PullRequest
3 голосов
/ 23 ноября 2011

Мой проект - это Дисплей клиента, который подключается к POS ресторана (кассовый аппарат на базе ПК) через последовательное соединение.Я использую C #, Visual Studio 2010.

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

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

ПРОБЛЕМА: Когда POS отправляет несколько элементов быстро, что-то разваливается, и не весь текст обрабатывается / форматируется / размещается на экране должным образом.как показано на втором изображении.

Вы можете видеть, где несколько элементов «проскальзывали» и показывают коды элементов.

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

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

КОД:

private void OnDataReceived(object sender, System.EventArgs e)
    {
        RxString = (myPortController.Read());

        RxString = RxString.TrimStart(new char[] { (char)02 }); // trim the Char02 so I can test for the 'Clear Screen' signal
        if (RxString == "")
        {
        }
        else RxString = RxString.Remove(RxString.Length - 1, 1); // Trim the end of line ascii character (dont need it for list box)

        if (RxString.StartsWith("C"))  // this is the 'Clear Screen' signal.  ClearAll is a simple func. to remove text from all controls
        {                              // to clear the screen after each order.
            ClearAll();

        }
        else  // Next sections display the text on screen, testing for Tax, Total or if not, then its a regular Menu Item

            if (RxString.Contains("Tax"))
            {
                labelTax.Text = RxString.Remove(0, 5);
            }
            else
                if (RxString.Contains("Total"))
                {
                    labelTotal.Text = RxString.Remove(0, 5);
                }

                else

                    if (RxString == "")
                        RxString = "";  // just do nothing with an empty string (dont know better way of ignoring that)

                    else
                    {
                        listOrderItems.Items.Add((RxString.Remove(0, 5)));  // Add the main menu items to the Listbox
                    }

     }

МЕТОД С ИСПОЛЬЗОВАНИЕМ ОТДЕЛЬНОЙ РУЧКИ ДЛЯ СОБЫТИЙ, НО ПОЛУЧИЛ ОДИН И ТО ЖЕ РЕЗУЛЬТАТ:

1 Ответ

0 голосов
/ 23 ноября 2011

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

Изучите разработку через тестирование и создайте свою OnDataReceived обработчик событий с компонентами, которые вы полностью протестировали.Основная часть обработчика - обработка текста, и вы можете легко сделать это с другим классом.Похоже, что вы принимаете когда-то работающий код как евангелие (и, возможно, некоторое кодирование по совпадению ).

Возьмите простую полученную текстовую строку и создайте классы, которые их анализируют и возвращают соответствующийданные.Затем создайте более сложные тестовые наборы с более крупными строками, отмененными элементами и т. Д. Как только вы будете довольны своими тестами, проведите некоторое тестирование с оборудованием и посмотрите, как оно работает.Если это не удастся, вам нужно добавить еще несколько тестов.

Затем ... вспенить, промыть, повторить.

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