2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 проблемы с подключением ft232
Сообщение04.12.2024, 02:25 


15/12/22
198
Использую всем известный USB-UART преобразователь для чтения данных с внешнего устройства. Задействован только вход RxD, выход TxD не подключен. Устройство запитывается прямо от платы с FT232. Проблема в следующем: если подключить устройство к USB, то данные сразу поступают в буфер ft232 (мигает индикатор приёма на плате), а уже потом запустить приложение на ПК, то соответствующий COM-порт определяется и открывается почти сразу, после чего в окне начинают отображаться все получаемые данные.
Но если сначала запустить приложение на ПК (в этом случае оно сообщает что устройство не обнаружено, и предлагает повторить соединение), то COM-порт также определяется почти сразу, но открывается очень медленно (1-2 минуты). Тормозит именно функция createfile(), никаких ошибок, просто очень медленно.
Замечено, если при этом подключать ft232 с отключенным от остальной схемы выводом RxD, то COM-порт открывается достаточно быстро (несколько секунд), а при последующем подключении вывода RxD всё сразу начинает работать.
Если в процессе приложения вынуть ft232 из USB, то появляется сообщение "потеряна связь с устройством" и предлагается восстановить связь. Если снова вставить устройство в USB с подключенным RxD, то соединение восстанавливается очень медленно (1-2 минуты), а если подключать ft232 с отключенным RxD, то соединение восстанавливается быстро.
В чём причина такого поведения? В том что нельзя подавать входной сигнал на ft323 в момент её подключения, или эти задержки можно устранить в приложении ПК, путем использования особых настроек createfile?

 Профиль  
                  
 
 Re: проблемы с подключением ft232
Сообщение04.12.2024, 04:24 
Заслуженный участник


20/08/14
11867
Россия, Москва
Сталкивался думаю с похожей проблемой, только хуже: винда считала что к порту подключена мышь и указатель начинал произвольно скакать по экрану (и нажиматься в произвольном месте). Это происходило именно если в момент подключения к USB на входе присутствовал любой поток данных (у меня был чистый текст), если подключать к USB в состоянии паузы (контроллер под ресетом) и лишь потом посылать поток данных, всё было нормально. Почти уверен у Вас дело в том же.
Лечилось так: первый раз подключал к USB с замороженным потоком данных (девайс под ресетом), ставил драйвер, шёл в Диспетчер устройств - Порты - соответствующий порт - свойства - Параметры порта - Дополнительно - снимал галку PnP. Остальные кажется не влияли. После этого можно было снимать ресет и подавать поток данных, либо отключать-включать, глюк больше не проявлялся. До смены девайса (и соответственно серийного номера ft232). Чувствую это наследие ещё винды 3.11 когда мышки были COM и никакого PnP не было и слали свои координаты сразу без спроса.
Как сделать программно не разбирался.

Сделайте чтобы девайс начинал передачу только по получении контрольного символа (или сообщения) по TxD, или сигнала по служебной линии порта. Ну или с задержкой в несколько секунд, пока винда убедится что мышки там таки нет, если дело в этом.

Более общий совет - не пользуйтесь COM портами, пользуйтесь поставляемой производителем dll для прямого доступа к ft232.
Или прощивайте сразу в fr232 не просто COM-порт, а свои коды производителя и девайса - и поставляйте свой драйвер с этими же кодами.
Либо смените переходник с ft232 на другой, кажется с другими такой проблемы не наблюдал, впрочем не уверен (у меня был вообще не переходник, микросхема была в самом девайсе, новенькая, так что смена на другую была нереальна).

 Профиль  
                  
 
 Re: проблемы с подключением ft232
Сообщение04.12.2024, 11:55 


15/12/22
198
Dmitriy40 в сообщении #1663581 писал(а):
Сделайте чтобы девайс начинал передачу только по получении контрольного символа (или сообщения) по TxD

пожалуй сейчас это самый рациональный вариант, попробую, спасибо

Dmitriy40 в сообщении #1663581 писал(а):
Или прощивайте сразу в fr232 не просто COM-порт, а свои коды производителя и девайса

это понятно, но дело в том, что com порт при подключении устройства как раз определяется нормально и быстро, правильно определяется и его номер, проблема лишь в очень медленном его открытии через createfile(), тут наверное совсем не важно, какие имя и класс будут у устройства

 Профиль  
                  
 
 Re: проблемы с подключением ft232
Сообщение04.12.2024, 14:01 


15/12/22
198
Выяснился ещё такой нюанс: если во время затянувшегося открытия порта отсоеденить RxD ft232, то порт сразу же открывается, а после подсоединения RxD нормально работает. Но если запустить приложение когда ft232 уже подключен к USB то порт всегда открывается быстро, и не важно подключен был RxD или нет, и когда он был подключен. Т.е. если перезапустить приложение, то всё подключается нормально. Это как бы намекает на недостатки в самом приложении. Но что там может быть не так?

Тем не менее, я сделал задержку подачи сигнала на 5 сек. Т.е. после подачи питания на ft232, сигнал на неё начинает поступать только через 5с. Длительная задержка открытия порта исчезла. Причём неважно когда происходит попытка открыть порт, до начала поступления данных по RxD или после, или даже после переполнения буфера. Видимо, главное - дать ft232 запустится без подачи на неё входных данных, а потом она работает нормально и RxD уже ни на что не влияет. Однако, как я уже писал, при запуске приложения после подключения ft232 никаких таких проблем нет, и никакие задержки подачи сигнала на RxD не нужны.

Так же выяснилось, что нельзя пытаться открывать порт слишком быстро после подключения ft232, в этом случае, почему то SetupEnumDiDeviceInfo() не находит имя устройства, и даже после повторных попыток открыть порт, хотя, в диспетчере задач устройство есть. Даже если перезапустить приложение, устройство больше не обнаруживается. Приходится вынимать из USB и снова вставлять, тогда всё работает более-менее нормально. Почему такое происходит?

 Профиль  
                  
 
 Re: проблемы с подключением ft232
Сообщение04.12.2024, 14:32 
Заслуженный участник


20/08/14
11867
Россия, Москва
Missir в сообщении #1663605 писал(а):
Видимо, главное - дать ft232 запустится без подачи на неё входных данных, а потом она работает нормально
Я не думаю что дело в ft232, скорее в драйвере винды, даже именно в части механизма PnP для COM-портов. Похоже что винда ждёт какое-то время не пойдёт ли по каналу непрерывный поток данных и если да, то считает что там мышка, если же же нет (а буфер в ft232 мал и видимо такого куска данных мало для принятия решения виндой), то нет и всё работает правильно.

Missir в сообщении #1663605 писал(а):
Почему такое происходит?
Тут не знаю, у меня с виндой вообще были довольно разнообразные глюки, то порт вообще не определялся, то номер менялся (хотя был выставлен в настройках), то был но не открывался ни одной программой, то был но не попадал в список известных для открытия в моей программе (похоже как и у вас) при этом другие программы его открывали, то разные программы (включая и родные в винде) показывали разные списки портов (бывало включая и отсутствующие в диспетчере устройств!), то ещё как-нибудь. И это на сертифицированных MS драйверах! :facepalm:

 Профиль  
                  
 
 Re: проблемы с подключением ft232
Сообщение04.12.2024, 14:40 


15/12/22
198
Попробовал уменьшить задержку до 1 с и проблема вернулась, теперь порт открывается 1-2 минуты. Наверное можно подобрать оптимальное время задержки, но мне почему то кажется что это неправильное решение.
Dmitriy40 вот моё приложение для ПК, не могли бы Вы посмотреть, что в нём неправильно?
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
 
#include "stdafx.h"
#include "Interface_COM.h"
#include <setupapi.h>
#include "Windows.h"
#pragma comment (lib, "setupapi.lib")

#define MAX_LOADSTRING 100

// Глобальные переменные:
HINSTANCE hInst;                                // текущий экземпляр
WCHAR szTitle[MAX_LOADSTRING]=L"xxxxxxx";  // Текст строки заголовка
WCHAR szWindowClass[MAX_LOADSTRING];            // имя класса главного окна

// Отправить объявления функций, включенных в этот модуль кода:
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: разместите код здесь.

    // Инициализация глобальных строк
   // LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_INTERFACE_COM, szWindowClass, MAX_LOADSTRING);

        HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_INTERFACE_COM));

        // главное окно
        WNDCLASSEXW wcex;
        wcex.cbSize = sizeof(WNDCLASSEX);
        wcex.style = CS_HREDRAW | CS_VREDRAW;
        wcex.lpfnWndProc = WndProc;
        wcex.cbClsExtra = 0;
        wcex.cbWndExtra = 0;
        wcex.hInstance = hInstance;
        wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_INTERFACE_COM));
        wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
        wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
        wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_INTERFACE_COM);
        wcex.lpszClassName = szWindowClass;
        wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

        RegisterClassExW(&wcex);

        hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной

        HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
                CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

        if (!hWnd) return FALSE;

        // контролы
        HWND hWnd01 = CreateWindowEx(0, L"static", L"Voltage, V", WS_CHILD | WS_VISIBLE | ES_CENTER,
                10, 10, 80, 30, hWnd, (HMENU)10000, hInstance, NULL);
        HWND hWnd1 = CreateWindowEx(WS_EX_CLIENTEDGE, L"edit", L"xxx", WS_CHILD | WS_VISIBLE | ES_RIGHT,
                10, 40, 80, 30, hWnd, (HMENU)10001, hInstance, NULL);

        HWND hWnd02 = CreateWindowEx(0, L"static", L"Current, A", WS_CHILD | WS_VISIBLE | ES_CENTER,
                100, 10, 80, 30, hWnd, (HMENU)20000, hInstance, NULL);
        HWND hWnd2 = CreateWindowEx(WS_EX_CLIENTEDGE, L"edit", L"xxx", WS_CHILD | WS_VISIBLE | ES_RIGHT,
                100, 40, 80, 30, hWnd, (HMENU)20001, hInstance, NULL);

        HWND hWnd03 = CreateWindowEx(0, L"static", L"Torque, N m", WS_CHILD | WS_VISIBLE | ES_CENTER,
                190, 10, 80, 30, hWnd, (HMENU)30000, hInstance, NULL);
        HWND hWnd3 = CreateWindowEx(WS_EX_CLIENTEDGE, L"edit", L"xxx", WS_CHILD | WS_VISIBLE | ES_RIGHT,
                190, 40, 80, 30, hWnd, (HMENU)30001, hInstance, NULL);

        HWND hWnd04 = CreateWindowEx(0, L"static", L"Speed, Hz", WS_CHILD | WS_VISIBLE | ES_CENTER,
                280, 10, 80, 30, hWnd, (HMENU)40000, hInstance, NULL);
        HWND hWnd4 = CreateWindowEx(WS_EX_CLIENTEDGE, L"edit", L"xxx", WS_CHILD | WS_VISIBLE | ES_RIGHT,
                280, 40, 80, 30, hWnd, (HMENU)40001, hInstance, NULL);

        ShowWindow(hWnd, nCmdShow);
        UpdateWindow(hWnd);

        // открыть COM-порт
    DWORD i, iSize;                                           // число принятых байт
    char dev_name[1024]; unsigned char sReceivedChar[1024];   // приёмный буфер
        wchar_t str[1024], port_name[5] = L"COMx";
        HDEVINFO hDevInfo;
        SP_DEVINFO_DATA DeviceInfoData;
        SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
        GUID GUID_DEVCLASS_PORTS = {0x4d36e978, 0xe325, 0x11ce, 0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18};

        HANDLE Com_File;
        DCB dcbSerialParams = { 0 };
        COMMTIMEOUTS CommTimeOuts = { 0xFFFFFFFF,0,0,0,0 };       // чтение и запись без задержек
        MSG msg;

CONNECT:
        DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
        DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
        dcbSerialParams.DCBlength = sizeof(dcbSerialParams);

        hDevInfo = SetupDiGetClassDevsW(&GUID_DEVCLASS_PORTS, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
        if (hDevInfo!= INVALID_HANDLE_VALUE)
        {
                i = 0;
                while (SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData))
                {
                        SetupDiGetDeviceRegistryPropertyA(hDevInfo, &DeviceInfoData, SPDRP_FRIENDLYNAME, NULL, (UCHAR*)dev_name, sizeof(dev_name), NULL);
                        port_name[3] = dev_name[20]; dev_name[20] = 'x';
                        MessageBox(NULL, port_name, NULL, MB_OK);
                        if (strcmp(dev_name, "USB Serial Port (COMx)")) port_name[3] = 'x'; else  break;
                        i++;
                }
               SetupDiDestroyDeviceInfoList(hDevInfo); 
        }
   
        if (port_name[3] == 'x')
           if (MessageBox(NULL, L"Устройство не обнаружено", L"Подключение", MB_RETRYCANCEL) == IDRETRY) goto CONNECT;
           else return 0;
       
        Com_File = CreateFile(port_name, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
        if (Com_File == INVALID_HANDLE_VALUE) { MessageBox(NULL, L"Невозможно открыть последовательный порт", L"Error", MB_OK); return 0; }

        // настройка COM-порта
        if (!GetCommState(Com_File, &dcbSerialParams))
                MessageBox(NULL, L"getting state error\n", NULL, MB_OK);
        dcbSerialParams.BaudRate = CBR_9600;
        dcbSerialParams.ByteSize = 8;
        dcbSerialParams.StopBits = ONESTOPBIT;
        dcbSerialParams.Parity = NOPARITY;
        if (!SetCommState(Com_File, &dcbSerialParams))
                MessageBox(NULL, L"error setting serial port state\n", NULL, MB_OK);
        SetCommTimeouts(Com_File, &CommTimeOuts);
   
        PurgeComm(Com_File, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR); // очистка буфера com-порта                                                                                                                                                              
        SetTimer(hWnd, 1, 20, NULL);                                                        // таймер, опрос каждый 20 мс
    // Цикл основного сообщения:
        while (GetMessage(&msg, nullptr, 0, 0))
        {              
                if (msg.message == WM_TIMER)
                {
                        if (!ReadFile(Com_File, sReceivedChar, 10, &iSize, 0))
                        {
                                SendMessage(hWnd1, WM_SETTEXT, 0, (LPARAM)L"xxx");
                                SendMessage(hWnd2, WM_SETTEXT, 0, (LPARAM)L"xxx");
                                SendMessage(hWnd3, WM_SETTEXT, 0, (LPARAM)L"xxx");
                                SendMessage(hWnd4, WM_SETTEXT, 0, (LPARAM)L"xxx");
                                if (MessageBox(NULL, L"Потеряна связь с устройством", L"Подключение", MB_RETRYCANCEL) == IDRETRY)
                                { CloseHandle(Com_File); port_name[3] = 'x'; goto CONNECT; }
                                else return 0;
                        }
                        else
                        {
                                if (iSize == 4)
                                {
                                        _itow_s(sReceivedChar[0], str, 10);
                                        SendMessage(hWnd1, WM_SETTEXT, 0, (LPARAM)str);
                                        _itow_s(sReceivedChar[1], str, 10);
                                        SendMessage(hWnd2, WM_SETTEXT, 0, (LPARAM)str);
                                        _itow_s(sReceivedChar[2], str, 10);
                                        SendMessage(hWnd3, WM_SETTEXT, 0, (LPARAM)str);
                                        _itow_s(sReceivedChar[3], str, 10);
                                        SendMessage(hWnd4, WM_SETTEXT, 0, (LPARAM)str);
                                }
                        }
                }
                if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
        CloseHandle(Com_File);
    return (int) msg.wParam;
}
 

 Профиль  
                  
 
 Re: проблемы с подключением ft232
Сообщение04.12.2024, 15:21 
Заслуженный участник


20/08/14
11867
Россия, Москва
Учитывая что я не понял почему глючит (и настолько разнообразно) моя программа (и не на С), проверять вашу слишком самонадеянно.

-- 04.12.2024, 15:28 --

Missir в сообщении #1663611 писал(а):
Наверное можно подобрать оптимальное время задержки, но мне почему то кажется что это неправильное решение.
Да, неправильное, как минимум забыли про флуктуации. Зато самое простое, поставил секунд 5-10 (с тройным запасом) и забыл.
А правильнее - лишь отвечать на запросы хоста, самостоятельно ничего в комп не слать. Ну или хотя бы на начальном этапе, до получения первого запроса с хоста (и лучше не одиночного байта, мало ли что туда винда пошлёт спросить что за девайс ей подключили, разбираться ещё и в PnP мне не хотелось, проще придумать не длинное бредовое сообщение и только его и ждать). И программа на хосте после открытия порта должна послать этот вот запрос и продолжать регулярно слать до получения ответа.

-- 04.12.2024, 15:39 --

Всё что могу сказать по программе: я открывал не просто по номеру порта COMx, а по \\.\COMx, это оказалось надежнее, плюс указывал предпоследним параметром FILE_ATTRIBUTE_NORMAL. Но не думаю что это что-то меняет в вашей ситуации.

Плюс Вы забыли что номера портов могут быть не одноциферными, а вплоть до 255. Винда любит при подключении нового девайса давать ему следующий свободный порт, причём свободный не в данный момент, а вообще ни разу не использовавшийся. И если руками в диспетчере устройств не поправить номер порта, то он легко может стать двухзначным.

-- 04.12.2024, 15:48 --

А, ну и читал из порта (синхронно) и разбирал на строки я в отдельном потоке с низким приоритетом (передавая их обработчику разумеется с арбитражем, вообще через message винды, чтобы сообщения о приходе команды/строки выглядели единообразно), не в основной программе. Впрочем к долгому открытию порта это тоже не относится.

 Профиль  
                  
 
 Re: проблемы с подключением ft232
Сообщение04.12.2024, 15:56 


15/12/22
198
Dmitriy40 если бы Windows ждала какое то время данные с подключенного порта, чтобы определить мышь это или нет, то и при подключении устройства к USB без запущенной программы были бы проблемы. Но если программа не запущена, то ft232 всё время определяется нормально, даже если в него постоянно поступают данные. Если запускать программу после того как ft232 определиться, то и программа работает нормально. Её можно закрыть, открыть снова - всё работает, а порт открывается моментально.
Получается, что на определение ft232 в windows влияет сама программа. Если передёрнуть RxD то ft232 определяется сразу же, и всё работает. Но нет никакой возможности сделать это программно, пока не откроется порт, так что посылать данные по TxD бесполезно.
Помогает только задержка подачи сигнала после включения не менее 5 секунд, и то так себе помогает.
Мне кажется, если устройство не обнаружено или "отвалилось", то программа должна что то за собой подчистить, чтобы оно могло нормально определиться снова, но пока не пойму, что именно

-- 04.12.2024, 16:01 --

Dmitriy40 в сообщении #1663617 писал(а):
Плюс Вы забыли что номера портов могут быть не одноциферными, а вплоть до 255
я смотрел в диспетчере задач, порт у меня всегда один и тот же, поэтому не стал в это углубляться, наименования \\.\COMx кажется тоже нужны для многозначных номеров.

 Профиль  
                  
 
 Re: проблемы с подключением ft232
Сообщение04.12.2024, 16:22 
Заслуженный участник


20/08/14
11867
Россия, Москва
Missir в сообщении #1663622 писал(а):
Мне кажется, если устройство не обнаружено или "отвалилось", то программа должна что то за собой подчистить, чтобы оно могло нормально определиться снова, но пока не пойму, что именно
Все открытые handle (которые реально открылись без ошибок) и выделенную память. Как обычно. Если запускались дочерние потоки, то прибить их, аккуратно (посылкой им сообщения закрыться с освобождением ресурсов) или как придётся.

Missir в сообщении #1663622 писал(а):
наименования \\.\COMx кажется тоже нужны для многозначных номеров.
Не совсем, даже одноциферные порты у меня так отрывались надёжнее. Причём некоторые что открывались так - не открывались без этого (отвечали нет такого порта! хотя в диспетчере задач был). Винда она такая ... винда. Бесит.

Но я в общем и не настаиваю что у нас ситуации аналогичные, хотя по моему причина если и не одна и та же, то похожа.

 Профиль  
                  
 
 Re: проблемы с подключением ft232
Сообщение04.12.2024, 17:00 
Заслуженный участник


18/09/21
1764
Missir в сообщении #1663579 писал(а):
выход TxD не подключен

Missir в сообщении #1663579 писал(а):
но открывается очень медленно (1-2 минуты). Тормозит именно функция createfile(), никаких ошибок, просто очень медленно.
Может он туда в процессе пытается что-то послать, а TxD не подключен и он ждёт по таймауту.
Попробуйте всё же подключить TxD.
Ну или в документации покопаться, может есть флажок, чтобы отключить таймаут.

 Профиль  
                  
 
 Re: проблемы с подключением ft232
Сообщение04.12.2024, 17:20 


15/12/22
198
zykov в сообщении #1663631 писал(а):
Может он туда в процессе пытается что-то послать, а TxD не подключен и он ждёт по таймауту

тогда опять же непонятно, почему с закрытой программой подключение происходит почти моментально? TxD ведь также не подключен, а сама программа (см. выше) вообще ничего в порт не отправляет (насколько я это понимаю)

если устройство не найдено, пробовал обнулять dcbSerialParams но это ничего не дало

Dmitriy40 Вы кажется хорошо в этом понимаете, что происходит на ножках микроконтроллера в момент включения. Они обесточены? Когда на них появляется напряжение?

 Профиль  
                  
 
 Re: проблемы с подключением ft232
Сообщение04.12.2024, 17:41 
Заслуженный участник


20/08/14
11867
Россия, Москва
zykov
Так ведь таймауты настраиваются SetCommTimeouts() уже после CreateFile(), уже по полученному от неё handle.
А значения по умолчанию - в свойствах порта (в диспетчере устройств), как туда пролезть программно без открытия порта я не изучал. Вероятно проще через правку реестра.

Missir в сообщении #1663636 писал(а):
Dmitriy40 Вы кажется хорошо в этом понимаете, что происходит на ножках микроконтроллера в момент включения. Они обесточены? Когда на них появляется напряжение?
Зависит от МК и его настроек. Обычно, пока схема не запущена, это где-то до 1.0В-1.5В, там может быть любая чушь (не выше текущего Vcc разумеется), потом, как внутренние схемы запускаются, МК встаёт под ресет и состояние ножек описывается состоянием ресета (может быть z состояние, может быть подтяжка на Vcc, зависит от многих факторов). Потом, когда ресет снимается, состояние обычно не меняется (хотя бывают и исключения) вплоть до программной настройки уже прикладной прошивкой.
Чаще всего под ресетом ножки в z состоянии, т.е. никуда не подключены (за исключением схем защиты от статики, т.е. защитных диодов, для выходов они конечно паразитные, но выполняют ту же функцию). Но некоторые МК имеют fuse подтяжки ножек к Vcc под ресетом, тогда будут уже не в z.
Это всё для микросекундного и медленнее диапазонов, для субмикросекундного всё сложнее и придётся учитывать паразитные ёмкости. Потому иногда, когда важно отсутствие иголок и шума даже короче микросекунд, на важные ножки вешают внешние ёмкости, удерживающие их в нуле достаточно долго для старта МК (или хотя бы схемы ресета в нём). В ещё более безопасные вещи (типа очерёдности подачи питания, гарантированной паузы между выкл и снова вкл, и т.д.) углубляться уж не буду.

Это всё вряд ли влияет в вашем случае.

-- 04.12.2024, 17:52 --

(z состояние)

Напомню, z состояние это не значит что вывод висит в вакууме вдали от всех галактик, это значит что он подключен на сопротивление в гигаомы (редко тераомы, обычно даже через воздух окажется меньше) и конденсатор типа единиц пикофарад. Обычно на землю (GND, минус питания), но иногда важно и такое же подключение к другим цепям (по схеме звезда от вывода), особенно если они высоковольтные (десятки вольт) и сильноточные (доли ампера и более), тогда с них вполне может наводиться заметная помеха на вывод в z состоянии и восприняться как сигнал какими-то другими уже включившимися схемами. Если важно состояние выводов до их программной инициализации - подтягивайте, на неактивный уровень. Иногда подтяжку потом отключают, когда программа уже стала сама управлять выводом.

 Профиль  
                  
 
 Re: проблемы с подключением ft232
Сообщение05.12.2024, 09:36 
Аватара пользователя


11/12/16
14035
уездный город Н
zykov в сообщении #1663631 писал(а):
Может он туда в процессе пытается что-то послать, а TxD не подключен и он ждёт по таймауту.
Попробуйте всё же подключить TxD.


Судя по описанию, под TxD понимается передающий сигнал, от ft232 к внешнему устройству.
В таком случае, наличие чего-то подключенного или не подключенного к TxD на эти чудеса никак не влияет.

-- 05.12.2024, 09:39 --

Missir
Натыкался, что вокруг ft232 была т.н. "война драйверов". Когда производитель оригинального ft232 вставлял в драйвера всякие гадости при работе с неоригинальным ft232.
Возможно, имеет смысл попробовать разные версии драйверов.

 Профиль  
                  
 
 Re: проблемы с подключением ft232
Сообщение05.12.2024, 13:57 


15/12/22
198
Ещё раз всё проверил. Получается, что при запущенной программе стабильно работает только с задержкой. Задержка 5 сек. Странно, но кнопку "подключиться" нужно нажимать не ранее чем через пару сек. после того, как устройство вставлено в USB, в этом случае, сразу после истечения общего времени задержки, данные начинают поступать на ft232 и отображаться в окне приложения, т.е. всё работает как нужно. Если же нажать "подключиться" слишком рано, или после того как данные пойдут в ft323 (т.е. спустя более чем 5 сек.), то вылетает сообщение "устройство не обнаружено". Потом уже можно сколько угодно перезапускать программу, но оно больше не обнаруживается, пока его не передёрнуть в разъёме. Я проверил - это функция SetupDiEnumDeviceInfo( почему то не находит ft232, хотя в диспетчере задач оно есть и отображается как обычно. Такое впечатление, что при преждевременной попытке подключения оно не успевает куда то прописаться, а при подключении уже с поступающими на вход данными, прописывается куда то не туда.
Причём, как я уже писал, если вставить устройство в USB с не запущенной программой, а потом её запустить - проблем никаких нет, устройство сразу определяется и работает. Я пробовал удалять открытые ресурсы, но в программе ничего такого и не открывается, если только закрыть ещё и главное окно, но такой вариант мне не подходит. В общем непонятно в чём дело, а хотелось бы установить причину.

-- 05.12.2024, 14:14 --

Раньше я писал, что невозможно подать сигнал на TxD пока порт закрыт, и поэтому, это никак не поможет. Но это было заблуждением. Если схема не подаёт сигнал на RxD, то порт определяется и открывается быстро. После этого можно подать сигнал на TxD после получения которого схема начнёт передавать данные на RxD. Это должно быть лучше и быстрее, чем просто с задержкой, поэтому попробую сделать так.

Другие драйвера я не пробовал, нужно будет проверить и этот момент, спасибо EUgeneUS

 Профиль  
                  
 
 Re: проблемы с подключением ft232
Сообщение05.12.2024, 14:47 
Заслуженный участник


20/08/14
11867
Россия, Москва
Missir в сообщении #1663722 писал(а):
Если схема не подаёт сигнал на RxD, то порт определяется и открывается быстро. После этого можно подать сигнал на TxD после получения которого схема начнёт передавать данные на RxD. Это должно быть лучше и быстрее, чем просто с задержкой, поэтому попробую сделать так.
Именно про это я и говорил с самого начала:
Dmitriy40 в сообщении #1663581 писал(а):
Сделайте чтобы девайс начинал передачу только по получении контрольного символа (или сообщения) по TxD, или сигнала по служебной линии порта.
Dmitriy40 в сообщении #1663617 писал(а):
А правильнее - лишь отвечать на запросы хоста, самостоятельно ничего в комп не слать. Ну или хотя бы на начальном этапе, до получения первого запроса с хоста (и лучше не одиночного байта, мало ли что туда винда пошлёт спросить что за девайс ей подключили, разбираться ещё и в PnP мне не хотелось, проще придумать не длинное бредовое сообщение и только его и ждать). И программа на хосте после открытия порта должна послать этот вот запрос и продолжать регулярно слать до получения ответа.


Да, кстати, глянул в свою старую программу, я там пользовался EnumPorts() для получения списка портов (фильтровал его по символам "COM" слева) и потом (после выбора юзера) пытался уже его открывать. Получаемый список часто отличался от списка портов в диспетчере устройств (часть портов отсутствовала, были лишние которые открыть не получалось). В какой-то следующей версии показывал юзеру только те что реально открылись (понятно что их тут же закрывал).

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group