2016-04-14 28 views
2

Bir makine için bazı kodlar yazıyordum. RS485 ile konuşmalı ve bunun için normal seri haberleşmeyi kullanmalıyım. Bu ağda olduğu gibi.Acces com port c reddedildi #

Ancak donanım başarısız olduğu için, test rutinleri oluşturmak zorundayım. Bu yüzden, mevcut derlemeleri yeniden algılayan bir rutin yazdım. Bu, 'allComPorts' listesini kendi dize adıyla doldurur ve daha sonra, kullanılabilir dizinin liste dizinine bağlı olarak com bağlantı noktasını seçmek için sayısal bir yukarı çıkarma kullanılır. (evet bu biraz karmaşık geliyor ama diğer nedenlerle seçimler için sayısal bir artış kullanmıştım).

Sorun şu ki, bu işlev yalnızca ilk kez görünüyor. Fonksiyonu tekrar ararsam, dikiş açık olduğu için erişim reddedildi. Çeşitli yerlerde RS485Port.Close() denenmiş, ancak sorun o zaman açık bir jet (bir tavuk yumurtası sorunu) açılmamışsa çöker. Bir konforunu açmak için

Kodum bu görünüyor sevmiyorum bu

private void RS485Activate() 
    { 
      lblNoRS485Communication.Visible = false; 
     if (cmbRS485Port.Value != 0) // if 0 then there are no serial ports 
     { 
      //rs485Port is a global declared as > System.IO.Ports.SerialPort RS485Port; 
      RS485Port = new System.IO.Ports.SerialPort(allComPorts[(int)cmbRS485Port.Value - 1]); 
      if (!RS485Port.IsOpen) 
      { 
       // RS485Port.Close(); 
       // RS485Port = new System.IO.Ports.SerialPort(allComPorts[(int)cmbRS485Port.Value - 1]); 
       RS485Port.BaudRate = 9600; 
       RS485Port.Parity = System.IO.Ports.Parity.None;     
       RS485Port.StopBits = System.IO.Ports.StopBits.One;    
       RS485Port.DataBits = 8;           
       RS485Port.Handshake = System.IO.Ports.Handshake.None;   
       RS485Port.RtsEnable = true; 
       RS485Port.Open(); <== it crashes here with access denied 
      } 
     } 
     else 
     { 
      MessageBox.Show("There is no COM port detected, the program will work but it cannot control any machinery", "WARNING", MessageBoxButtons.OK, MessageBoxIcon.Warning); 
      lblNoRS485Communication.Visible = true; // another warning 
     } 
    } 
+0

portu başka bir işlem tarafından kullanılmaz eğer kontrol ettirin? –

+0

yok edilir iyi, aynı rutin tarafından daha önce açılmış, ancak test için bunu kabul edemiyorum (othre şeyler makineye zarar görmüş olabilir). ve ben gibi test edemediğim için: eğer (RS485Port! = Boş) RS485Port. close(); 'nasıl çözüleceğini merak ediyorum – user3800527

+0

Arama Kapat() bağlantı noktası mevcut değil hemen. DataReceived ve ErrorReceived olayını üreten bir iş parçacığı çıkması gerekiyor. Bunun ne kadar süreceği öngörülemez. Ama kesinlikle istisnadan söyleyebilirsin :) Bir süre uyu ve tekrar dene. Sonsuza kadar denemeyin, çünkü aslında limanı talep eden başka bir süreç olabilir. –

cevap

0

böyle gider, bu yüzden daha iyi bir yol yoktur umarım. Ama etrafında bir çalışma olarak, bir try catch inşaat kullanarak, şimdi ilk başlatılmaya çalışıldı, (henüz başlatılmamışsa, try-catch bir close() hatasıyla karşı korur. Bu geçici çözümü sevmiyorum, çok daha iyi çözümler, ben karşılama. kod öngörmelisiniz ve hatalar dayanmalıdır düşünüyorum (veya .net ile bu gün? ok ki)

  //...     
      try 
      { RS485Port.Close(); } 
      catch 
      { } 
      RS485Port = new System.IO.Ports.SerialPort(allComPorts[(int)cmbRS485Port.Value - 1]); 
      if (!RS485Port.IsOpen) 
      { 
       // RS485Port.Close(); 
       // RS485Port = new System.IO.Ports.SerialPort(allComPorts[(int)cmbRS485Port.Value - 1]); 
       RS485Port.BaudRate = 9600; 
       RS485Port.Parity = System.IO.Ports.Parity.None;   
       RS485Port.StopBits = System.IO.Ports.StopBits.One;  
       RS485Port.DataBits = 8;          
       RS485Port.Handshake = System.IO.Ports.Handshake.None;  
       RS485Port.RtsEnable = true; 
       RS485Port.Open(); 
      }