SerialPort.Open () останавливает систему, если данные были получены ранее (Compact Framework)

2

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

Теги:
serial-port
compact-framework

2 ответа

3

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

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

1

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

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

  • 0
    К сожалению, неверное предположение - серийный драйвер предоставляется OEM-производителем - конечно, CE поставляется с образцом, но многие, многие OEM-производители просто приносят свои старые драйверы от предыдущих версий.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню