SerialPort.Open () останавливает систему, если данные были получены ранее (Compact Framework) - PullRequest
2 голосов
/ 31 марта 2009

У меня здесь очень странная проблема, может быть, вы, ребята, можете мне помочь. У меня есть устройство 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. Есть идеи? Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 01 апреля 2009

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

Мое предложение - получить серийную библиотеку OpenNETCF , которая является бесплатной и поставляется с полным исходным кодом. Он совместим по интерфейсу с классами, предоставляемыми MS, и позволит вам пройти код до вызовов драйвера, чтобы увидеть, что происходит.

1 голос
/ 31 марта 2009

Когда я делал последовательные драйверы, я столкнулся с ошибкой в ​​16550 UART (по крайней мере, с некоторыми из них), из-за которой микросхема блокировалась, если в регистре приема данных имелась ошибка, когда были включены FIFO. ,

Я исправил эту ошибку, заставив драйвер очистить чип перед включением FIFO. Тем не менее, я был бы удивлен, если бы что-то столь же недавнее, как WinCE 6, не позаботилось об этой ошибке, но я полагаю, что это возможно (возможно, в большинстве современных реализаций 16550 этой ошибки больше нет). Я не особенно знаком с WinCE - источник последовательного драйвера доступен в некоторых DDK? Есть ли опция поддержки / обновления для используемого вами последовательного драйвера?

...