Задать вопрос
  • Как записать шаблонные операторы для массива и контейнера?

    @communistic_sistema Автор вопроса
    Wataru, да? и куда? в контейнер, что уже содержит элементы?
    Написано
  • Как записать шаблонные операторы для массива и контейнера?

    @communistic_sistema Автор вопроса
    Wataru, почему не имеет смысла? разве не выгоднее будет сделать std::move объектов массива из rvalue класса?
    Написано
  • Как записать шаблонные операторы для массива и контейнера?

    @communistic_sistema Автор вопроса
    Wataru, дал оператор, дал его использование, дал шаблоны, указал что за ошибка возникает. Я не понимаю
    Ошибку-то покажите
    . Я могу максимум добавить, что операторы без rvalue в контейнере это friend контейнера и что в класс с полем i это:
    struct SS {
    	int i[5] = { 1,2,3,4,5 };
    };

    Вы хотите вывод сборки в виде
    error C2666: "dte_utils::operator +": перегруженные функции имеют похожие преобразования
    ?
    Это еще решается через std::move(temp_class().i), однако мне не понятно из-за чего, ведь в операторах на массив статичного размера при такой же записи с этим же классом использует операторы по T(&&)[].
    Написано
  • Как написать вариадический оператор по SFINAE для умного указателя на Т, который может быть функцией?

    @communistic_sistema Автор вопроса
    rPman, в случае dllimport - так и есть, но у меня LoadLibrary, так что в определении функции может быть другая функция
    res2001, rPman, да HANDLE может быть использован и очищается в 0 при FreeLibrary (и подсчете), однако у меня нет гарантий того, что именно dll всегда отвечает за функции, просто это будет чаще всего (и возможно будет например с функторами т.д.)
    мне нужна именно слабая связь, чтобы считать - если слабые владельцы остались, это значит нужно создать одну слабую связь, которая будет для них всех (ибо референс для них един), которая всем сразу и установит нужную функцию после выгрузки
    сильная ссылка будет уничтожена после выгрузки dll поэтому она рациональна в использовании
    Написано
  • Как написать вариадический оператор по SFINAE для умного указателя на Т, который может быть функцией?

    @communistic_sistema Автор вопроса
    rPman, решает проблему, возможно ли запускать вложенные функции внутри невыгруженной функции. Можно конечно следить выгружаемыми dll кто использует, но это вариант не лучше
    Написано
  • Как написать вариадический оператор по SFINAE для умного указателя на Т, который может быть функцией?

    @communistic_sistema Автор вопроса
    rPman,
    умный указатель мне нужен для того, чтобы отслеживать, является ли функция выгруженной
    Написано
  • Как написать вариадический оператор по SFINAE для умного указателя на Т, который может быть функцией?

    @communistic_sistema Автор вопроса
    Wataru, я знаю, что высвобождение инструкций не сулит ничем хорошим, умный указатель мне нужен для того, чтобы отслеживать, является ли функция выгруженной (все сильные ссылки оборваны, я использую в местах выполнения только слабые).
    полный текст ошибки:
    1>D:\DTE\DynamicTokenEngine\TokenOperator\token\source\stream.cpp(14,4): error C3889: вызов объекта типа класса "dte_utils::weak_ref": не найден соответствующий оператор вызова
    1>D:\DTE\DynamicTokenEngine\TokenOperator\utils\include\pointer.h(118,6): message : может быть "R dte_utils::weak_ref::operator ()(Args...) const"
    1>D:\DTE\DynamicTokenEngine\TokenOperator\token\source\stream.cpp(14,19): message : "R dte_utils::weak_ref::operator ()(Args...) const": не удается вывести аргумент шаблон для "R"
    Написано
  • Как исправить ошибку буфера с UART?

    @communistic_sistema Автор вопроса
    jcmvbkbc, проблема, увы не исчезла, 67кб передаются с теми же 33к ошибок
    DWORD ComIface::write(byte* data, int count) {
        DWORD NumOfWritten, status;
        OVERLAPPED overlap = { 0 };
        overlap.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
        if (!overlap.hEvent) {
            printf("CreateEvent failed with error %d.\n", GetLastError());
            return 0;
        }
        if (!WriteFile(port_handle, data, count, &NumOfWritten, &overlap)) {
            status = GetLastError();
            if (status != ERROR_IO_PENDING) {
                printf("WriteFile failed with error %d.\n", status);
                CloseHandle(overlap.hEvent);
                return 0;
            }
    		status = WaitForSingleObject(overlap.hEvent, read_delay);
    		if (status == WAIT_ABANDONED || status == WAIT_FAILED) {
    			printf("WaitForSingleObject failed with error %d.\n", GetLastError());
    		}
            if (!GetOverlappedResult(port_handle, &overlap, &NumOfWritten, TRUE)) {
                printf("GetOverlappedResult failed with error %d.\n", GetLastError());
            }
        }
        CloseHandle(overlap.hEvent);
        return NumOfWritten;
    }
    DWORD ComIface::read(byte* buffer, int size) {
        DWORD NumberOfBytesReaded = 0, status = 0;
        OVERLAPPED overlap = { 0 };
        overlap.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
        if (!overlap.hEvent) {
            printf("CreateEvent failed with error %d.\n", GetLastError());
            return 0;
        }
        if (!ReadFile(port_handle, buffer, size, NULL, &overlap)) {
            status = GetLastError();
            if (status != ERROR_IO_PENDING) {
                printf("ReadFile failed with error %d.\n", status);
                CloseHandle(overlap.hEvent);
                return 0;
            }
    		status = WaitForSingleObject(overlap.hEvent, read_delay);
    		if (status == WAIT_ABANDONED || status == WAIT_FAILED) {
    			printf("WaitForSingleObject failed with error %d.\n", GetLastError());
    		}
            if (!GetOverlappedResult(port_handle, &overlap, &NumberOfBytesReaded, TRUE)) {
                printf("GetOverlappedResult failed with error %d.\n", GetLastError());
            }
        }
        CloseHandle(overlap.hEvent);
        return NumberOfBytesReaded;
    }
    Написано
  • Как исправить ошибку буфера с UART?

    @communistic_sistema Автор вопроса
    res2001, для обработки ERROR_IO_PENDING как раз и применяется WaitForSingleObject. И как таймауты могут навредить передаче при одном чтении? Зачем использовать EV_ERR когда мы передаем и получаем одинаковое кол-во байт? Куда переполнится буфер если мы всего для теста запускаем 1 отправку и 1 чтение, а запас в 1,5х объема?
    Написано
  • Как исправить ошибку буфера с UART?

    @communistic_sistema Автор вопроса
    jcmvbkbc, м... хорошая идея, спасибо
    После тестов сообщу результаты
    Написано
  • Как исправить ошибку буфера с UART?

    @communistic_sistema Автор вопроса
    jcmvbkbc, могу прислать и верилог, тег в вопросе потому что ПЛИС используется
    Написано
  • Как исправить ошибку буфера с UART?

    @communistic_sistema Автор вопроса
    res2001, я могу полностью прислать код и спросить "верно?", "работать будет?". Но это не гарантирует снижение вероятности ошибок ни на одной из сторон. Я не понимаю почему ONESTOPBIT ломает передачу на 533 байте со смещением на 1 и почему при ONE5STOPBITS происходит смещение на 25 байт. Это не типичное поведение. Но недозаписал или еще что, но у тебя будет нормальное начало и незначащий конец, а это все здесь, в этой ситуации, значащие данные с определенным порядком, который задали мы со сдвигом в 25 позиций.
    Откуда эти 25 позиций?!
    Написано
  • Как исправить ошибку буфера с UART?

    @communistic_sistema Автор вопроса
    res2001,
    bool ComIface::open(int _port_num, bool log) {
        //create port name
        wchar_t strbuffer[11];
        swprintf_s(strbuffer, 11, L"\\\\.\\COM%d", _port_num);
        //create port handle
        port_handle = CreateFileW(
            strbuffer,
            GENERIC_READ | GENERIC_WRITE,
            0,                              //must be opened with exclusive-access
            NULL,                           //default security attributes
            OPEN_EXISTING,                  //must use OPEN_EXISTING
            FILE_FLAG_OVERLAPPED,           //async I/O
            NULL                            //hTemplate must be NULL for comm devices
        );
        //check if handle is valid
        if (port_handle == INVALID_HANDLE_VALUE) {
            if (log) {
                printf("CreateFileW failed with error %d.\n", GetLastError());
            }
            return false;
        }
        //set port settings
        if (!SetCommState(port_handle, &dcb)) {
            if (log) {
                printf("SetCommState failed with error %d.\n", GetLastError());
            }
            close();
            return false;
        }
        //set port timings
        COMMTIMEOUTS timings{
            10,      /* Maximum time between read chars. */
            10,     /* Multiplier of characters.        */
            10,     /* Constant in milliseconds.        */
            10,      /* Multiplier of characters.        */
            10       /* Constant in milliseconds.        */
        };
        SetCommTimeouts(port_handle, &timings);
        PurgeComm(port_handle, PURGE_RXCLEAR | PURGE_TXCLEAR);
        //set port state
        port_num = _port_num;
        return true;
    }

    Таймауты есть. ReadFile читает содержимое порта 1 раз, так что мы должны получить не смещение, а недозапись из порта в наш буфер, раз мы не гарантировано читаем все при передаче управления. Однако, ReadFile возвращает столько байт, сколько было и для WriteFile
    Сейчас цикл есть, но это цикл не "ожидание байта с прочтением в течении времени" а "ожидание блока байтов с прочтением их всех"
    Написано
  • Как исправить ошибку буфера с UART?

    @communistic_sistema Автор вопроса
    Ну так это и была попытка асинхронного IO, флаг файла - overlapped
    это не значит, что ReadFile гарантированно завершиться синхронно

    синхронно относительно кого?
    Цикл проблему не решает, ReadFile по 1 байту приводит к такому же результату (обе проблемы). Тем более смысл делать много чтений, когда я могу подождать пока туда положится нужный мне блок
    В попытках найти ответ на мои проблемы я находил посты что ReadFile и WriteFile медленные, однако прочитав не совсем понимал причину, однако скорость сейчас не в приоритете, в приоритете это рабочая передача блока любого размера, что физически порт может хранить в буфере
    Написано
  • Как исправить ошибку буфера с UART?

    @communistic_sistema Автор вопроса
    jcmvbkbc, это обеспечивает асинхронные EV_RXCHAR и EV_TXCHAR, нам нужно тестировать плис. Я не просто так указал verilog здесь, потому что я не уверен 100% что здесь нет ее вины.
    Написано
  • Как исправить ошибку буфера с UART?

    @communistic_sistema Автор вопроса
    jcmvbkbc, разве ReadFile/WriteFile при созданном файле с флагом overlapped можно использовать без overlapped и сохранить асинхронность?
    Написано
  • Как исправить ошибку буфера с UART?

    @communistic_sistema Автор вопроса
    jcmvbkbc, возвращаемый DWORD инициализирован как 0 в начале, не будет мусора.
    по поводу ReadFile и WriteFile:
    как я понял мне нужно убрать указатель на число обозначающее сколько было записано/прочтено, но оставить GetOverlappedResult для асинхронного порта
    Верно? Это и есть причина таких смещений и ошибок?
    Написано
  • Как исправить ошибку буфера с UART?

    @communistic_sistema Автор вопроса
    jcmvbkbc, то есть ReadFileEx должно упростить и исправить ситуацию?
    Проверка чтения идет по возвращаемому DWORD.
    Я уберу GetOverlappedResult, спасибо.
    Написано
  • Как исправить ошибку буфера с UART?

    @communistic_sistema Автор вопроса
    Передача ПК-ПЛИС-ПК в тот же самый порт
    DWORD ComIface::write(byte* data, int count) должна byte[N] записать в буфер порта на отправку
    Сложно потому что IO_PENDING, OVERLAPPED в асинхронном режиме должна быть не NULL в WriteFile
    Может GetOverlappedResult лишнее, но оно точно не влияет на число записанных байтов
    DWORD ComIface::read_block(byte* buffer, int size) должна за 1 ReadFile заполнить byte[N]
    Происходят 2 проблемы, я их указал, 1 мы починили костылем (потерпим), а вторую не починили
    Написано