Мой проект - это Дисплей клиента, который подключается к 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
}
}
МЕТОД С ИСПОЛЬЗОВАНИЕМ ОТДЕЛЬНОЙ РУЧКИ ДЛЯ СОБЫТИЙ, НО ПОЛУЧИЛ ОДИН И ТО ЖЕ РЕЗУЛЬТАТ: