2013-02-19 61 views
5

Düzenli olarak (genellikle günde bir kez) bir seri bağlantı noktası üzerinden harici bir aygıtla iletişim kurduğum bir .NET 4 Windows hizmetim var. Tüm tüm hizmet harika çalışır, ancak her şimdi ve sonra bir müşteri için, SerialPort.Open() bir çağrı şu istisna atar: istisna dayanarakSerialPort.Open(), IOException'ı atar - İstenen hizmeti tamamlamak için yeterli sistem kaynağı yok

System.IO.IOException: Insufficient system resources exist to complete the requested service. 
at System.IO.Ports.InternalResources.WinIOError(Int32 errorCode, String str) 
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() 

, sunucu kaynakları azalıyor olduğunu düşünürdüm ediyorum ama bu durum böyle görünmüyor. CPU az ya da çok boşta ve bol miktarda bellek ve disk var.

SerialPort.Open()'un diğer IOExceptions'ı atma konusunda birçok söz var ve ben Zach Saw's SerialPortFixer'u uyguladık, ancak farklı bir sorunu giderdiği anlaşılıyor.

Yaptığım şeyin bir örneği (büyük ölçüde basitleştirilmiş). Bu sınıfın birkaç örneği (farklı seri bağlantı noktası adlarını kullanarak) her zaman belleğindedir ve sonra her bir örnek için yaklaşık olarak günde bir kez Run() yöntemi çağrılır.

public class Collector 
{ 
    private SerialPort _port; 
    private string _portName; 

    public void Run() 
    { 
     try 
     { 
      // Run Zach Saw's IOException workaround 
      SerialPortFixer.Execute(_portName); 

      using (_port = new SerialPort(_portName, 9600, Parity.None, 8, StopBits.One)) 
      { 
       _port.DataReceived += PortDataReceived; 
       _port.ErrorReceived += PortErrorReceived; 
       _port.Handshake = Handshake.None; 
       _port.DtrEnable = true; 
       _port.RtsEnable = true; 

       _port.Open(); 
       // Do the stuff 
       _port.Close(); 
      } 
     } 
     catch (Exception e) 
     { 
      // Handle exception 
     } 
    } 

    private void PortDataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 
     // Do other stuff 
    } 

    private void PortErrorReceived(object sender, SerialErrorReceivedEventArgs e) 
    { 
     // Log error 
    } 
} 

Herhangi bir yardım için teşekkür ederiz.

+0

Bu hata, alt ağın bir TCP/IP adresi ekleyin cihaz sürücüsü gelir. Müşteriye şimdi sahip olduğu USB emülatörünü atıp farklı bir üreticiden bir tane daha almasını söyleyin. –

+0

Aslında, bunlardan birini kullanıyorlar (http://www.moxa.com/product/nport_5110.htm) ve bunların en iyisi olması gerekiyor. –

cevap

2

Bu sorunun cevabı, istemci tarafından kullanılan seri bağlantı noktası sunucusunun bir kablosuz bağlantı sürümü (Moxa NPort W2150 Plus) olması ve seri bağlantı noktası sunucusunun kablosuz bağlantı sorunları olduğunda istisnanın ortaya çıkmasıdır.

0

Aynı sorun NPort 5150'de de vardı. Artan Ağ zaman aşımı (NPort Yöneticisi'nde) sorunumu çözdü.

0

Son zamanlarda aynı problemi yaşadım, çözünürlük benim için yanlışlıkla bir DB9 kablosu kullanan bir cihazla düz DB9 kablosu kullanıyordum. Bir kez boş bir modem kablosuna bastığımda, hata ortadan kalktı ve cihaz düzgün bir şekilde çalıştı. Ben Moxa çağrıldığında

, onlar bu soruna yol açabileceği denemek için başka şeyler önerdi:

  • Anti-virus yazılımı
  • Sürücü Yöneticisi Utility kullanmayı deneyin ziyade iletişim engel olan
      (Windows makinelerde) COM portu
  • 0

    bu hatayı vardı ve benim sorunum NPort İdaresi olarak ayarlandı seri portları ancak ağ kartının IP4 Adresini buldum ve programlı olmasıydı kurma NPort Yönetici DHCP. Bunun bir sistem güncellemesi sırasında olduğunu düşünüyorum. bundan

    Kurtarma:

    1. ağ arayüzü
    2. NPort İdaresi seri portları yeniden atama