2017-05-31 118 views
1

我需要一些幫助。我正在用C++/CX編寫一個Win 10應用程序。我正在使用兩個USB到RS485設備,它們都具有相同的VID號碼。在過去的日子裏,我可以編寫一些軟件,並使用良好的舊COMx連接到端口等。多個USB到RS485 FTDI設備ID

我現在正在關注這裏的示例Serial Sample,它使用收集設備信息的方法,以便查找連接的設備時,我在可用設備列表中看到以下內容。

\?\ FTDIBUS#VID_0403 + PID_6001

兩個設備具有相同的VID和PID。這導致我有線連接到正確的USB設備的問題。我認爲我的應用正試圖同時連接兩臺設備?有沒有人對我如何解決這個問題有任何想法?

void MainPage::Get_Serial_Devices() { 

cancellationTokenSource_Port1 = new Concurrency::cancellation_token_source(); 
cancellationTokenSource_Port2 = new Concurrency::cancellation_token_source(); 

// THIS USES ASYNCRONOUS OPERATION. GET A LIST OF SERIAL DEVICES AND POPULATE THE COMBO BOX 
Concurrency::create_task(ListAvailablePortsAsync()).then([this](DeviceInformationCollection^ serialDeviceCollectioin) 
{ 

    // serialDeviceCollection CONTAINS ALL SERIAL DEVICES FOUND, COPY INTO _deviceCollection 
    DeviceInformationCollection^ _deviceCollection = serialDeviceCollectioin; 

    // CLEAR EXISTING DEVICES FOR OUR OBJECT COLLECTION 
    _availableDevices->Clear(); 

    // FOR EVERY DEVICE IN _deviceCollection 
    for (auto &&device : _deviceCollection) { 

     if (device->Name->Equals("USB-RS485 Cable")) { 

      // CREATE A NEW DEVICE TYPE AND APPEND TO OUR OBJECT COLLECTION 
      _availableDevices->Append(ref new Device(device->Id, device)); 

      Total_Ports++; 

      this->DeviceLists->Items->Append(device->Id); 


     } 

    } 

}); 





void MainPage::ConnectButton_Click(Object^ sender, RoutedEventArgs^ e) { 



if (Port1_Connected == false) { 

    // CAST INDEX TO CORRELATING Device IN _availableDevices 
    Device^ selectedDevice = static_cast<Device^>(_availableDevices->GetAt(Port_1_ID)); 



    // GET THE DEVICE INFO 
    DeviceInformation^ entry = selectedDevice->DeviceInfo; 



    Concurrency::create_task(ConnectToSerialDeviceAsync_Port1(entry, cancellationTokenSource_Port1->get_token())).then([this]() { 

     Get_Echo(); 
     Waiting_For_Ack = true; 


    }); 

} 


Concurrency::task<void> MainPage::ConnectToSerialDeviceAsync_Port1(DeviceInformation^ device, Concurrency::cancellation_token cancellationToken) { 


// CREATE A LINKED TOKEN WHICH IS CANCELLED WHEN THE PROVIDED TOKEN IS CANCELLED 
auto childTokenSource = Concurrency::cancellation_token_source::create_linked_source(cancellationToken); 

// GET THE TOKEN 
auto childToken = childTokenSource.get_token(); 


    // CONNECT TO ARDUINO TASK 
    return Concurrency::create_task(SerialDevice::FromIdAsync(device->Id), childToken).then([this](SerialDevice^ serial_device) { 

     try { 



      _serialPort_Port1 = serial_device; 

      TimeSpan _timeOut; _timeOut.Duration = 10; 

      // CONFIGURE SERIAL PORT SETTINGS 

      _serialPort_Port1->WriteTimeout = _timeOut; 
      _serialPort_Port1->ReadTimeout = _timeOut; 

      _serialPort_Port1->BaudRate = 57600; 

      _serialPort_Port1->Parity = Windows::Devices::SerialCommunication::SerialParity::None; 
      _serialPort_Port1->StopBits = Windows::Devices::SerialCommunication::SerialStopBitCount::One; 
      _serialPort_Port1->DataBits = 8; 
      _serialPort_Port1->Handshake = Windows::Devices::SerialCommunication::SerialHandshake::None; 



      // CREATE OUR DATA READER OBJECT 
      _dataReaderObject_Port1 = ref new DataReader(_serialPort_Port1->InputStream); 
      _dataReaderObject_Port1->InputStreamOptions = InputStreamOptions::None; 


      // CREATE OUR DATA WRITE OBJECT 
      _dataWriterObject_Port1 = ref new DataWriter(_serialPort_Port1->OutputStream); 


      this->ConnectButton->IsEnabled = false; 
      this->DisconnectButton->IsEnabled = true; 


      // KICK OF THE SERIAL PORT LISTENING PROCESS 
      Listen_Port1(); 



     } 

     catch (Platform::Exception^ ex) { 

      this->Error_Window->Text = (ex->Message); 

      CloseDevice(PORT_1); 
     } 

    }); 

回答

0

FT_PROG是用於與FTDI裝置一起使用的免費EEPROM編程工具。它用於修改存儲FTDI設備描述符的EEPROM內容以定製設計。

完整的FT_PROG用戶指南可以下載here