Необработанное исключение типа "System.IO.IOException" в System.dll - C#
Формулировка задачи:
Здравствуйте. Недавно начал учиться программировать на C#. При создании следующей программы встретил такую ошибку: Необработанное исключение типа "System.IO.IOException" в System.dll
Дополнительные сведения: Операция ввода/вывода была прервана из-за завершения потока команд или по запросу приложения.
Ошибка появляется сразу при старте программы. В коде, строка ошибки отмечена комментарием "ОШИБКА".
Вопрос: Как побороть эту ошибку?
Суть программы: одновременный ввод/вывод в COM-порт, т.е. пока вводятся команды через консоль, была возможность считывать и выводить приходящие значения в этот же момент времени. Для выполнения этой задачи были выбраны потоки.
P.S. Пробовал удалить while (true) {} в теле программы.
Тогда выдает такую ошибку, в том же месте: Необработанное исключение типа "System.InvalidOperationException" в System.dll
Дополнительные сведения: Порт закрыт.
P.P.S. Если ReadCOM и WriteCOM, использовать синхронно, то ошибки закрытого порта нет.
Листинг программы
- namespace TestCOM
- {
- class Program
- {
- public static SerialPort port; // Переменная для объявления Serial
- // ----==== Создание COM-порта ====----
- public static void CreateCOM() {
- Console.WriteLine();
- Console.WriteLine("Доступые COM-порты:");
- string[] portNames = SerialPort.GetPortNames(); //Доступные COM-порты
- int nc = 1; // Счетчик COM-портов
- foreach (String elCOM in portNames) { //Считываем доступные COM-порты и выводим их
- Console.WriteLine(nc + ". " + elCOM);
- nc++;
- }
- Console.Write("Введите имя нужного COM-порта: ");
- String portName = Console.ReadLine().ToUpper(); //Ввод имени COM-порта
- port = new SerialPort( portName, 9600 ); //Создаем COM-порт
- }
- /* ************************************************************* */
- // ----==== Ошибка COM-порта ====----
- public static void ErrorCOM(IOException ex, Exception ex2) {
- Console.WriteLine("----==== Ошибка соединения ====----");
- if (ex == null) { Console.WriteLine("Ошибка: " + ex2.Message); } else {
- Console.WriteLine("Ошибка: " + ex.Message);
- }
- Console.WriteLine();
- port.Close(); //Закрыть COM-порт
- }
- /* ************************************************************* */
- // ----==== Считывание COM-порта ====----
- public static void ReadCOM() {
- String dataRead = port.ReadLine().Replace("\r", ""); // ОШИБКА
- Console.WriteLine(port.PortName + " отправил: " + dataRead);
- }
- /* ************************************************************* */
- // ----==== Отправка в COM-порт====----
- public static void WriteCOM() {
- Console.WriteLine( "Отправить: " );
- String dataWrite = Console.ReadLine(); // Переменная для отправки значений на COM-порт
- port.WriteLine( dataWrite );
- }
- /* ************************************************************* */
- // ----==== Начало программы ====----
- public static void Main(string[] args) {
- Console.Title ="Тест COM-порта";
- Console.WriteLine("Вас приветствует программа "Тест COM-порта"");
- LinkCreateCOM:
- CreateCOM();
- try {
- //Открываем COM-порт
- port.Open();
- Console.WriteLine("----==== Соединение установлено ====----");
- Thread Writer = new Thread( WriteCOM );
- Thread Reader = new Thread( ReadCOM );
- while ( true ) {
- Writer.Start(); //Отправка значений на COM-порт
- Reader.Start(); //Читаем COM-порт
- }
- } catch (IOException ex) {
- ErrorCOM(ex, null);
- goto LinkCreateCOM;
- } catch (Exception ex) {
- ErrorCOM(null, ex);
- goto LinkCreateCOM;
- } finally { port.Close(); } //Закрыть COM-порт
- Console.WriteLine("Нажмите любую клавишу для выхода...");
- Console.ReadKey();
- }
- }
- }
Решение задачи: «Необработанное исключение типа "System.IO.IOException" в System.dll»
textual
Листинг программы
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.ComponentModel;
- namespace SPMonitor_Test {
- class Program {
- static void Main(string[] args) {
- PortMonitor monitor = new PortMonitor("COM1", 9600);
- monitor.ProgressChanged += new ProgressChangedEventHandler(monitor_ProgressChanged);
- monitor.RunWorkerAsync();
- string msg;
- while (true) {
- Console.WriteLine("Enter message to send to port:");
- msg = Console.ReadLine();
- monitor.SendMessage(msg);
- }
- }
- static void monitor_ProgressChanged(object sender, ProgressChangedEventArgs e) {
- string outMsg = e.UserState.ToString();
- Console.WriteLine("Message from port: {0}",outMsg);
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д