Необработанное исключение типа "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);
}
}
}