У меня здесь очень странная проблема, может быть, вы, ребята, можете мне помочь. У меня есть устройство Windows CE 6, в котором используется считыватель карт штрих-кода, подключенный через последовательный порт. Я использую класс Compact Framework (v2.0) SerialPort
для этого, и все работает нормально.
Есть одна проблема, однако. Если карта открыта в любой момент до открытия последовательного порта, вся система зависает при вызове Open()
. Никаких исключений, никаких предупреждений, просто полное замораживание системы без причины. Я попытался очистить буферы перед открытием порта, но, видимо, этот метод можно использовать только после того, как порт был открыт, потому что я получил InvalidOperationException
.
Я сделал упрощенную версию кода, чтобы увидеть, связана ли с этим сложность, но простая форма с кнопкой, которая открывает порт, замерзнет таким же образом. Здесь упрощенный код:
private void btConnect_Click(object sender, EventArgs e)
{
try
{
this.serialPort = new SerialPort(this.txName.Text, Convert.ToInt32(this.txBaud.Text));
this.serialPort.RtsEnable = this.chRTS.Checked;
this.serialPort.Open(); //it freezes here
this.btConnect.Text = "Disconnect";
this.txName.Enabled = false;
this.txBaud.Enabled = false;
this.chRTS.Enabled = false;
}
catch
{
MessageBox.Show("Failed to open port. Please check your settings and try again.", "Operation failed", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);
}
}
Я не вижу, что я делаю неправильно, я начинаю думать, что это ошибка в компактной структуре. Устройство считывания карт отправляет пакеты, такие как F03030DKD03003\r\n
. Есть идеи? Спасибо заранее.
Классы SerialPort, предоставляемые MS, оставляют желать лучшего. То, что вам действительно нужно знать, это именно то, где в нативных вызовах вещь застревает. Я предполагаю, что внутренние буферы содержат данные в них или, возможно, даже переполнение, и управляемая оболочка на это нажимает.
Мое предложение состоит в том, чтобы получить последовательную библиотеку OpenNETCF, которая является бесплатной и поставляется с полным исходным кодом. Он совместим с интерфейсами, совместимыми с MS-классами, и позволит вам полностью пройти код к вызовам драйвера, чтобы увидеть, что происходит.
Вернувшись, когда я делал серийные драйверы, я столкнулся с ошибкой в UART 16550 (по крайней мере, несколько из них), что чип закроется, если в Регистре получателей данных произойдут данные, когда FIFO были включены,
Я исправил эту ошибку, попросив драйвер очистить чип, прежде чем включить FIFO. Тем не менее, я был бы удивлен, если бы что-то недавнее, как WinCE 6, не позаботилось об этой ошибке, но я полагаю, что это возможно (возможно, самые последние текущие версии 16550 больше не имеют этой ошибки). Я не особо знаком с WinCE - это источник для серийного драйвера, доступного в некоторых DDK? Есть ли опция поддержки/обновления для серийного драйвера, который вы используете?