SerialPort.Open() - 参数不正确

Ala*_* M. 0 .net c# serial-port

我正在尝试在 C# 中打开 COM 端口,但收到 IO 异常并显示错误消息:

\n\n
\n

参数不正确

\n
\n\n

我看到这篇文章:SerialPort.Open() --IOException \xe2\x80\x94 \xe2\x80\x9c参数不正确。\xe2\x80\x9d \
n描述了相同的问题,但设置RtsEnabletrue没有解决我的问题(没有改变)。

\n\n

这是我的代码:

\n\n
cmp_Comport.PortName = "COM6";\ncmp_Comport.BaudRate = 9600;\ncmp_Comport.Parity = Parity.None;\ncmp_Comport.StopBits = StopBits.One;\ncmp_Comport.DataBits = 8;\ncmp_Comport.Handshake = Handshake.None;\ncmp_Comport.RtsEnable = true;\ncmp_Comport.DataReceived += new SerialDataReceivedEventHandler(CMP_DadaReceived);\ncmp_Comport.Open(); // ==> Causes exception\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是完整的异常堆栈跟踪:

\n\n
\n

在 System.IO.Ports.InternalResources.WinIOError(Int32 errorCode, String str)
\n 在 System.IO.Ports.InternalResources.WinIOError()
\n 在 System.IO.Ports.SerialStream.InitializeDCB(Int32 baudRate, Parity 奇偶校验, Int32 dataBits、StopBits stopBits、布尔discardNull)
\n 在 System.IO.Ports.SerialStream..ctor(String portName、Int32 baudRate、Parity 奇偶校验、Int32 dataBits、StopBits stopBits、Int32 readTimeout、Int32 writeTimeout、Handshake 握手、Boolean dtrEnable、布尔 rtsEnable、布尔 DiscardNull、字节 parityReplace)
\n 位于 System.IO.Ports.SerialPort.Open()
\n 位于 C:...\\MyProject\\Comport 中的 MyProject.Comport.CMP_Open(Int32 ind, String& error) .cs:第 83 行

\n
\n\n

请注意,在另一个软件(例如Hercules)中,相同的端口打开得很好。

\n

小智 5

此异常通常发生在没有底层物理 RS​​232 实现的虚拟(例如 USB)COM 端口上。此类端口不管理状态位,因此当尝试设置串行端口的通信参数时,该SerialPort.Open()方法会引发错误 87“参数不正确”。IOException

System.IO.Ports.SerialPort类不支持这种情况,但您可以使用其他实现。

例如,使用SerialPortStream库(也可在NuGet中使用),您可以使用SerialPortStream.OpenDirect()以下方法打开串行 COM 端口,而无需设置通信参数:

namespace Vurdalakov
{
    using System;
    using RJCP.IO.Ports;

    class Program
    {
        static void Main(String[] args)
        {
            using (var serialPort = new SerialPortStream("COM1"))
            {
                serialPort.OpenDirect();

                while (serialPort.IsOpen)
                {
                    var ch = (Char)serialPort.ReadChar();
                    Console.Write(ch);
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)