Зависает форма c# при чтении com порта

Тема в разделе "Проводная и беспроводная связь", создана пользователем Sergej456, 29 окт 2017.

  1. Sergej456

    Sergej456 Нуб

    Здравствуйте.Знаю, что тема не совсем для этого форума, но вдруг тут есть знатоки C#. Проблема следующая: Устройство пишет множество строк (по объёму около 600мб) в порт. Скорость 1000000. Программа должна писать все строки в файл txt. Проблема в том, что через 10-15 секунд работы программа начинает зависать. Если я даю команду на закрытие порта, то на этой команде всё и зависает окончательно. В отладчике видно, что myport.Close() так и не выполняется до конца (ждал несколько минут).

    Код (C++):
    private async void button3_Click(object sender, EventArgs e)
        {
            myport = new SerialPort();
            myport.BaudRate = 1000000;
            myport.PortName = comboBox1.SelectedItem.ToString();
            myport.Parity = Parity.None;
            myport.DataBits = 8;
            myport.StopBits = StopBits.One;
            myport.DataReceived += myport_DataReceived;
            try
            {
                if (myport.IsOpen)
                {
                    myport.Close();
                    myport.Open();

                }
                else
                {
                    myport.Open();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error");
            }
            if (myport.IsOpen)
            {
           }
        }


    public async void myport_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            in_data = myport.ReadLine();

            if (in_data != null)
            {
               byte[] b = ASCIIEncoding.ASCII.GetBytes(in_data);
               string myFilePath = @"C:\Users\Sergej\OneDrive\testc#\test.txt";
               File.AppendAllText(myFilePath, (b[0] - 14).ToString() + (b[1] - 14).ToString() + (b[2] - 14).ToString() + (b[3] - 14).ToString() + (b[4] - 14).ToString() + (b[5] - 14).ToString() + Environment.NewLine);
    }}
     
  2. DIYMan

    DIYMan Гуру

    Не уверен, но проблема может быть в том, что myport_DataReceived выполняется не в GUI-потоке приложения (кто знает, что там в кишочках у File, и вдруг он требует контекст GUI-потока для какой-нибудь функции - надо доку смотреть). Это полный код, с GUI нигде работа не идёт? Короче - событие DataReceived точно выполняется в контексте другого потока, и надо делать Invoke, чтобы перевести обработку в GUI-поток, если хоть что-то из GUI дёргается. Вот здесь приведён отличный пример: https://stackoverflow.com/questions...nforms-controls-from-a-serial-port-in-a-class

    Возможно, у вас именно такая проблема.

    З.Ы. Кстати, конфигуратор проекта в подписи к моему сообщению написан как раз на C# и там идёт работа с SerialPort и GUI именно через Invoke. Студию юзаю древнюю - 2010.
     
    Igor68 нравится это.
  3. Igor68

    Igor68 Гуру

    И Всё же простите за вмешательство... в моём случае было аналогичное зависание, когда устройство к которому обращался зависало, а чтение было на PC. Помогло только применение неблокирующего чтения из порта... но это уже в Linux. Причём в Windows зависало так, что не работало и соединение по Eternet. Программа была ещё и сервером в локальной сети. Обратите внимание на неблокирующий режим.
    Простите, если что не так!
     
    Последнее редактирование: 30 окт 2017