2010-12-06 6 views
4

を拒否された私はModbusプロトコルを使用していくつかのレジスタを読み取るためにCOMポートを使用しようとしています、私はModbusスレーブデバイスをreboteまでこんにちは、すべてが正常に動作し、その後、私は、COMが拒否されたエラーを持って、私は何ができるかをされたかrebotコンピュータまたは 'usb to com converter'でプラグアウトして戻ってください。このデバイスはCOMポートで正しく処理されないようです。あなたはFTDIのUSB /シリアルアダプタを使用している場合COMポートが

using (port = new SerialPort(comPort)) 
{ 
    ushort[] registers = null; 
    try 
    { 
     port.BaudRate = boudRate; 
     port.DataBits = 8; 
     port.Parity = Parity.None; 
     port.StopBits = StopBits.One; 
     port.Open(); 

     // modbus reading registers 

     port.Close(); 
     return registers; 
    } 
    catch (Exception e) 
    { 
     Logs.AddToLog(e.Message); 
     return registers; 
    } 
} 
+2

どのようなエラーが表示されますか? – KevinDTimm

+0

それはpreetyうまく動作しますが、私は私のModbusスレーブをrebot、再度読み込むしようとしたとき、私は、このCOMポートは、あなたはそれが 'using'声明に包まれてい – kosnkov

+0

を拒否されたため、ポートが閉じられなければならないことを例外を持っています.IsOpenをチェックして確かめたいかもしれません:http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.isopen.aspx – SwDevMan81

答えて

3

、あなたは、マネージラッパー(FTDI Managed Driver Wrapper)から直接、状態を取得し、接続状態に基づいて、シリアルポートを再初期化することができます。

は、FTDIのデバイスとの実務経験の私の欠如を許し、これはあなたのR-232アダプタをリセットする必要があります任意のアクティブな接続を閉じます私の理解device.CyclePort()では

FTD2XX_NET.FTDI device = new FTD2XX_NET.FTDI(); 
string port; 
device.GetCOMPort(out port); 

if (!string.IsNullOrEmpty(port) && (port.Equals(target)) && device.IsOpen) 
{ 
    device.CyclePort(); 
    device.ResetDevice(); 
    device.ResetPort(); 
} 

、(FT_CLOSEを呼び出す)USBデバイスをアンマウントし、 USBバスからデバイスを再エンコーディングします。これは、アダプターを物理的に取り外して再挿入した場合とまったく同じです。

また、FTDIのデバイスライブラリのためのPerlのラッパーのマニュアルに従って:他のバスのコントロールと同様に

、5-8秒の 待機期間はどのAPI CyclePort後にあり が完全に安定するまで、GetSerialByIndex() などの デバイスに直接接続する必要があるという呼び出しは、FT_INVALID_HANDLE で失敗します。 アプリケーションは、戻り 状態の変化を検出するために、 ため、この待機期間、またはセットアップポーリング ループを考慮する必要があります。

+0

ok、私のケースではこれらのdllを使用してこのエラーを防ぐにはどうすればいいですか? – kosnkov

+0

これでも、トンヘルプ:FTDI myFtdiDevice =新しいFTDI(); myFtdiDevice.CyclePort(); myFtdiDevice.ResetDevice(); myFtdiDevice.ResetPort(); myFtdiDevice.RestartInTask(); myFtdiDevice.Rescan(); myFtdiDevice.Close (); – kosnkov

+0

nooo、firsターゲットは何ですか? 2回目、ifIsOpenが開かれていない前に何度もチェックしましたが、オープンしようとすると拒否された例外が発生しましたので、この場合 'if' statetmantを実行してもポートを開くことはできませんが、コンバーター、プラグインして戻って、それは動作します。 – kosnkov

3

FTDIデバイスが物理的に接続を解除しない限り、FTDIデバイスが通信できない状態に似た経験がありました。グレッグの答えは、私が回避策を考え出すのを助けました。 FTDIのマネージラッパーに

Gregの参照は非常に有用だったが、それは実際にFTDIデバイスを参照するために、もう少しコードがかかるため、彼が提供スニペットはかなりありません。彼の考えを出発点として、私はFTDIのいくつかのサンプルコードを適用し、この関数を書いた。私のFTDIデバイスを物理的な介入なしに元の状態に戻すことができました。

/// <summary> 
/// Attempts to reset an attached FTDI device and returns true if successful. Note that a 
/// 5-8 second delay is recommended after the reset. 
/// </summary> 
/// <returns></returns> 
private bool ResetFTDI() { 
    UInt32 ftdiDeviceCount = 0; 
    FTD2XX_NET.FTDI.FT_STATUS ftStatus = FTD2XX_NET.FTDI.FT_STATUS.FT_OK; 

    // Create new instance of the FTDI device class 
    FTD2XX_NET.FTDI myFtdiDevice = new FTD2XX_NET.FTDI(); 
    // Determine the number of FTDI devices connected to the machine 
    ftStatus = myFtdiDevice.GetNumberOfDevices(ref ftdiDeviceCount); 
    // Check status 
    if (ftStatus != FTD2XX_NET.FTDI.FT_STATUS.FT_OK) { 
    Log.WriteLog("Failed to get number of FTDI devices [" + ftStatus.ToString() + "]"); 
    return false; 
    } 
    // If no devices available, return 
    if (ftdiDeviceCount == 0) { 
    Log.WriteLog("Failed to find any FTDI devices [" + ftStatus.ToString() + "]"); 
    return false; 
    } 
    // Allocate storage for device info list 
    FTD2XX_NET.FTDI.FT_DEVICE_INFO_NODE[] ftdiDeviceList = new FTD2XX_NET.FTDI.FT_DEVICE_INFO_NODE[ftdiDeviceCount]; 
    // Populate our device list 
    ftStatus = myFtdiDevice.GetDeviceList(ftdiDeviceList); 
    if (ftStatus != FTD2XX_NET.FTDI.FT_STATUS.FT_OK) { 
    Log.WriteLog("Failed enumerate FTDI devices [" + ftStatus.ToString() + "]"); 
    return false; 
    } 
    // Open first device in our list by serial number 
    ftStatus = myFtdiDevice.OpenBySerialNumber(ftdiDeviceList[0].SerialNumber); 
    if (ftStatus != FTD2XX_NET.FTDI.FT_STATUS.FT_OK) { 
    Log.WriteLog("Failed to open device [" + ftStatus.ToString() + "]"); 
    return false; 
    } 
    // Finally, reset the port 
    myFtdiDevice.CyclePort(); 
    return true; 
} 

上記のLogオブジェクトはプロジェクトの内部にありますので、どのようなものでも置き換えてください。

いくつかのさらなる研究もthis questionを上げ。答えでは、Zach Sawは.NET SerialPort通信で発見した問題を参照しています。私は彼の解決策を試してみるつもりです。もし私が上記のことがバンダイのものであると考えるので、それが問題を完全に解決するならば、私はここに投稿します。

関連する問題