Несколько идентификаторов устройств с USB на RS485 FTDI

Мне нужна помощь. Я программирую приложение Win 10 на C++/CX. Я использую два устройства USB-RS485, оба из которых имеют одинаковый номер VID. В былые времена я мог написать немного программного обеспечения и подключаться к портам, используя старый добрый COMx и т. Д.

Сейчас я следую приведенному здесь примеру 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);
        }

    });

1 ответ

FT_PROG - бесплатная утилита программирования EEPROM для использования с устройствами FTDI. Он используется для изменения содержимого EEPROM, в котором хранятся дескрипторы устройства FTDI, для настройки дизайна.

Полное руководство пользователя FT_PROG можно скачать здесь.

Другие вопросы по тегам