C # serialPort: приложение зависает, если на Write () нет виртуального нуль-модема. - PullRequest
3 голосов
/ 03 ноября 2011

Я занимаюсь разработкой приложения WinForms для ПК на C #, которое позже необходимо подключить к микроконтроллеру.На данный момент, для целей тестирования, я создал виртуальный нуль-модем на своем компьютере и связал его с терминальной программой.

Виртуальный нуль-модем, который я использую, это "com0com": http://sourceforge.net/projects/com0com/

Вот скриншот настроек пары COM-порта: enter image description here

В моем приложении я использую компонент serialPort.Вот как настраивается serialPort:

public bool SerialPortSetup(String cp)
{
    String port = cp;
    int baud = 19200;
    Parity parity = Parity.None;
    int databit = 8;
    StopBits stopbit = StopBits.One;

    try
    {
        // Initialize serial port
        serialPort1 = new SerialPort(port, baud, parity, databit, stopbit);
        serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPortDataReceived);
        serialPort1.Open();
        return true;
    }
    catch (Exception e)
    {
        MessageBox.Show(e.Message);
        return false;
    }
}

Другие свойства serialPort: enter image description here

Терминальная программа, которую я подключил к COM2, настроена с той же скоростью передачи данных, четность, база данных, стоп-бит и т. д. Когда я подключил свое собственное приложение к COM1, а терминал к COM2, все это работает просто отлично.И запись, и чтение в обоих направлениях.

Однако, когда я не использую порт COM2 (то есть терминальная программа не открывается), мое приложение зависает как раз в секунду, когда я начинаю использовать serialPort1.Write(str)где str - просто случайная строка.Когда я запускаю свое приложение из Visual Studio, я могу закрыть его, только остановив отладку.Это не значит, что Windows помечает его как «не отвечающий».Кстати, я всегда проверяю, открыт ли последовательный порт, прежде чем писать в него.

Мне нужна эта проблема, чтобы уйти.Идеи?

Ответы [ 2 ]

8 голосов
/ 02 августа 2013

Я знаю, что этот вопрос немного старый, но я столкнулся с ним, когда искал решение той же проблемы.

Вам необходимо изменить пару настроек в com0com, которые описаны здесь http://www.magsys.co.uk/comcap/onlinehelp/null_modem_emulator_com0com.htm.

Короче говоря, вам нужно включить переполнение буфера для принимающего порта и эмуляцию скорости передачи в порте отправки. Это просто сделать с помощью диалогового окна на изображении OP.

1 голос
/ 03 ноября 2011

С реальным COM-портом операция записи всегда завершается успешно и никогда не зависает.Такие проблемы могут возникать с различными эмуляциями портов, такими как тот, который вы используете сейчас.С этим ничего не поделаешь: протестируйте вашу программу с реальным COM-портом, если она работает, все в порядке.

Если у вас на компьютере два COM-порта, подключите их с помощью NULL-модема и сделайте то же самое.без использования эмуляции COM-порта.

Ошибка программы эмуляции COM-порта может сделать все, от сбоя клиентской программы до синего экрана.Если вы разработчик программы эмуляции, вы можете справиться с этим.Если нет, просто используйте эмуляцию правильно - ваша клиентская программа выглядит нормально.

Еще одна вещь, которую вы можете проверить: попробуйте подключить терминальную программу к COM1, без какой-либо программы, подключенной к COM2, и отправьте что-нибудь.Что происходит в этом случае?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...