Исключение SerialPort.Open() —исключение IOException — «Параметр неверен».

#c# #.net #serial-port

#c# #.net #последовательный порт

Вопрос:

Я написал следующий код для настройки последовательного порта при загрузке основной формы. При первом запуске выдается сообщение IOException об открытии порта, указывающее, что параметр неверен. Но когда я повторно запускаю приложение, оно работает нормально. Исключение возникает только при первом запуске приложения после запуска компьютера, а затем оно работает нормально до следующей перезагрузки компьютера.

 private void Main_Load(object sender, EventArgs e)
{
    this.serialPort1.PortName = "COM3";
    this.serialPort1.BaudRate = 9600;
    this.serialPort1.DataBits = 8;
    this.serialPort1.DataReceived  = new System.IO.Ports.SerialDataReceivedEventHandler(serialPort1_DataReceived);

    this.serialPort1.Open(); //Exception comes here
    this.serialPort1.WriteLine("AT#cid=1"   System.Environment.NewLine);

}
  

Подробности исключения:

Исключение System.IO.IOException не было обработано пользовательским кодом

Сообщение= «Параметр неверен.rn» Источник=»System»

Отслеживание стека: в System.IO.Ports.Внутренние ресурсы.Ошибка WinIOError(код ошибки Int32, строка str) в System.IO.Ports.Внутренние ресурсы.WinIOError() в System.IO.Ports.SerialStream.set_RtsEnable(логическое значение) в System.IO.Ports.SerialStream..ctor(строковое имя порта, скорость передачи данных Int32, четность по четности, Int32 бита данных, StopBits StopBits, Int32 ReadTimeout, Int32 WriteTimeout, квитирование квитирования, логическое значение DtrEnable, логическое значение RtsEnable, логическое значение discardNull, соотношение байтов) в System.IO.Ports.SerialPort.Open() в JKamdar.Main.Main_Load(отправитель объекта, EventArgs e) в D:ProjectJKamdarJKamdarMain.cs:line 264 в системе.Windows.Forms.Form.OnLoad(EventArgs e) в системе.Windows.Формы.Form.OnCreateControl() в системе.Windows.Формы.Управление.createControl(логическое значение fIgnoreVisible) в системе.Windows.Формы.Управление.createControl() в системе.Windows.Формы.Управление.WmShowWindow(сообщение и m) в системе.Windows.Формы.Управление.WndProc(сообщение и m) в системе.Windows.Формы.ScrollableControl.WndProc(сообщение и m) в системе.Windows.Формы.ContainerControl.WndProc(сообщение и m) в системе.Windows.Forms.Form.WmShowWindow(сообщение и m) в системе.Windows.Forms.Form.WndProc(сообщение и m) в системе.Windows.Формы.Управление.ControlNativeWindow.onMessage(сообщение и m) в системе.Windows.Формы.Управление.ControlNativeWindow.WndProc(сообщение и m) в системе.Windows.Формы.NativeWindow.Обратный вызов (IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) Исключение InnerException:

Комментарии:

1. Можем ли мы, пожалуйста, получить полное сообщение об исключении и трассировку стека?

2. Проверьте, какова скорость передачи данных через диспетчер устройств, возможно, это проблема (просто предположение)

3. @V4Vendetta: максимальная скорость порта 460800

4. @Niraj: какая ОС? Можете ли вы проверить это в других операционных системах, чтобы увидеть, какие из них затронуты?

5. установите this.serialPort1.RtsEnable = true и попробуйте

Ответ №1:

Пожалуйста, попробуйте использовать это.serialPort1.RtsEnable = true

Предлагается на основе трассировки стека вашего исключения

 at System.IO.Ports.SerialStream.set_RtsEnable(Boolean value)
at System.IO.Ports.SerialStream..ctor(String portName, Int32 baudRate, Parity parity, Int32 dataBits, StopBits stopBits, Int32 readTimeout, Int32 writeTimeout, Handshake handshake, Boolean dtrEnable, Boolean rtsEnable, Boolean discardNull, Byte parityReplace)
at System.IO.Ports.SerialPort.Open()
  

Ответ №2:

Проверьте, выдает ли следующий код ошибку

 SerialPort port = new SerialPort(    "COM3", 9600, Parity.None, 8, StopBits.One);

  // Open the port for communications
  port.Open();

  // Write a string
  port.Write("Hello World");

  // Write a set of bytes
  port.Write(new byte[] {0x0A, 0xE2, 0xFF}, 0, 3);

  // Close the port
  port.Close();
  

Ответ №3:

Проверка того, что com-порт «COM3» открыт, могла бы решить проблему, я думаю. Если он открыт, вам следует сначала закрыть его, а затем снова открыть. Открытие открытого порта может привести к некоторым ошибкам.