访问端口' COM1'被时间控制器拒绝

时间:2016-08-23 07:57:27

标签: winforms c#-4.0 serial-port modbus

这是我的代码。在这段代码中,我每时每秒都在调用

  

错误comp端口访问被拒绝

我在5次通话后得到这个。

using (SerialPort port = new SerialPort(serialPortName))
    {
        if (port.IsOpen)
        {
            port.Close();
            port.Dispose();
        }

        port.BaudRate = 19200;
        port.DataBits = 8;
        port.Parity = Parity.None;
        port.StopBits = StopBits.Two;

        port.Open();

        // create modbus master
        IModbusSerialMaster master = ModbusSerialMaster.CreateRtu(port);
        byte slaveId = Convert.ToByte(txtSlaveId.Text.Trim());
        ushort startAddress = Convert.ToUInt16(StartAddress);
        ushort numRegisters = Convert.ToUInt16(NumberofRegisters);

        SystemLog systemLog = new SystemLog();
        systemLog.SlaveId = txtSlaveId.Text.Trim();
        systemLog.VariableName = VariableName;
        systemLog.ReadStartTime = DateTime.Now;

        switch (Type)
        {
            case "CO":
                bool[] status = master.ReadCoils(slaveId, startAddress, numRegisters);
                for (int j = 0; j < numRegisters; j++)
                {
                    systemLog.ReadEndTime = DateTime.Now;
                    systemLog.ReadAddress = Convert.ToString(Convert.ToInt32(StartAddress) + j);
                    systemLog.ReadType = (int)PLCReadType.COIL;
                    systemLog.ReadValue = Convert.ToString(status[j]);

                }
                break;
            case "IR":
                ushort[] inputRegister = master.ReadInputRegisters(slaveId, startAddress, numRegisters);
                for (int j = 0; j < numRegisters; j++)
                {
                    systemLog.ReadEndTime = DateTime.Now;
                    systemLog.ReadAddress = Convert.ToString(Convert.ToInt32(StartAddress) + j);
                    systemLog.ReadType = (int)PLCReadType.COIL;
                    systemLog.ReadValue = Convert.ToString(inputRegister[j]);

                }
                break;
            case "HR":
                ushort[] holdingRegister = master.ReadHoldingRegisters(slaveId, startAddress, numRegisters);
                for (int j = 0; j < numRegisters; j++)
                {
                    systemLog.ReadEndTime = DateTime.Now;
                    systemLog.ReadAddress = Convert.ToString(Convert.ToInt32(StartAddress) + j);
                    systemLog.ReadType = (int)PLCReadType.COIL;
                    systemLog.ReadValue = Convert.ToString(holdingRegister[j]);
                }
                break;
        }
        systemLogArray[i] = systemLog;
        port.Close();
        port.Dispose();
    }

1 个答案:

答案 0 :(得分:0)

汉斯帕斯特指出了一个非常关键的问题。你应该考虑这个。

您的问题听起来像是时间问题。似乎您的最后一个实例没有被处理,并且该端口尚未被释放以便再次使用。

我建议在循环之前打开端口。每秒钟完成所有必要的阅读,并在完成后再次关闭。 请删除使用块。港口不需要喂养,也不会在一分钟内摆脱60次,从而为您带来性能优势。

如果你看一下这段代码:

using (SerialPort port = new SerialPort(serialPortName))
    {
        if (port.IsOpen)
        {
            port.Close();
            port.Dispose();
        }

如果您创建新的SerialPort,则默认关闭。 If子句变得过时,而不是使用using块,而try/catch更合适。

这一行:代码末尾的port.Dispose();也是多余的(或者它使得使用块变得多余),因为using块将在最后完成此操作。