Димон Безпарольный 2 26 мая, 2022 Опубликовано 26 мая, 2022 · Жалоба Написал простое приложение с использованием WinApi для работы с железкой STM32. Создал окно Edit в который выводится лог. Прием по COM порту осуществил с использованием триады. Все что принял вывожу в окно Edit: RetBytes = comstat.cbInQue; //и получить из неё количество принятых байтов if(RetBytes) //если действительно есть байты для чтения { // ReadFile(hComPORT, bRead, RetBytes, &RetBytes, &overlapped); //прочитать байты из порта в буфер программы if (RetBytes > 0) // { // bRead[++RetBytes] = 0; //Завершающий 0 PrintMultitext(bRead); // } // Сам вывод в окно в отдельной функции: void PrintMultitext(const char* COMString) // { // static unsigned char NLine = 0; // SendMessage(hTextBOX, EM_SETSEL, 0, -1); // SendMessage(hTextBOX, EM_SETSEL, -1, -1); // SendMessage(hTextBOX, EM_REPLACESEL, 0, (LPARAM)COMString); // Работает но криво. Выводит вот так: Как - то можно это исправить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 63 26 мая, 2022 Опубликовано 26 мая, 2022 · Жалоба 37 minutes ago, Димон Безпарольный said: Как - то можно это исправить? Сделайте в STM32 форматированный вывод, например sprintf(....); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 26 мая, 2022 Опубликовано 26 мая, 2022 · Жалоба 2 minutes ago, dimka76 said: Сделайте в STM32 форматированный вывод, например С самого начала. printf и sprinf используется с \r\n на конце. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 63 26 мая, 2022 Опубликовано 26 мая, 2022 · Жалоба 8 minutes ago, Димон Безпарольный said: С самого начала. printf и sprinf используется с \r\n на конце. Ну, так с помощью них и форматируйте, добавьте модификатор ширины. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 26 мая, 2022 Опубликовано 26 мая, 2022 · Жалоба Было бы неплохо, чтобы было видно, как должен выглядеть "правильный" вывод. Т.е. без декодирования и додумывания. Если по интерфейсу все в текстовом формате, можно попробовать открыть файл не в бинарном, а в текстовом режиме. (не уверен, возможно в текстовом режиме ф-я будет работать в "синхронном" режиме и ждать терминирующего символа \r, как gets() ) Использовать ReadFileEx(...) которая позволяет работать в "блочном" режиме с таймаутом (если лог выдается построчно с временнЫми паузами между строками). Те не читать каждый "прилетевший" байт а ждать блок(строку) и обрабатывать его. итд Организовать прием в "поток" и выделять-выводить уже функциями потока. Но это не ко мне. Организовать суррогат потока - читать-накапливать ввод в строковую переменную, и в зависимости от наличия \r выводить в окно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 26 мая, 2022 Опубликовано 26 мая, 2022 · Жалоба ps 1 hour ago, Димон Безпарольный said: С самого начала. printf и sprinf используется с \r\n на конце. Этого недостаточно при выводе HEX printf("%.08X\n\r", var32); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AleksBak 0 26 мая, 2022 Опубликовано 26 мая, 2022 · Жалоба 19 минут назад, k155la3 сказал: printf("%.08X\n\r", var32); А я '\r' не использую. Только '\n' остается. Т.е. printf("%.08X\n", var32); т.к. все это передается за какое-то время, а зачем его затягивать ненужными вещами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 79 6 июля, 2022 Опубликовано 6 июля, 2022 · Жалоба последный пустой байт bRead[RetBytes], а не bRead[RetBytes+1], поэтому и мусор в буфере перед \0 в конце. bRead[RetBytes++] = 0; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Strannik_78 0 7 июля, 2022 Опубликовано 7 июля, 2022 · Жалоба Судя по предоставленному коду, вы не проверяете полученную посылку на окончание строки. Вам нужно сформировать буфер в который будут добавляться полученные данные. А потом уже из него формировать строки на вывод. Скиньте исходник на [email protected] Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Strannik_78 0 8 июля, 2022 Опубликовано 8 июля, 2022 (изменено) · Жалоба Попробуйте строки bRead[++RetBytes] = 0; //Завершающий 0 PrintMultitext(bRead); // заменить на static std::string bufStr = ""; // создание буфера std::string addStr(bRead); // преобразование полученного массива в строку bufStr += addStr; // добавление к буферу полученной строки std::string sepStr = "\n"; // задание сепаратора разделяющиего одну строку от другой int pos = bufStr.find(sepStr); // поиск в буфере наличие сепаратора while (pos != -1) { addStr.assign(bufStr, 0, pos); // копирование значения строки до сепаратора PrintMultitext(addStr.c_str()) // вывод строки на экран bufStr.erase(0, pos + sepStr.size()); // удаление из буфера выведенной строки pos = bufStr.find(sepStr); // повторение поиска сепаратора } не забудьте подключить #include <string> Изменено 8 июля, 2022 пользователем Strannik_78 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 79 8 июля, 2022 Опубликовано 8 июля, 2022 · Жалоба 21 hours ago, Strannik_78 said: Судя по предоставленному коду, вы не проверяете полученную посылку на окончание строки. ТСу нужен "cat /dev/ttyS0" зачем там вообще что-то разбирать? проблема у него только в том что он лишний инкремент делает перед добавлением \0 в конец строки, отсюда и случайные лишние символы в буфере. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 38 10 июля, 2022 Опубликовано 10 июля, 2022 · Жалоба ТСу нужен "cat /dev/ttyS0" Да уж, под виндой и cat, и dev и особенно ttyS0 в избытке ((-8Ж Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 79 10 июля, 2022 Опубликовано 10 июля, 2022 · Жалоба 6 hours ago, Obam said: ТСу нужен "cat /dev/ttyS0" Да уж, под виндой и cat, и dev и особенно ttyS0 в избытке ((-8Ж я про то что ему по сути надо просто скопировать уже отфоратированные данные из порта в вывод как есть, а не разбирать где именно там в них переводы строк. для зануд пусть будет: copy com1 con Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться