2016-08-23 96 views
0

這是我的代碼。在這段代碼中,我不時每秒位叫我越來越訪問端口'COM1'被時間控制器拒絕

誤差補償端口訪問被拒絕

我經過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

程序員過於渴望關閉()串口。這與SerialPort類的設計方式不兼容。也不允許另一個程序竊取你的端口並讓你的程序隨機崩潰。 MSDN文檔SerialPort.Close警告這一點,有一個工作線程需要退出之前,端口再次可用,生成事件。究竟需要多長時間是不可預測的。唯一可行的方法是在啓動程序時打開該端口,直到它結束才關閉端口。 –

+0

@HansPassant你應該發佈這個答案我想?這聽起來很好,被upvoted。 –

回答

0

Hans Passant指出了一個非常關鍵的問題。你應該考慮這個。

你的問題聽起來像是一個計時問題。看起來你的最後一個實例沒有被處置,並且該端口已經被釋放,但仍未被再次使用。

我建議在循環之前打開端口。每秒完成所有必要的閱讀,並在完成後再次完成。 請刪除使用塊。港口不需要費用,也不會給你一分鐘60次的性能優勢。

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

如果您創建一個新的SerialPort它是默認關閉:如果你看看這段代碼

。 If-條款變得過時了,而不是使用using塊,try/catch會更合適。

此行:port.Dispose();在代碼的末尾也是多餘的(或使得使用塊多餘),因爲using塊將在最後完成此操作。

+0

我把 使用(SerialPort port = new SerialPort(serialPortName)) if(port.IsOpen) {port.Close(); port.Dispose(); }此塊在for循環之上現在同樣的事情發生在5次呼叫之後,它給了我5次呼叫後拒絕的訪問 –

+0

@PallavJha您能否請您將代碼與循環一起發佈。我認爲這是決定性的瞭解你的問題 –

+0

@PallavJha for循環你在說什麼?這個:for(int j = 0; j

相關問題