Здравствуйте.Знаю, что тема не совсем для этого форума, но вдруг тут есть знатоки 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); }}
Не уверен, но проблема может быть в том, что 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.
И Всё же простите за вмешательство... в моём случае было аналогичное зависание, когда устройство к которому обращался зависало, а чтение было на PC. Помогло только применение неблокирующего чтения из порта... но это уже в Linux. Причём в Windows зависало так, что не работало и соединение по Eternet. Программа была ещё и сервером в локальной сети. Обратите внимание на неблокирующий режим. Простите, если что не так!