реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> пишу под винду обращение к FTDI, непонятно, почему не считываются данные, устройство видится нормально, а массив данных =0 ???
Метценгерштейн
сообщение May 4 2010, 11:58
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



вот код.

Код
// Tst_FTDI.cpp : Defines the entry point for the console application.
//



#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include "ftd2xx.h"
#include <stdint.h> //uint32_t
#include <iostream> // консольный ввод/вывод
using namespace std;




LONG lComPortNumber;
DWORD numDevs;

FT_HANDLE ftHandle; // handle of an open device
FT_STATUS ftStatus;
DWORD EventDWord;
DWORD RxBytes;
DWORD TxBytes;
DWORD BytesReceived;
char RxBuffer[256];
char data;




static char buf[50];
//memset(buf,0,50);


LONG COMPORT;

char COMx[5];
int n;
int dn;

DCB dcb;
HANDLE hCommPort;
BOOL fSuccess;    

//char *message;

int GetFromDevice (void){  //dsc ftdi behavior and read him status

    ftStatus = FT_ListDevices(&numDevs,NULL,FT_LIST_NUMBER_ONLY);
    if (ftStatus != FT_OK) {     // FT_ListDevices not OK, number of devices connected is in numDevs    
        //message = "[ERROR[LISTEN_DEVICE]]";
        return 0;
    }
    // FT_ListDevices OK, number of devices connected is in numDevs
    if (numDevs > 1)
    {
        dn = 1;
    }
    else
    {
        dn = 0;
    }


    // Open the device    
    ftStatus = FT_Open(dn, &ftHandle);

    if(ftStatus != FT_OK)
    {
        //message = "[ERROR[OPEN_DEVICE]]";
        return 0;
    }

    /********************************************************/
    // Configure the UART interface parameters
    /********************************************************/

    ftStatus = FT_GetComPortNumber(ftHandle,&lComPortNumber);
    if (ftStatus != FT_OK) { // COM port assigned with number held in lComPortNumber
        return 0;
    }

    if (lComPortNumber == -1) { // No COM port assigned
        return 0;
    }

    
    /*********************************************************/
    //  FT_SetBaudRate
    /*********************************************************/
    ftStatus = FT_SetBaudRate(ftHandle, 38400); // Set baud rate to 38400
    if (ftStatus != FT_OK) { // FT_SetBaudRate not OK
         return 0;
    }

    FT_Close(ftHandle);
    return 1; // if device is preset and correct
}
//*********************************************************

int read_ft (void) {//in case of preset device
    //read device

    FT_GetStatus(ftHandle,&RxBytes,&TxBytes,&EventDWord); //data will be in a massive RxBuffer

    if (RxBytes > 0) {
        ftStatus = FT_Read(ftHandle,RxBuffer,RxBytes,&BytesReceived);

        if (ftStatus == FT_OK) { // if FT_Read OK
            return 1;
        }

        else {
            //message = "[ERROR[data has been resived, but ftStatus != FT_OK]]";
            return 0; // FT_Read Failed
        }
    }

    //message = "[ERROR[try to rread device is doesn't success]]";

    FT_Close(ftHandle); //close device
    return 0;
}






int _tmain(int argc, _TCHAR* argv[]) {
    for (;;) {

        if ( !GetFromDevice () ) { //in case of none preset device
            cout << "error" <<endl;    
            //system("pause");
        }

        else {                        //in case of preset device
            if (read_ft()) {
                data =*RxBuffer; //get char data from RxBuffer[0]

                cout << data <<endl;    
                //system("pause");
            }
        }



    }//for
    return 0;
}


Все проходит нормально, но массив RxBuffer пустой.
Почему?
я использую 2-й виртуальный ком- порт в устройстве- на него данные шлю.

Кто подскажет в чем дело? Вроде как все по даташиту сделано.

Сообщение отредактировал rezident - May 4 2010, 14:19
Причина редактирования: Оформление цитаты исходника.
Go to the top of the page
 
+Quote Post
V_G
сообщение May 4 2010, 12:25
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



А вы просто с компортом до того работали?
Весь мой софт для компортов работает и с ft232 без проблем и без всяких допфайлов типа "ftd2xx.h". Ну, дрова виртуального порта только поставил в систему, понятно...
Работаю в MS Visual Studio, C++

Сообщение отредактировал V_G - May 4 2010, 12:26
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение May 4 2010, 12:27
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



да, я в Гипер Териманале открываю ком порт 4 и на него мои данные приходят нормально. скорость 38400 выставляю там.
т.е. девайс опознается как СОМ3, СОМ4, мне нужен СОМ4

пишу под MS Visual Studio, C++
Go to the top of the page
 
+Quote Post
V_G
сообщение May 4 2010, 13:29
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Пардон, неверно сформулировал вопрос: вы раньше писали софт для компорта? Откуда эти префиксы FT_ у функций, от FTDI?
Я просто предпочитаю родные виндовые функции работы с компортом, без всяких верхних надстроечных библиотек. И работаю со своим комовским софтом, в основе своей написанном лет 10 назад, если не больше

Сообщение отредактировал V_G - May 4 2010, 13:29
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение May 4 2010, 13:32
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



есть даташита от FTDI. там есть работа с этой микросхемой и как писать под винду обращение к ком портам- не родные виндовские, а свои- от FTDI
нет, я первый раз пишу под СОМ порт что- то.
Если не сложно, дайте проект, плз, где наглядно показано, как стандартными виндовскими ф-ми работать с СОМ портом.
Go to the top of the page
 
+Quote Post
V_G
сообщение May 5 2010, 01:18
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Наглядно - это с комментариями. У меня такого нет.
Принцип таков
1. Открывается поток (CreateThread) для функции приема данных, т.к. она должна работать асинхронно, в параметрах дается указатель на функцию фоновой работы с COM-портом

В функции фоновой работы с COM-портом:
2. Открывается нужный порт (CreateFile)
3. Считывается блок управления девайсом (DCB) GetCommState(hCom, &dcb)
4. Наcтраиваем параметры dcb (скорость, четность ипр.) и заливаем их обратно SetCommState(hCom, &dcb)
5. Устанавливаем маску комовских событий, например SetCommMask(hCom, EV_RXCHAR|EV_TXEMPTY|EV_BREAK)
6.Создаем event object для работы с функцией WaitCommEvent:
o.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL );
7. В бесконечном цикле, пока не закроется порт (проверяем флаг какой-нить) вызываем WaitCommEvent
8. При возникновении события EV_RXCHAR вызываем ClearCommError( hCom, &dwErrorFlags, &ComStat ),
9. По ComStat.cbInQue определяем число байт во входном буфере и считываем соотв. число байт ReadFile,
буфер нужно скопировать себе и переслать указатель в основной поток с помощью PostMessage.

Вне функции фоновой работы с COM-портом используем WriteFile для отпавки данных в порт

А еще лучше читать мануалы
Go to the top of the page
 
+Quote Post
SysRq
сообщение May 5 2010, 05:24
Сообщение #7


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Цитата(Метценгерштейн @ May 4 2010, 15:58) *
Почему?
Дык, зачем FT_Close() делаете сразу? Открыли, почитали, закрыли. Должно работать.
Go to the top of the page
 
+Quote Post
V_G
сообщение May 5 2010, 06:53
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Да нет, там вроде закрывается только при ошибках. Хотя по шагам пройтись не мешает, мало ли...

А, увидел, закрывает после установки скорости, зря!

Сообщение отредактировал V_G - May 5 2010, 06:57
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение May 5 2010, 08:49
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



Запустил, действительно, с FT_Close() запутался.
Спасибо всем )))
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 16:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.01433 секунд с 7
ELECTRONIX ©2004-2016