Перейти к содержанию
    

C++ Winapi Окно "Edit"

Написал простое приложение с использованием 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);	//

Работает но криво. Выводит вот так:

Screenshot_1.png.bb85f45b16a710085263b478d5be067d.png

Как - то можно это исправить?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

37 minutes ago, Димон Безпарольный said:

Как - то можно это исправить?

Сделайте в STM32 форматированный вывод, например

sprintf(....);

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, dimka76 said:

Сделайте в STM32 форматированный вывод, например

С самого начала. printf и sprinf используется с \r\n на конце.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 minutes ago, Димон Безпарольный said:

С самого начала. printf и sprinf используется с \r\n на конце.

Ну, так с помощью них и форматируйте, добавьте модификатор ширины. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Было бы неплохо, чтобы было видно, как должен выглядеть "правильный" вывод. Т.е. без декодирования и додумывания.

Если по интерфейсу все в текстовом формате, можно попробовать открыть файл не в бинарном, а в текстовом режиме.

(не уверен, возможно в текстовом режиме ф-я будет работать в "синхронном" режиме и ждать терминирующего символа \r, как gets() )

Использовать ReadFileEx(...) которая позволяет работать в "блочном" режиме с таймаутом (если лог выдается построчно с временнЫми паузами между строками). Те не читать каждый "прилетевший" байт а ждать блок(строку) и обрабатывать его.

итд

Организовать прием в "поток" и выделять-выводить уже функциями потока. Но это не ко мне.

Организовать суррогат потока - читать-накапливать ввод в строковую переменную, и в зависимости от наличия \r выводить в окно.

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ps

1 hour ago, Димон Безпарольный said:

С самого начала. printf и sprinf используется с \r\n на конце.

Этого недостаточно при выводе HEX

printf("%.08X\n\r", var32);

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 минут назад, k155la3 сказал:

printf("%.08X\n\r", var32);

А я '\r' не использую. Только '\n' остается. Т.е.

printf("%.08X\n", var32);

т.к. все это передается за какое-то время, а зачем его затягивать ненужными вещами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

последный пустой байт bRead[RetBytes], а не bRead[RetBytes+1], поэтому и мусор в буфере перед \0 в конце.

bRead[RetBytes++] = 0;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Судя по предоставленному коду, вы не проверяете полученную посылку на окончание строки. Вам нужно сформировать буфер в который будут добавляться полученные данные. А потом уже из него формировать строки на вывод.

Скиньте исходник на [email protected]

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте строки

    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>

 

 

Изменено пользователем Strannik_78

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 hours ago, Strannik_78 said:

Судя по предоставленному коду, вы не проверяете полученную посылку на окончание строки.

ТСу нужен "cat /dev/ttyS0"

зачем там вообще что-то разбирать?

проблема у него только в том что он лишний инкремент делает перед добавлением \0 в конец строки, отсюда и случайные лишние символы в буфере.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 hours ago, Obam said:

ТСу нужен "cat /dev/ttyS0"
Да уж, под виндой и cat, и dev и особенно ttyS0 в избытке ((-8Ж

я про то что ему по сути надо просто скопировать уже отфоратированные данные из порта в вывод как есть, а не разбирать где именно там в них переводы строк.

для зануд пусть будет: copy com1 con

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...