Вот некоторый фон того, что я пытаюсь сделать:Как заставить метод записи последовательного порта ждать, пока строка будет очищена до отправки ее данных?
- Открыть последовательный порт с помощью мобильного устройства к принтеру Bluetooth.
- Отправьте EPL/2 форму на принтер Bluetooth, чтобы он понимал, как обрабатывать данные, которые он собирается получить.
- После получения формы отправьте некоторые данные на принтер, который будет напечатан на складе этикеток.
- Повторите шаг 3 столько раз, сколько необходимо для каждой маркируемой метки.
Шаг 2 происходит только в первый раз, так как форма не должна предшествовать каждой метке. Моя проблема в том, что когда я отправлю форму, если я отправлю данные метки слишком быстро, она не будет печататься. Иногда я получаю сообщение «Отказ Bluetooth: Радио, не действующий», напечатанный на ярлыке, а не данные, которые я отправил.
Я нашел способ обойти эту проблему, выполнив следующие действия:
for (int attempt = 0; attempt < 3; attempt++)
{
try
{
serialPort.Write(labelData);
break;
}
catch (TimeoutException ex)
{
// Log info or display info based on ex.Message
Thread.Sleep(3000);
}
}
Так в принципе, я могу поймать TimeoutException и повторить метод записи после ожидания определенного количества времени (три секунды, кажется, работает все время, но все равно и, кажется, бросает исключение каждую попытку). После трех попыток я просто предполагаю, что у последовательного порта есть что-то неправильное и сообщит пользователю.
Этот способ, похоже, работает нормально, но я уверен, что есть лучший способ справиться с этим. В классе SerialPort есть несколько свойств, которые, я думаю, мне нужно использовать, но я не могу найти хорошую документацию или примеры того, как их использовать. Я пробовал играть с некоторыми из свойств, но никто из них, похоже, не делает то, что я пытаюсь достичь.
Вот список свойств я играл с:
- CDHolding
- CtsHolding
- DsrHolding
- DtrEnable
- Рукопожатие
- RtsEnable
Я уверен, что некоторые из них будут обрабатывать то, что я пытаюсь сделать более изящно.
Я использую C# (2.0 framework), принтер Bluetooth Zebra QL 220+ и портативное устройство Windows Mobile 6, если это имеет значение для решений.
Любые предложения будут оценены.
[ОБНОВЛЕНИЕ]
Следует также отметить, что мобильное устройство использует Bluetooth 2.0, в то время как принтер только в версии 1.1. Я предполагаю, что разница в скорости - это то, что заставляет принтер отставать в получении данных.
Джейсон, вы связались с Зебра, и что они сказали? Мне интересно узнать, как получилась эта история ... – 2009-12-22 15:20:32
Это было некоторое время назад ... Я просто помню, что они рекомендовали управление потоком программного обеспечения, которое мы уже определили как лучший подход.Я не помню, чтобы они упоминали ограничение скорости передачи или что-то в этом роде. – 2009-12-22 22:36:21