2016-04-19 13 views
0

私はFTDI RS232からUSB 5Vプログラマブルケーブルを使用してUSB経由でRS232入力を読み取ろうとしています。 FTD2XX_NETライブラリの使用。 10秒ごとにテレグラムを送信するスマートメーターに接続します。FTDI TTL-232RをUSBに読み込む

すべて正常に動作しているようです。私は、ボーレート、データビット、ストップビットなどを設定することができますが、データを読み込むと停止します。以下のコードスニペットは単純にデータなしで渡します。私はエレクトロニクスで経験していないので、私の快適ゾーンからちょっと外れています。

私の質問。

  • フロー制御がデバイスの場合の読み取り機能にどのように影響しますか?
  • デバイスの場合、numBytesAvailableは読み取り機能にどのように影響しますか?
  • デバイスの場合、numBytesReadが読み取り機能にどのように影響しますか?

上記のプロパティの変数の設定は私には不明です。私はどれくらいのデータを受け取るのか分かりません。どんな助けも高く評価されます。

ケーブルのデータシートはこちらをご覧ください: http://www.ftdichip.com/Support/Documents/DataSheets/Cables/DS_TTL-232R_CABLES.pdf

スマートメーターデータシートはこちらをご覧ください: http://files.domoticaforum.eu/uploads/Smartmetering/DSMR%20v4.0%20final%20P1.pdf

enter code here 

namespace P1_reader 
{ 
class Program 
{ 

    static void Main(string[] args) 
    { 
     if (args.Count() > 0) 
     { 
      ExecuteOption(args[0]); 
     } 
     else 
     { 
      string option; 
      do 
      { 
       var menu = new StringBuilder(); 
       menu.AppendLine("(1) ListenForData"); 
       menu.AppendLine("(x) Exit"); 

       System.Console.WriteLine(menu); 
       option = System.Console.ReadKey().KeyChar.ToString();      
       System.Console.WriteLine(); 
       ExecuteOption(option); 
       System.Console.WriteLine(); 
      } while (option.ToLower() != "x"); 
     } 
    } 

    private static void ExecuteOption(string option) 
    { 
     switch (option.ToLower()) 
     { 
      case "1": 
       ListenForData(); 
       break; 
      case "x": 
       break; 
      default: 
       System.Console.WriteLine("That's not an option!"); 
       break; 
     } 
    } 

    private static void ListenForData() 
    { 
     try 
     { 
      UInt32 ftdiDeviceCount = 0; 
      FTDI.FT_STATUS ftStatus = FTDI.FT_STATUS.FT_OK; 

      FTDI myFtdiDevice = new FTDI(); 

      ftStatus = myFtdiDevice.GetNumberOfDevices(ref ftdiDeviceCount); 

      if (ftStatus == FTDI.FT_STATUS.FT_OK) 
      { 
       Console.WriteLine("Number of FTDI devices: " + ftdiDeviceCount.ToString()); 
       Console.WriteLine(""); 
      } 
      else 
      { 
       Console.WriteLine("Failed to get number of devices (error " + ftStatus.ToString() + ")"); 
       Console.ReadKey(); 
       return; 
      } 

      if (ftdiDeviceCount == 0) 
      { 
       Console.WriteLine("Failed to get number of devices (error " + ftStatus.ToString() + ")"); 
       Console.ReadKey(); 
       return; 
      } 

      FTDI.FT_DEVICE_INFO_NODE[] ftdiDeviceList = new FTDI.FT_DEVICE_INFO_NODE[ftdiDeviceCount]; 

      ftStatus = myFtdiDevice.GetDeviceList(ftdiDeviceList); 

      if (ftStatus == FTDI.FT_STATUS.FT_OK) 
      { 
       for (UInt32 i = 0; i < ftdiDeviceCount; i++) 
       { 
        Console.WriteLine("Device Index: " + i.ToString()); 
        Console.WriteLine("Flags: " + String.Format("{0:x}", ftdiDeviceList[i].Flags)); 
        Console.WriteLine("Type: " + ftdiDeviceList[i].Type.ToString()); 
        Console.WriteLine("ID: " + String.Format("{0:x}", ftdiDeviceList[i].ID)); 
        Console.WriteLine("Location ID: " + String.Format("{0:x}", ftdiDeviceList[i].LocId)); 
        Console.WriteLine("Serial Number: " + ftdiDeviceList[i].SerialNumber.ToString()); 
        Console.WriteLine("Description: " + ftdiDeviceList[i].Description.ToString()); 
        Console.WriteLine(""); 
       } 
      } 

      ftStatus = myFtdiDevice.OpenBySerialNumber(ftdiDeviceList[0].SerialNumber); 
      if (ftStatus != FTDI.FT_STATUS.FT_OK) 
      { 
       Console.WriteLine("Failed to open device (error " + ftStatus.ToString() + ")"); 
       Console.ReadKey(); 
       return; 
      } 

      ftStatus = myFtdiDevice.SetBaudRate(115200); 
      if (ftStatus != FTDI.FT_STATUS.FT_OK) 
      { 
       Console.WriteLine("Failed to set Baud rate (error " + ftStatus.ToString() + ")"); 
       Console.ReadKey(); 
       return; 
      } 

      ftStatus = myFtdiDevice.SetDataCharacteristics(FTDI.FT_DATA_BITS.FT_BITS_8, FTDI.FT_STOP_BITS.FT_STOP_BITS_1, FTDI.FT_PARITY.FT_PARITY_NONE); 

      if (ftStatus != FTDI.FT_STATUS.FT_OK) 
      { 
       Console.WriteLine("Failed to set data characteristics (error " + ftStatus.ToString() + ")"); 
       Console.ReadKey(); 
       return; 
      } 

      ftStatus = myFtdiDevice.SetFlowControl(FTDI.FT_FLOW_CONTROL.FT_FLOW_RTS_CTS, 0x11, 0x13); 
      if (ftStatus != FTDI.FT_STATUS.FT_OK) 
      { 
       Console.WriteLine("Failed to set flow control (error " + ftStatus.ToString() + ")"); 
       Console.ReadKey(); 
       return; 
      } 

      // Set read timeout to 12 seconds, write timeout to infinite 
      ftStatus = myFtdiDevice.SetTimeouts(12000, 0); 
      if (ftStatus != FTDI.FT_STATUS.FT_OK) 
      { 
       Console.WriteLine("Failed to set timeouts (error " + ftStatus.ToString() + ")"); 
       Console.ReadKey(); 
       return; 
      } 

      UInt32 numBytesAvailable = 0; 

      ftStatus = myFtdiDevice.GetRxBytesAvailable(ref numBytesAvailable); 
      if (ftStatus != FTDI.FT_STATUS.FT_OK) 
      { 
       Console.WriteLine("Failed to get number of bytes available to read (error " + ftStatus.ToString() + ")"); 
       Console.ReadKey(); 
       return; 
      } 
      Thread.Sleep(10); 

      string readData = ""; 
      UInt32 numBytesRead = 0; 
      byte[] dataBuffer = new byte[1024]; 

      ftStatus = myFtdiDevice.Read(out readData, numBytesAvailable, ref numBytesRead); 
      while (readData == "") 
      { 
       ftStatus = myFtdiDevice.Read(out readData, numBytesAvailable, ref numBytesRead); 
      } 

      if (ftStatus != FTDI.FT_STATUS.FT_OK) 
      { 
       Console.WriteLine("Failed to read data (error " + ftStatus.ToString() + ")"); 
       Console.ReadKey(); 
       return; 
      } 
      Console.WriteLine(readData); 

      ftStatus = myFtdiDevice.Close(); 

      Console.WriteLine("Press any key to continue."); 
      Console.ReadKey(); 
      return; 
     } 
     catch 
     { 
      Console.WriteLine("Something realy bad happened.."); 
     } 
    } 

} 
} 

答えて

0

FTDIドライバが内部バッファを持っており、自動的にコピーすべてのデータは、このにRXデータラインから読み取りますバッファ。 GetRxBytesAvailable()を呼び出すと、内部バッファ内のデータ量、すなわちチップがどれだけのデータを読み取ったかを知ることができます。

Read()への呼び出しがブロックされています。要求したバイト数が返されるまで待機します。正しく覚えていれば、APIを使用して読み取りタイムアウトを設定できます。

whileループ内でGetRxBytesAvailable()コールを使用したいとします。

UInt32 numBytesAvailable = 0; 

while (true) 
{ 
    ftStatus = myFtdiDevice.GetRxBytesAvailable(ref numBytesAvailable); 
    if (ftStatus != FTDI.FT_STATUS.FT_OK) 
    { 
     Console.WriteLine("Failed to get number of bytes available to read (error " + ftStatus.ToString() + ")"); 
     Console.ReadKey(); 
     break; 
    } 

    string readData = ""; 
    UInt32 numBytesRead = 0; 
    byte[] dataBuffer = new byte[1024];  

    // TODO: check so you don't over your buffer. 
    ftStatus = myFtdiDevice.Read(out readData, numBytesAvailable, ref numBytesRead); 

    ProcessData(readData); 

    Thread.Sleep(10000); // Sleep 10 seconds. 
} 
関連する問題