使用serialport.open时(IO异常错误)(IO exception error when

2019-07-19 21:55发布

最后更新这是我们固件的全部时间。 尴尬在一定程度上,但我很高兴我们能向前走,我可以把学习Java关闭一天。 我的回答如下。

UPDATE所以我或多或少地放弃了这一点。 我认为这是下降到API中的错误,但我既没有时间,资源,也没有技能设置才能到它的底部。 我认为存在一些硬件为之Windows只是给出了中指。 我已经下载了Eclipse,切换到Java,并会尝试看看是否能工程。 如果没有,你会看到我回到这里。 不过,我绝对喜欢来解决这个所以如果任何人有时间或意愿深入挖掘这一块,我很乐意看到你想出。 很显然,我会回到这里检查不时。 请确保你“@”我在你的意见,所以我提醒。


原帖

我知道有几个人处理这个问题,但我希望有人能帮助我。 我试图连接到一个COM端口,但我得到一个IO异常,当我尝试使用serialport.Open()命令:

System.IO.IOException: The parameter is incorrect.

   at System.IO.Ports.InternalResources.WinIOError(Int32 errorCode, String str)
   at System.IO.Ports.InternalResources.WinIOError()
   at System.IO.Ports.SerialStream.InitializeDCB(Int32 baudRate, Parity parity, Int32 dataBits, StopBits stopBits, Boolean discardNull)
   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()
   at *programtitlehere.cs*:line 90

我使用Stellaris LM4F232来模拟一个COM端口。 我可以打开,访问和我得到使用白蚁(终端程序)的好成绩,但每当我试图与Visual Studio它甚至不会连接和我得到这个错误。 现在,我甚至不真的知道这是什么错误意味着,我虽然想读其他地方我还是感到失落。

任何人都可以向我解释这里发生了什么,也许我可以开始尝试算出这个? 我可以有更多的代码,但说实话没有太多存在; 通过一个串口设备的所有属性都为正常,并且仅与该设备发生(I可以使用MSP430具有相同细节没有问题)。

我的代码如下所示想看到它的人谁(注意,这只是一个“沙箱”,而不是实际的程序,但症状是相同的):

  try
        {
            serialPort1.PortName = "COM5";
            serialPort1.Open();
            if (serialPort1.IsOpen == true)
            {
                textBox1.Text = "CONNECTED";
            }
            else
            {
                textBox1.Text = "NOT CONNECTED";
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: " + ex.ToString(), "ERROR");
        }

和其他设置与物业经理(唯一的区别是波特率设置为230400,其他都是他们默认)完成。 我可以打开了这个COM4(一个MSP430),其对于所有的意图和目的是相同的设备。 我可以用白蚁打开COM5所以我知道连接是否良好)。 不,我不是在同一时间打开它们。 如果您需要更多的信息,让我知道,我可以发布更多。

谢谢!

编辑:我在试图弄清楚这一点,并仍然没有运气三服。 我真的不明白,为什么我可以通过一个终端程序,而不是我自己的时候尽可能靠近我可以看到有绝对没有区别访问此COM。 有谁知道一个程序,可以“检查”一个COM端口,看看它的性能(除了窗口管理器我的意思)吗? 我越来越漂亮沮丧,并在静止不动是那种在我的项目,直到我想出解决办法...

EDIT2:我发现一个明显的解决办法,但我还没有得到它的工作在这里 。 现在,我得到了几个不同的IO错误,但至少它是运动(不知道这是进步)。 我还了解到,这是一个.NET的错误,因为2.0已经存在。 我仍然希望任何帮助,但如果我弄明白我会报到。 扎克的代码(上面链接的解决方法)如下所示:

using System;
using System.IO;
using System.IO.Ports;
using System.Runtime.InteropServices;
using System.Text;
using Microsoft.Win32.SafeHandles;

namespace SerialPortTester
{
public class SerialPortFixer : IDisposable
{
    public static void Execute(string portName)
    {
        using (new SerialPortFixer(portName))
        {
        }
    }
    #region IDisposable Members

    public void Dispose()
    {
        if (m_Handle != null)
        {
            m_Handle.Close();
            m_Handle = null;
        }
    }

    #endregion

    #region Implementation

    private const int DcbFlagAbortOnError = 14;
    private const int CommStateRetries = 10;
    private SafeFileHandle m_Handle;

    private SerialPortFixer(string portName)
    {
        const int dwFlagsAndAttributes = 0x40000000;
        const int dwAccess = unchecked((int) 0xC0000000); 

        if ((portName == null) || !portName.StartsWith("COM", StringComparison.OrdinalIgnoreCase))
        {
            throw new ArgumentException("Invalid Serial Port", "portName");
        }
        SafeFileHandle hFile = CreateFile(@"\\.\" + portName, dwAccess, 0, IntPtr.Zero, 3, dwFlagsAndAttributes,
                                          IntPtr.Zero);
        if (hFile.IsInvalid)
        {
            WinIoError();
        }
        try
        {
            int fileType = GetFileType(hFile);
            if ((fileType != 2) && (fileType != 0))
            {
                 throw new ArgumentException("Invalid Serial Port", "portName");
            }
            m_Handle = hFile;
            InitializeDcb();
        }
        catch
        {
            hFile.Close();
            m_Handle = null;
            throw;
        }
    }

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern int FormatMessage(int dwFlags, HandleRef lpSource, int dwMessageId, int dwLanguageId,
                                            StringBuilder lpBuffer, int nSize, IntPtr arguments);

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern bool GetCommState(SafeFileHandle hFile, ref Dcb lpDcb);

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern bool SetCommState(SafeFileHandle hFile, ref Dcb lpDcb);

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern bool ClearCommError(SafeFileHandle hFile, ref int lpErrors, ref Comstat lpStat);

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern SafeFileHandle CreateFile(string lpFileName, int dwDesiredAccess, int dwShareMode,
                                                    IntPtr securityAttrs, int dwCreationDisposition,
                                                    int dwFlagsAndAttributes, IntPtr hTemplateFile);

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern int GetFileType(SafeFileHandle hFile);

    private void InitializeDcb()
    {
        Dcb dcb = new Dcb();
        GetCommStateNative(ref dcb);
        dcb.Flags &= ~(1u << DcbFlagAbortOnError);
        SetCommStateNative(ref dcb);
    }

    private static string GetMessage(int errorCode)
    {
        StringBuilder lpBuffer = new StringBuilder(0x200);
        if (
            FormatMessage(0x3200, new HandleRef(null, IntPtr.Zero), errorCode, 0, lpBuffer, lpBuffer.Capacity,
                          IntPtr.Zero) != 0)
        {
            return lpBuffer.ToString();
        }
        return "Unknown Error";
    }

    private static int MakeHrFromErrorCode(int errorCode)
    {
        return (int) (0x80070000 | (uint) errorCode);
    }

    private static void WinIoError()
    {
        int errorCode = Marshal.GetLastWin32Error();
        throw new IOException(GetMessage(errorCode), MakeHrFromErrorCode(errorCode));
    }

    private void GetCommStateNative(ref Dcb lpDcb)
    {
        int commErrors = 0;
        Comstat comStat = new Comstat();

        for (int i = 0; i < CommStateRetries; i++)
        {
            if (!ClearCommError(m_Handle, ref commErrors, ref comStat))
            {
                 WinIoError();
            }
            if (GetCommState(m_Handle, ref lpDcb))
            {
                 break;
            }
            if (i == CommStateRetries - 1)
            {
                 WinIoError();
            }
        }
    } 

    private void SetCommStateNative(ref Dcb lpDcb)
    {
        int commErrors = 0;
        Comstat comStat = new Comstat(); 

        for (int i = 0; i < CommStateRetries; i++)
        {
             if (!ClearCommError(m_Handle, ref commErrors, ref comStat))
             {
                 WinIoError();
             }
             if (SetCommState(m_Handle, ref lpDcb))
             {
                 break;
             }
             if (i == CommStateRetries - 1)
             {
                 WinIoError();
             }
        }
    }

    #region Nested type: COMSTAT

    [StructLayout(LayoutKind.Sequential)]
    private struct Comstat
    {
        public readonly uint Flags;
        public readonly uint cbInQue;
        public readonly uint cbOutQue;
    }

    #endregion

    #region Nested type: DCB

    [StructLayout(LayoutKind.Sequential)]
    private struct Dcb
    {
        public readonly uint DCBlength;
        public readonly uint BaudRate;
        public uint Flags;
        public readonly ushort wReserved;
        public readonly ushort XonLim;
        public readonly ushort XoffLim;
        public readonly byte ByteSize;
        public readonly byte Parity;
        public readonly byte StopBits;
        public readonly byte XonChar;
        public readonly byte XoffChar;
        public readonly byte ErrorChar;
        public readonly byte EofChar;
        public readonly byte EvtChar;
        public readonly ushort wReserved1;
    }

    #endregion

    #endregion
}

internal class Program
{
    private static void Main(string[] args)
    {
        SerialPortFixer.Execute("COM1");
        using (SerialPort port = new SerialPort("COM1"))
        {
            port.Write("test");
        }
    }
}
} 

EDIT3:6日:我还在刻苦这个。 我的水口粮很低,但我仍然在挣扎。 我觉得帮助肯定是在地平线上。 谁找到本杂志把我的遗体回到加拿大,并找到妮可。 告诉她,我爱她。

但严重的是,我不知道是什么原因造成了这个问题。 我想知道,如果它纯粹是嵌入式的; 也许是因为它是USB转走,或因为该设备能够被主机也。 有没有人遇到这个问题? 这并不能解释为什么我可以使用白蚁(终端程序,对那些观众刚刚加盟美国)虽然。 我一直在试图寻找一个开放源码的终端程序是:a)工程和b)看到)。 按照往常一样,我会,如果我发现这个问题,因为我现在已经找到了无数的论坛,它的声音的人都有过这样的问题,可以追溯到到2006年报告回到这里。

EDIT4:那么按所给的意见,我下载了一个端口监控软件应用程序(我Eltima串行端口监视器),它看起来像一个波特问题:

但奇怪的是不管什么波特我将它仍然失败。 并且还可以有人解释向上/向下的事情意味着什么? 我试着用搜索引擎,但该关键字过于宽泛。 像往常一样,我会继续汇报任何改变。

此外,为了记录在案,我可以连接在一个115200波特(同白蚁)使用Eltima。 不幸的是,这并不在Visual Studio中工作。

EDIT5:我们的剧情发生意外的转折。 我被监控时白蚁连接到COM端口的问题,BLAM会发生什么! 白蚁抛出确切的同样的错误我的程序,但它忽略它。 天才,对吧? 不拘小节,但它的作品。 现在,我需要学习如何忽略的IOExceptions。 当我得到它想通了,我马上汇报。

EDIT6:所以事实证明这是一个波特率的问题,但它更深入。 我一直在使用Eltima串行端口监控软件,这是非常直观和易于使用。 我会推荐它。 经过一番研究我了解到,你不能忽视这个例外,仍然使用.NETs库连接到串行端口。 所以,我必须去深入的Win32 API和写我自己。 我发现,这个摸了几页,但说实话之前,所以它可能是前一段时间我报到,但我一定会想出解决办法并尽快给大家我从来没有做过这样的事。 有太多的谁存在这个问题。 我发现不少论坛和网站在那里我可以看到完全一样的症状,但没有人真的做了很多工作,除了说“是的,.NET很烂”。 我打算写一个完整的静态库类,然后在我的网站上公布要么,这里还有其它地方我可以。 希望.NET会注意到的(因为2.0这个bug已经存在)。 当它完成我马上汇报!

EDIT7:这比我想象的要困难得多。

EDIT8:我不知道是否有人跟随此或没有,但我想说,我仍然在,但我出城出差一个星期。 我还是乐意听到的建议和想法的替代尽管!

Answer 1:

这个来自串口驱动程序,它是不满的设置之一。 随着波特率是一个不错的人选,司机往往只允许多达115200虽然这不应该是一个限制时,这是一个专门的CAN总线产品。

解决这一点,最好的方法是使用Sysinternals的PortMon工具,你可以看到什么被发送到驱动程序。 观察它终止第一,这是你的已知到工作的基线。 然后用的SerialPort性质鼓捣直到初始化命令,你PortMon看到它们,你的程序发送匹配的白蚁。 就在值,而不是命令。 如果不挑锅或者随后将其带到了停车场,并在回来的你的车好几次,购买另外一个品牌。


更新:它肯定看起来像一个波特率问题。 这是在.NET中的一个问题,它是不会忽视喜欢你的终端仿真程序做驾驶员的错误返回码。 因为你所谈论到的模拟串行端口的实际值不应该的问题。 然而,有与CAN总线速度的可能的问题,利率是可变的,这是我不清楚他们是如何谈判。 这往往是与昔日的DIP开关完成的,它很可能是司机要你通过波特率设置中指定的速度。 就必须有一些事情在包装盒上或说明书中无。 典型速度是40,250或500 Kbps的。 制造商肯定会知道,给他们打电话。



Answer 2:

我面临同样的问题,因为在这个线程的报道,但我设法解决这个问题!

我使用STM32F2xx的VCP!

事实上这是我的固件问题,我忘了,包括在我的USB回调串行端口设置!

从连接PC和固件串行端口的过程:

  1. 当电脑弹出一个串口通信,PC将发送一些命令,进入“配置端点”
  2. 在固件,它会有一个回调和固件将提供所有的USB信息(他们称之为USB描述符)
  3. USB信息是每个端点的配置,(例如:等待时间,数据传输大小,USB的类型 - 高速或低速)
  4. 一旦固件已经完成发送的所有信息,PC将确认和USB通信成功地打开
  5. 然后,PC将发送命令,以从固件串行端口设置
  6. 串行端口设置是 - 波特率,数据奇偶校验,比特长度
  7. 在固件,它应该回复串口设置恢复到PC( 发生在这里是我的错,我没有力回应任何串行端口设置回PC)
  8. 如果成功的话,PC将启动串口通信!
  9. 如果失败了,电脑会给出一个开放的串口错误(但确实注意到这个错误有时被忽略)

在STM32固件代码:

static int8_t CDC_Control_FS  (uint8_t cmd, uint8_t* pbuf, uint16_t length)
{   
    switch (cmd) {
       case CDC_GET_LINE_CODING:     
        {
            //I was missing this part
            uint32_t baudrate = 9600;
            pbuf[0] = (uint8_t)(baudrate);
            pbuf[1] = (uint8_t)(baudrate >> 8);
            pbuf[2] = (uint8_t)(baudrate >> 16);
            pbuf[3] = (uint8_t)(baudrate >> 24);
            pbuf[4] = 0;
            pbuf[5] = 0;
            pbuf[6] = 8;
            break;
        }:
....


Answer 3:

所以我们的惊心动魄的故事即将结束。 它是固件的全部时间(即在嵌入式设备上的代码)。 我们改变了一些功能和基本戳周围,切碎,加入共清理了代码,瞧,代码工作。 此峰概括起来相当不错。 诅咒你!固件

然而,在我(长篇)问题描述的漏洞仍然存在对许多人来说,我知道有很多人在那里谁仍然有它。 我只能说是运气好和四检查固件(显然三重检查是不够的这些天)。



Answer 4:

我遇到了同样的情况。 我试图串行通信连接到位于/ dev / ttyUSB0我的3G USB适配器(华为E303F)。 我用单在Raspbian(覆盆子PI2)。 在我的开发PC和MacOS,我的程序运行正常。 但是,当我部署到Raspbian,我就Serial.Open了IOException的水管坏了错误()。

我把我的3天调试和尝试所有可能的解决方案。 最后,我发现我必须设置...

serialPort.DtrEnable = true;
serialPort.RtsEnable = true;

之前调用。开()。 我希望这可以帮助谁面临着同样的问题我的其他人。



Answer 5:

我有同样的问题和波特率设置为1,固定它!!!!!



文章来源: IO exception error when using serialport.open()