Re[6]: Среда для разработки DOS-like программы под Windows
От: kov_serg Россия  
Дата: 14.03.24 11:16
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

CC>>Ему надо дать "рыбу", да хоть эту же, остальное он допишет сам.


PD>Именно. Но рыба на MFC лучше, чем на чистом WinAPI. По крайней мере мне так кажется.

Чистый WinAPI или MFC это слишком длинно и нудно. Но если сделать нормальный интерфейс то... рыба будет угрь

U++ https://www.ultimatepp.org/examples$ScatterCtrl_Demo$en-us.html
https://github.com/epezent/implot

// SerialPort.h
#pragma once

struct SerialPort {
    static SerialPort *create(const char* name,const char* prm=0);
    virtual void close()=0;
    virtual int invalid()=0;
    virtual int setup(const char* config)=0;
    virtual int set_dtr(bool dtr)=0;
    virtual int set_rts(bool dtr)=0;
    virtual int get_rxqueue()=0;
    virtual int read(void* data,int size)=0;
    virtual int write(void* data,int size)=0;
    virtual ~SerialPort() {}
};

  SerialPort.cpp
// SerialPort.cpp
#include "SerailPort.h"
#include <windows.h>

struct WinSerialPort : SerialPort {
    HANDLE handle;
    int open(const char* name,const char* prm) {
        close();
        handle=CreateFileA(name,GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
        return handle==INVALID_HANDLE_VALUE ? 1 : 0 ;
    }
    void close() {
        if (invalid()) return;
        CloseHandle(handle); handle=INVALID_HANDLE_VALUE;
    }
    int invalid() { return handle==INVALID_HANDLE_VALUE; }
    int setup(const char* config) {
        if (invalid()) return 1;
        DCB dcb[1]; ZeroMemory(dcb,sizeof(*dcb));
        dcb->DCBlength=sizeof(*dcb);
        // COMx[:][baud=b][parity=p][data=d][stop=s][to={on|off}][xon={on|off}][odsr={on|off}][octs={on|off}][dtr={on|off|hs}][rts={on|off|hs|tg}][idsr={on|off}]
        BOOL rv=BuildCommDCBA(config,dcb); if (!rv) return 2;
        rv=SetCommState(handle,dcb); if (!rv) return 3;
        #if 0
            COMMTIMEOUTS timeouts[1]; ZeroMemory(timeouts,sizeof(*timeouts));
            timeouts->ReadIntervalTimeout=100;        /* Maximum time between read chars. */
            timeouts->ReadTotalTimeoutMultiplier=10;  /* Multiplier of characters.        */
            timeouts->ReadTotalTimeoutConstant=100;   /* Constant in milliseconds.        */
            timeouts->WriteTotalTimeoutMultiplier=10; /* Multiplier of characters.        */
            timeouts->WriteTotalTimeoutConstant=100;  /* Constant in milliseconds.        */
            rv=SetCommTimeouts(handle,timeouts); if (!rc) return 4;
        #endif
        return 0;
    }
    int set_dtr(bool value) {
        if (invalid()) return 1;
        BOOL rv=EscapeCommFunction(handle, value ? SETDTR : CLRDTR);
        return rv ? 0 : 2;
    }
    int set_rts(bool value) {
        if (invalid()) return 1;
        BOOL rv=EscapeCommFunction(handle, value ? SETRTS : CLRRTS);
        return rv ? 0 : 2;
    }
    int get_rxqueue() {
        if (invalid()) return 0;
        DWORD Errors=0; COMSTAT stat[1];
        BOOL rv=ClearCommError(handle,&Errors,stat);
        return rv ? stat->cbInQue : 0;
    }
    int read(void* data,int size) {
        if (invalid()) return 0;
        DWORD rd=0;
        BOOL rv=ReadFile(handle,data,size,&rd,0);
        return rd;
    }
    int write(void* data,int size) {
        if (invalid()) return 0;
        DWORD wr=0;
        BOOL rv=WriteFile(handle,data,size,&wr,0);
        return wr;
    }
    WinSerialPort() {
        handle=INVALID_HANDLE_VALUE;
    }
    ~WinSerialPort() {
        close();
    }
};

SerialPort* SerialPort::create(const char* name,const char* prm) {
    WinSerialPort *port=new WinSerialPort();
    int res=port->open(name,prm);
    if (prm) port->setup(prm);
    return port;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.