2017-05-31 3 views
1

J'ai besoin d'aide. Je programme une application Win 10 en C++/CX. J'utilise deux périphériques USB vers RS485, les deux ayant le même numéro VID. Dans les temps anciens, je pourrais écrire un logiciel de bits et se connecter aux ports en utilisant le bon vieux COMx etc.USB Multiple RS485 FTDI Device ID

Je suit l'exemple ici Serial Sample qui utilise l'approche de collecte les informations de l'appareil si lors de la recherche pour les appareils connectés, ce Je vois dans la liste des appareils disponibles est la suivante.

\? \ FTDIBUS # VID_0403 + PID_6001

Les deux appareils ont le même VID et PID. Cela conduit au problème de me connecter par câble au périphérique USB correct. Je pense que mon application essaie de se connecter aux deux appareils en même temps? Est-ce que quelqu'un a des idées sur la façon dont je peux résoudre cet accroc?

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); 
     } 

    }); 

Répondre

0

FT_PROG est un utilitaire de programmation EEPROM libre pour une utilisation avec des dispositifs FTDI. Il est utilisé pour modifier le contenu EEPROM qui stocke les descripteurs de périphérique FTDI pour personnaliser les conceptions.

Le Guide de l'utilisateur complet FT_PROG peut être téléchargé here.