Re: Прошу помочь в объединении двух простых приложений в одн
От: Кодт Россия  
Дата: 06.12.09 20:37
Оценка: :))
Здравствуйте, ZoltriX, Вы писали:

"Я не могу дать тебе барана, но могу дать добрый совет. Потому что у нас страна советов, а не страна баранов".

Совет вот какой:
— берёшь любой опенсорсный редактор текстовых файлов
— допиливаешь его, чтобы он подписывался на изменение этого файла
(начиная от простого — опрос даты-времени и длины раз в секунду, и кончая File Notification API — см. FindFirstFileNotification и т.п.)
— открываешь файл с логами своей печки, желательно, как read-only
— когда приходит сигнал об изменении файла, перечитываешь или даже просто дочитываешь хвост.
Вуаля! Правда, может быть немало рутинной работы, а то и творческого рефакторинга.

Ещё вариант — пожалуй, даже более простой, чем предыдущее.
Эдитбокс + открытый на чтение конвеер (pipe, socket, да собственно, твой com-порт). Возможно, в Overlapped I/O.
Поступают новые данные — дописываешь в конец эдитбокса.
Только возможно, лучше взять контрол не EDIT, а RichEdit — у него проще осуществлять дозапись фрагментов.
В обычном EDIT это будет мучительно — нужно сохранять выделение и позицию скролла, переписывать текст, восстанавливать выделение и позицию...
Перекуём баги на фичи!
Re[9]: Прошу помочь в объединении двух простых приложений в
От: x64 Россия  
Дата: 06.12.09 22:34
Оценка:
ZX>Неужели не найдётся желающего помочь?

Неа.
Re[7]: Прошу помочь в объединении двух простых приложений в
От: x64 Россия  
Дата: 06.12.09 22:41
Оценка: 1 (1)
ZX>У меня серьёзно проблема — не пойму за что взяться, знания есть, но мало, а практика написания софта под виндовс = 0.

А хрен ли ты вообще взялся за работу, если то не знаешь, это не знаешь, гуглом пользоваться не умеешь и так далее?

ZX>Вообщем прошу минимум — переделайте вывод принимаемых данных в окно, по свойствам как Блокноте (с возможностью прокрутки данных).


Проблема в том, что когда кто-то другой, так же как и ты сейчас, будет просить сделать часть своей работы, ты пройдёшь мимо. Да-да, парень, ты пройдёшь мимо, ибо вероятность этого чуть менее чем 100%. Это одна из причин, почему никто сейчас не хочет вкладывать в тебя свои ресурсы.
Re[8]: Прошу помочь в объединении двух простых приложений в
От: ZoltriX  
Дата: 06.12.09 22:56
Оценка:
Здравствуйте, x64, Вы писали:

ZX>>У меня серьёзно проблема — не пойму за что взяться, знания есть, но мало, а практика написания софта под виндовс = 0.


x64>А хрен ли ты вообще взялся за работу, если то не знаешь, это не знаешь, гуглом пользоваться не умеешь и так далее?


ZX>>Вообщем прошу минимум — переделайте вывод принимаемых данных в окно, по свойствам как Блокноте (с возможностью прокрутки данных).


x64>Проблема в том, что когда кто-то другой, так же как и ты сейчас, будет просить сделать часть своей работы, ты пройдёшь мимо. Да-да, парень, ты пройдёшь мимо, ибо вероятность этого чуть менее чем 100%. Это одна из причин, почему никто сейчас не хочет вкладывать в тебя свои ресурсы.


Я то и сам на месте не сижу, я пытаюсь создать Edit-окно и пытаться туда что-то вывести.
Но уже при создании окна имею возвращаемое значение = 0.
Тоесть нихрена не создаётся. А понять не могу.... (((
Re[3]: Прошу помочь в объединении двух простых приложений в
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 08.12.09 15:03
Оценка:
Здравствуйте, ZoltriX, Вы писали:

ZX>Более лучшего терминала с исходником я просто не нашёл.

ZX>При отображении температуры, значение надо считать по формуле, а не просто выводить.
ZX>А этот — нормальный терминал, только вот вывод странно организован

А зачем тут терминал приплетен, вообще непонятно. Тем более, что данные надо не просто тупо выводить, а обрабатывать. Открываешь COM-порт, считываешь оттуда данные, парсишь их, и выводи куда хочешь
Маньяк Робокряк колесит по городу
Re: Прошу помочь в объединении двух простых приложений в одн
От: ASMelancholy Россия  
Дата: 11.12.09 10:07
Оценка: 5 (2) +1
В исходниках терминалки есть файлик serail.c — в нем и есть код работы с ком портом, только он уж очень корявый.
Исходники блокнота даже не смотрел — судя по всему это и не надо.
Вот код программы (проверить не могу — нет термопечи и вообще нет ком порта)

#include <windows.h>
#define MESS_SERIAL (WM_USER+1)

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL OpenPort(int port,int baud,int HwFc, HWND handle);

int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPInst, LPSTR lpCmd, int nCmd)
{
    WNDCLASSW             wc;
    HWND                 hWnd;
    MSG                     msg;
    wchar_t                *szWndCls = L"STCLS";
    memset(&wc, 0, sizeof(wc));
    wc.style            = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc        = (WNDPROC)WndProc;
    wc.hInstance        = hInst;
    wc.hCursor            = LoadCursorW(0, IDC_ARROW);
    wc.lpszClassName    = szWndCls;
    if (!RegisterClassW(&wc))
        return 1;
    hWnd = CreateWindowW(szWndCls, L"Simple Terminal", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0, 0, hInst, 0);
    ShowWindow(hWnd, nCmd);
    UpdateWindow(hWnd);
    while (GetMessage(&msg, 0, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static HWND                 hEdit;
    switch (uMsg) {
        case WM_CREATE: {
            CREATESTRUCT    *CS;
            CS = (CREATESTRUCT *)lParam;
            hEdit = CreateWindowExW(WS_EX_CLIENTEDGE, L"EDIT", 0, WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_AUTOVSCROLL | ES_MULTILINE | ES_READONLY, 0, 0, 0, 0, hWnd, 0, CS->hInstance, 0);
            SendMessage(hEdit, WM_SETFONT, (WPARAM)CreateFontA(14, 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, DEFAULT_PITCH, "dejavu sans mono"), 0);
            OpenPort(1, 9600, 0, hWnd);
            return 0;
        }
        case WM_SIZE: {
            SetWindowPos(hEdit, 0, 0, 0, LOWORD(lParam), HIWORD(lParam), SWP_NOZORDER);
            return DefWindowProc(hWnd, uMsg, wParam, lParam);
        }
        case WM_CLOSE: {
            PostQuitMessage(0);
            return 0;
        }
        case MESS_SERIAL: {
            int         iLength;
            char    *szTmp;

            szTmp = (char *)lParam;
            szTmp[wParam] = 0;
            iLength = GetWindowTextLengthW(hEdit);
            SendMessage(hEdit, EM_SETSEL, iLength, iLength);
            SendMessageA(hEdit, EM_REPLACESEL, 0, (LPARAM)szTmp);
            return 0;
        }
    }
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}


/* From serial.c */
#include <stdio.h>

// Functions:
HANDLE StartCommThread(void);
DWORD WINAPI ThreadProc(void *p);

// Variables:
HANDLE SerialPort=NULL;
HANDLE Thread;
HWND handle=NULL;
int StopThread=0;
int FlowControl=0;

void ShowLastError(void)
{
    LPVOID lpMsgBuf;
    FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL);
    MessageBox(NULL, (LPTSTR)lpMsgBuf, TEXT("Error"), MB_OK|MB_ICONINFORMATION );
    LocalFree( lpMsgBuf );
}
BOOL OpenPort(int port,int baud,int HwFc, HWND hwnd)
{
  HANDLE Comport;
  DCB myDCB;
  COMMTIMEOUTS CTout;
  char str[100];
  
  FlowControl = HwFc;
  
  if (port > 9)
    wsprintfA(str,"\\\\.\\COM%d",port);
  else
    wsprintfA(str,"COM%d",port);
  Comport = CreateFileA(str,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
  if (Comport == INVALID_HANDLE_VALUE)
    return FALSE;
  if (!SetupComm(Comport,350,20))
    return FALSE;
  if (!GetCommState(Comport,&myDCB))
    return FALSE;
  myDCB.fInX = FALSE;
  myDCB.fOutX = FALSE;
  myDCB.fOutxDsrFlow = FALSE;
  if (HwFc)
    {
      myDCB.fOutxCtsFlow = TRUE;
      myDCB.fRtsControl = RTS_CONTROL_HANDSHAKE;
    }
  else
    {
      myDCB.fOutxCtsFlow = FALSE;
    }
  myDCB.BaudRate = baud;
  myDCB.DCBlength = sizeof(DCB);
  myDCB.fBinary = 1;
  myDCB.fParity = 0;
  myDCB.fDtrControl = DTR_CONTROL_DISABLE;
  myDCB.fDsrSensitivity = 0;
  myDCB.fTXContinueOnXoff = 1;
  myDCB.fNull = 0;
  myDCB.fRtsControl = RTS_CONTROL_DISABLE;
  myDCB.fDummy2 = 0;
  myDCB.wReserved = 0;
  myDCB.Parity = NOPARITY;
  myDCB.StopBits = ONESTOPBIT;
  myDCB.wReserved1 = 0;
  myDCB.ByteSize = 8;

  if (!SetCommState(Comport,&myDCB)) {
      ShowLastError();
      return FALSE;
  }

  CTout.ReadIntervalTimeout = 0xffffffff;
  CTout.ReadTotalTimeoutMultiplier = 0;
  CTout.ReadTotalTimeoutConstant = 0;
  CTout.WriteTotalTimeoutMultiplier = 0;
  CTout.WriteTotalTimeoutConstant = 5000;
  SetCommTimeouts(Comport,&CTout);
  EscapeCommFunction(Comport,SETDTR);
  PurgeComm(Comport,PURGE_TXCLEAR | PURGE_RXCLEAR);
  handle = hwnd;
  SerialPort = Comport;
  StartCommThread();
  return TRUE;
}
void CloseSerialPort(void)
{
  if (!SerialPort) return;
  if (Thread)
    {
      StopThread = TRUE;
      WaitForSingleObject(Thread,2000);
      CloseHandle(Thread);
      Thread = NULL;
      StopThread = FALSE;
    }
  PurgeComm(SerialPort,PURGE_TXCLEAR | PURGE_RXCLEAR);
  CloseHandle(SerialPort);
  SerialPort = NULL;
}
void PutSerialChar(int c)
{
  int Cnt;
  DWORD ModemStat;
  DWORD ticks;
  int Cts=1;
  ticks = GetTickCount();
  if (FlowControl)
    {
      while (Cts)
        {
          if (!GetCommModemStatus(SerialPort, &ModemStat))
            {
              ShowLastError();
              return;
            }
          Cts = !(ModemStat & MS_CTS_ON);
          if (GetTickCount() > ticks + 1000)
            break;
        }
    }
  WriteFile(SerialPort,&c,1,(LPDWORD)&Cnt,NULL);
}
HANDLE StartCommThread(void)
{
  int ThreadID;
  StopThread = FALSE;
  Thread = CreateThread(NULL,4096,ThreadProc,SerialPort,0,(LPDWORD)&ThreadID);
  return Thread;
}
DWORD WINAPI ThreadProc(void *p)
{
  int Cnt;
  char buf[256];
  if (!handle)
    return 0;
  for(;;)
    {
      if (ReadFile(SerialPort,&buf,255,(LPDWORD)&Cnt,NULL) && Cnt)
        {
          SendMessage(handle,MESS_SERIAL,(unsigned int)Cnt,(unsigned long)buf);
        }
      else
        Sleep(50);
      
      if (StopThread)
        break;
    }
  return 0;
}
int SerialPortIsOpen(void)
{
  if (SerialPort)
    return TRUE;
  return FALSE;
}
BOOL SerialIsChar(void)
{
  int Cnt,Avail,Remain;
  int buf;
  PeekNamedPipe(SerialPort, (LPVOID)&buf, (DWORD) 1, (LPDWORD)&Cnt,(LPDWORD)&Avail, (LPDWORD)&Remain);
  if (Avail)
    return TRUE;
  return FALSE;
}
int SerialGetChar(void)
{
  char ch;
  int Cnt;
  if (!SerialPort)
    return EOF;
  ReadFile(SerialPort,&ch,1,(LPDWORD)&Cnt,NULL);
  if (!Cnt)
    return EOF;
  return (int) ch;
}
Re[2]: Прошу помочь в объединении двух простых приложений в
От: ZoltriX  
Дата: 11.12.09 14:37
Оценка:
Здравствуйте, ASMelancholy, Вы писали:

ASM>В исходниках терминалки есть файлик serail.c — в нем и есть код работы с ком портом, только он уж очень корявый.

ASM>Исходники блокнота даже не смотрел — судя по всему это и не надо.
ASM>Вот код программы (проверить не могу — нет термопечи и вообще нет ком порта)

ASM>[ccode]#include <windows.h>

ASM>#define MESS_SERIAL (WM_USER+1)

ASM>LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

ASM>BOOL OpenPort(int port,int baud,int HwFc, HWND handle);

ОГРОМНОЕ спасибо за суету!
Уже немного с опозданием — я уже сделал там нужное окно и вывод данных.
Всё работает.
Всё одно спасибо за помощь.
У меня возчасто возникает много мелких вопросов — если не тяжело давайте по аське я буду с Вами советоваться.
Моя — 218774540, Сергей
Re[3]: Прошу помочь в объединении двух простых приложений в
От: x64 Россия  
Дата: 11.12.09 15:59
Оценка: :))
ZX>У меня часто возникает много мелких вопросов — если не тяжело давайте по аське я буду с Вами советоваться.

24 часа в сутки любой участник форума RSDN к твоим услугам, совершенно бесплатно мы консультируем любого желающего по несколько часов подряд, и даже без перерывов на обед.
Re[4]: Прошу помочь в объединении двух простых приложений в
От: Lonely Dog Россия  
Дата: 16.12.09 15:50
Оценка:
Здравствуйте, x64, Вы писали:

ZX>>У меня часто возникает много мелких вопросов — если не тяжело давайте по аське я буду с Вами советоваться.


x64>24 часа в сутки любой участник форума RSDN к твоим услугам, совершенно бесплатно мы консультируем любого желающего по несколько часов подряд, и даже без перерывов на обед.

Не будьте таким злым.
Это отбивает у новичков охоту задавать вопросы.
Re[5]: Прошу помочь в объединении двух простых приложений в
От: x64 Россия  
Дата: 16.12.09 18:31
Оценка: :)
LD>Это отбивает у новичков охоту задавать вопросы.

Именно этого мы и добиваемся. Ты разве ещё не понял, что мы здесь воспитанием занимаемся?
Re[6]: Прошу помочь в объединении двух простых приложений в
От: Lonely Dog Россия  
Дата: 17.12.09 12:34
Оценка:
Здравствуйте, x64, Вы писали:

x64>Именно этого мы и добиваемся. Ты разве ещё не понял, что мы здесь воспитанием занимаемся?

Дык а чего ты хочешь то в итоге?
Чтобы на форуме было 10-20 опытных людей, а новички ушли?
Лично мне это не нужно.
Re[7]: Прошу помочь в объединении двух простых приложений в
От: Lonely Dog Россия  
Дата: 17.12.09 12:35
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

LD>Здравствуйте, x64, Вы писали:


x64>>Именно этого мы и добиваемся. Ты разве ещё не понял, что мы здесь воспитанием занимаемся?

LD>Дык а чего ты хочешь то в итоге?
LD>Чтобы на форуме было 10-20 опытных людей, а новички ушли?
LD>Лично мне это не нужно.
С другой стороны, согласен, что изначальный вопрос был не совсем интересным
Re[9]: Прошу помочь в объединении двух простых приложений в
От: игппук Беларусь  
Дата: 17.12.09 15:15
Оценка:
Здравствуйте, ZoltriX, Вы писали:

ZX>Я то и сам на месте не сижу, я пытаюсь создать Edit-окно и пытаться туда что-то вывести.

ZX>Но уже при создании окна имею возвращаемое значение = 0.
ZX>Тоесть нихрена не создаётся. А понять не могу.... (((

для того, чтобы тебе помогли, пиши конкретные примеры. что именно пытаешься сделать и что именно у тебя не выходит? с пачками кода естесственно. а там видно будет. может так оказаться, что на самом деле ты вообще ничего не пытаешься сделать.
проклятый антисутенерский закон
Re[8]: Прошу помочь в объединении двух простых приложений в
От: SaZ  
Дата: 17.12.09 15:37
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

LD>Здравствуйте, Lonely Dog, Вы писали:


LD>>Здравствуйте, x64, Вы писали:


x64>>>Именно этого мы и добиваемся. Ты разве ещё не понял, что мы здесь воспитанием занимаемся?

LD>>Дык а чего ты хочешь то в итоге?
LD>>Чтобы на форуме было 10-20 опытных людей, а новички ушли?
LD>>Лично мне это не нужно.
LD>С другой стороны, согласен, что изначальный вопрос был не совсем интересным

<offtop /> Дело не в уровне, а в том, как человек видит задачу и что он предпринимает для её решения. Всё это хорошо расписано ТУТ.
Негласный вывод (имхо): на форуме обитает много специалистов, как опытных, так и не очень, в том числе совсем начинающие. Если возникает проблема — её нужно пытаться решить, а не ждать халявы. И, если корректно поставить вопрос, пускай даже самый простой, показав, что ты сделал для его решения (тем самым минимально упростив рутинные операции для помогающих) — то тебе, скорее всего, помогут.

Применительно к ТС (имхо) — фраза "Прошу помочь в объединении двух простых приложений" подразумевает то, что человек что-то делал для решения своей задачи, но шёл не в ту сторону. И правы те, кто посоветовал ТС-у другой путь, а не решил за него задачу. Таким образом и ТС чему-то научился, и другим приятно, что они смогли кому-то облегчить жизнь. Гармония...
Re[7]: Прошу помочь в объединении двух простых приложений в
От: x64 Россия  
Дата: 17.12.09 18:14
Оценка:
LD>Дык а чего ты хочешь то в итоге?
LD>Чтобы на форуме было 10-20 опытных людей, а новички ушли?

Отнюдь! Я лишь хочу, чтобы поменьше было бегинерской ни кому не интересной ерунды. Чтобы вопросы участников были уникальными, и ответы на них такими же. Вот, например, вопросов по моей теме очень мало на этом форуме. Мне это не нравится, вот и всё. Если здесь будет меньше бегинеров с одними и теми же вопросами, то я буду только рад, потому что, возможно, это привлечёт сюда более опытных товарищей с других ресурсов.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.