2013-11-04 66 views
1

我試圖與一個連接到EasySync USB2-H-5004-M USB到RS485轉換器的usb設備通信,波特率爲3750000,但是在OSX上。如何在OSX上使用FTDI D2XX庫?

我已經有一些C++代碼在Windows上工作,並設法讓它在OSX上編譯(使用D2XX dylib而不是dll),但是我有一個通信問題,我不確定在哪裏開始以及如何解決這個問題。

我使用了openFrameworks/C++,並列出設備的方法是這樣的:

int FTDI::enumerateDevices(){ 
    DWORD numDevs; 
    FT_STATUS ftStatus = FT_CreateDeviceInfoList(&numDevs); 
    numPortsFound = 0; 

    if (ftStatus == FT_OK) { 
     ofLog(OF_LOG_NOTICE, "Number of FTDI devices is %d",numDevs); 
     devicesList = (FT_DEVICE_LIST_INFO_NODE*)malloc(sizeof(FT_DEVICE_LIST_INFO_NODE)*numDevs); 
     ftStatus = FT_GetDeviceInfoList(devicesList, &numDevs); 
     if (ftStatus == FT_OK) { 
      printf("\n"); 
      for (int i = 0; i < numDevs; i++) { 
       ofLog(OF_LOG_VERBOSE, "Dev %d:",i); 
       ofLog(OF_LOG_VERBOSE, " Flags=0x%x",devicesList[i].Flags); 
       ofLog(OF_LOG_VERBOSE, " Type=0x%x",devicesList[i].Type); 
       ofLog(OF_LOG_VERBOSE, " ID=0x%x",devicesList[i].ID); 
       ofLog(OF_LOG_VERBOSE, " LocId=0x%x",devicesList[i].LocId); 
       ofLog(OF_LOG_VERBOSE, " SerialNumber=%s",devicesList[i].SerialNumber); 
       ofLog(OF_LOG_VERBOSE, " Description=%s",devicesList[i].Description); 
       ofLog(OF_LOG_VERBOSE, " ftHandle=0x%x\n",devicesList[i].ftHandle); 
      } 
      numPortsFound = numDevs; 
     } else { 
      ofLog(OF_LOG_ERROR, "FTD2XX::FT_GetDeviceInfoList() failed"); 
     } 
    } else { 
     ofLog(OF_LOG_ERROR, "FTD2XX::FT_CreateDeviceInfoList() failed"); 
    } 

    return numPortsFound; 

} 

的問題是在OSX我得到這樣的輸出:

[notice ] Number of FTDI devices is 4 

[verbose] Dev 0: 
[verbose] Flags=0x1 
[verbose] Type=0x3 
[verbose] ID=0x0 
[verbose] LocId=0x0 
[verbose] SerialNumber= 
[verbose] Description= 
[verbose] ftHandle=0x0 

[verbose] Dev 1: 
[verbose] Flags=0x1 
[verbose] Type=0x3 
[verbose] ID=0x0 
[verbose] LocId=0x0 
[verbose] SerialNumber= 
[verbose] Description= 
[verbose] ftHandle=0x0 

[verbose] Dev 2: 
[verbose] Flags=0x1 
[verbose] Type=0x3 
[verbose] ID=0x0 
[verbose] LocId=0x0 
[verbose] SerialNumber= 
[verbose] Description= 
[verbose] ftHandle=0x0 

[verbose] Dev 3: 
[verbose] Flags=0x1 
[verbose] Type=0x3 
[verbose] ID=0x0 
[verbose] LocId=0x0 
[verbose] SerialNumber= 
[verbose] Description= 
[verbose] ftHandle=0x0 

[ error ] failed to register FTDI device with serial FTWVZVEBA in internal register 
[ error ] error opening port with serial: FTWVZVEBA 

不看對。例如在Windows上,在端口A /通道1 /設備索引0我看到這一點:

[verbose] Dev 0: 
[verbose] Flags=0x2 
[verbose] Type=0x7 
[verbose] ID=0x4036011 
[verbose] LocId=0x02111 
[verbose] SerialNumber=FTWVZVEBA 
[verbose] Description=USB2-H-5004-M A 
[verbose] ftHandle=0x0 

有/ dev中的東西快速瀏覽一下看行:

ls /dev/tty.* 
/dev/tty.Bluetooth-Incoming-Port /dev/tty.usbserial-FTWVZVEBB 
/dev/tty.Bluetooth-Modem  /dev/tty.usbserial-FTWVZVEBC 
/dev/tty.usbmodemfa131   /dev/tty.usbserial-FTWVZVEBD 

,並通過系統信息,我得到:

USB2-H-5004-M: 

    Product ID: 0x6011 
    Vendor ID: 0x0403 (Future Technology Devices International Limited) 
    Version: 8.00 
    Serial Number: FTWVZVEB 
    Speed: Up to 480 Mb/sec 
    Manufacturer: FTDI 
    Location ID: 0xfd120000/4 
    Current Available (mA): 500 
    Current Required (mA): 200 

我已經安裝了驅動程序D2XX的FTDI OSX Installation Guide(PDF鏈接)上的說明,但我不知道我缺少/做錯了什麼。

如何正確地與使用FTDI D2XX庫的設備進行通信?

+0

不確定FTDI庫。你可以做一些微不足道的事情,比如使用cu(1)打開端口併發送/接收數據? – janm

+0

你能給我介紹一下嗎?這是我在使用cu時的第一個鏡頭:'cu -l /dev/tty.usbserial-FTWVZVEBA --baud 3750000 cu:鎖定時創建(/ var/spool/uucp/TMP0000000cee在/ Users/weblab作爲uid 501):Permission被拒絕 cu:/dev/tty.usbserial-FTWVZVEBA:使用中的線路# –

+1

首先,使用「sudo」。像'sudo cu -l/dev/whatever ...'。您需要輸入密碼。這裏的權限問題可能只是uucp鎖定而不是端口本身;你可以通過執行'ls -l/dev/tty.usbserial-whatever'來檢查端口權限。 – janm

回答

8

爲了充實我的意見,因爲它似乎已經回答了這裏的核心問題:Mac OS 10.9(Mavericks)現在帶有一個內核擴展,其行爲與FTDI的VCP驅動程序一樣。它爲它檢測到的FTDI USB到串口設備創建一個虛擬通信端口,並且意味着如果您之前需要它,您不再需要安裝VCP驅動程序。

這有一個不幸的副作用,雖然,在那it breaks any application using FTDI's D2XX library。這表現爲D2XX功能連接到FTDI設備失敗,即使他們可以看到它。作爲解決方法,您可以手動卸載kext:

sudo kextunload -b com.apple.driver.AppleUSBFTDI 

但它會在下次啓動時重新加載自身。

作爲一個長期的解決辦法,我一直有,如果這個驅動被加載(通過嘗試通過D2XX功能連接,如果他們無法看到),並使用更傳統的open()我的應用程序檢測等要求作爲後備連接到串行端口。

雖然,我不確定他們使用的VCP風格kext是否可以在波特率方面儘可能地提高靈活性。

+0

謝謝你張貼答案。因爲我需要使用非標準波特率(3750000),所以在我的設置中,我先禁用AppleUSBFTDI kext後選擇使用D2XX驅動程序。該命令可以保存爲啓動bash腳本,或者作爲系統調用從應用程序卸載/加載,以便對可能依賴於VCP版本的其他應用程序更加敏感 –

相關問題