link2414 link2415 link2416 link2417 link2418 link2419 link2420 link2421 link2422 link2423 link2424 link2425 link2426 link2427 link2428 link2429 link2430 link2431 link2432 link2433 link2434 link2435 link2436 link2437 link2438 link2439 link2440 link2441 link2442 link2443 link2444 link2445 link2446 link2447 link2448 link2449 link2450 link2451 link2452 link2453 link2454 link2455 link2456 link2457 link2458 link2459 link2460 link2461 link2462 link2463 link2464 link2465 link2466 link2467 link2468 link2469 link2470 link2471 link2472 link2473 link2474 link2475 link2476 link2477 link2478 link2479 link2480 link2481 link2482 link2483 link2484 link2485 link2486 link2487 link2488 link2489 link2490 link2491 link2492 link2493 link2494 link2495 link2496 link2497 link2498 link2499 link2500 link2501 link2502 link2503 link2504 link2505 link2506 link2507 link2508 link2509 link2510 link2511 link2512 link2513 link2514 link2515 link2516 link2517 link2518 link2519 link2520 link2521 link2522 link2523 link2524 link2525 link2526 link2527 link2528 link2529 link2530 link2531 link2532 link2533 link2534 link2535 link2536 link2537 link2538 link2539 link2540 link2541 link2542 link2543 link2544 link2545 link2546 link2547 link2548 link2549 link2550 link2551 link2552 link2553 link2554 link2555

Форум — Ответы     (  К темам )
 ?  _Владимир_: Модуль для работы с COM-портом. (21-05-2003 16:50:59)
Вот h и c++ файлы, которые образуют модуль для работы
с COM-портом. Написал я это на API под VisualC++.
Это можно без труда портировать в Builder.

//**** h file********************************************

typedef struct _COM_ST
{
BYTE parity;
BYTE stop_bits;
BYTE byte_size;
DWORD baud;
BYTE num;
}COM_ST;

class CCom
{
COMMTIMEOUTS timeouts;
DWORD dws;
COMMCONFIG commcon;
HANDLE hCom;
public:
bool IsOpen();
void Escape(DWORD func);
BOOL Write(BYTE *s, BYTE len);
BOOL Read(BYTE *s, WORD len);
void Purge();
void Destroy();
BOOL Create(COM_ST &st);
CCom();
virtual ~CCom();

private:
void DtrHigh();
void DtrLow();
void RtsHigh();
void RtsLow();
BYTE num;
bool opened;
};

//**** C++ file********************************************
#include "stdafx.h"
#include "Com.h"


#define MAX_RX_BUF_SIZE 12000
#define MAX_TX_BUF_SIZE 2048
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CCom::CCom()
{
hCom=0;
opened=false;
}

CCom::~CCom()
{

}

BOOL CCom::Create(COM_ST &st)
{
if(true==opened) return FALSE;

char str[5];
switch(st.num)
{
case 1: num=1; strcpy(str, "COM1"); break;
case 2: num=2; strcpy(str, "COM2"); break;
default: return FALSE;
}

hCom=::CreateFile(str,
GENERIC_WRITE|GENERIC_READ,
NULL,
NULL,
OPEN_EXISTING,
0,
NULL);
//----------------------------------------------
if(hCom==INVALID_HANDLE_VALUE)
{ DWORD dwErr=GetLastError(); return FALSE; }
//--------Test for capability--------------------
COMMPROP CommProp;
BOOL m_Bool=GetCommProperties(hCom, &CommProp);
if(FALSE==m_Bool)
{ CloseHandle(hCom); return FALSE; }

if(PST_RS232!=CommProp.dwProvSubType)
{ CloseHandle(hCom); return FALSE; }
if((PCF_INTTIMEOUTS|PCF_TOTALTIMEOUTS)!=
(CommProp.dwProvCapabilities&
(PCF_INTTIMEOUTS|PCF_TOTALTIMEOUTS)))
{ CloseHandle(hCom); return FALSE; }
if((SP_BAUD|SP_DATABITS|SP_HANDSHAKING|SP_PARITY|
SP_PARITY_CHECK|SP_RLSD|SP_STOPBITS)!=
(CommProp.dwSettableParams&
(SP_BAUD|SP_DATABITS|SP_HANDSHAKING|SP_PARITY|
SP_PARITY_CHECK|SP_RLSD|SP_STOPBITS)))
{ CloseHandle(hCom); return FALSE; }
if(DATABITS_8!=(CommProp.wSettableData&DATABITS_8))
{ CloseHandle(hCom); return FALSE; }
if((STOPBITS_10|PARITY_NONE)!=
(CommProp.wSettableStopParity&
(STOPBITS_10|PARITY_NONE)))
{ CloseHandle(hCom); return FALSE; }

if(st.baud>CommProp.dwMaxBaud)
{ CloseHandle(hCom); return FALSE; }
if(!(st.baud&CommProp.dwSettableBaud))
{ CloseHandle(hCom); return FALSE; }


//Buffer size------------------------------------
SetupComm(hCom, MAX_RX_BUF_SIZE, MAX_TX_BUF_SIZE);



//--------SetCommConfig--------------------------
COMMCONFIG local_commcon;
DWORD local_dws;
GetCommConfig(hCom, &local_commcon, &local_dws);
GetCommConfig(hCom, &commcon, &dws);


local_commcon.dwProviderSubType =PST_RS232;
local_commcon.dcb.BaudRate =st.baud;
if(NOPARITY==st.parity)
local_commcon.dcb.fParity=FALSE;
else
local_commcon.dcb.fParity=TRUE;


local_commcon.dcb.fOutX =FALSE;
local_commcon.dcb.fInX =FALSE;
local_commcon.dcb.fOutxCtsFlow =FALSE;
local_commcon.dcb.fOutxDsrFlow =FALSE;
local_commcon.dcb.fDtrControl =DTR_CONTROL_DISABLE;
local_commcon.dcb.fRtsControl =RTS_CONTROL_DISABLE;
local_commcon.dcb.fOutxCtsFlow =FALSE;
local_commcon.dcb.fOutxDsrFlow =FALSE;
local_commcon.dcb.fDsrSensitivity =FALSE;
local_commcon.dcb.ByteSize =st.byte_size;
local_commcon.dcb.Parity =st.parity;
local_commcon.dcb.StopBits =st.stop_bits;

SetCommConfig(hCom, &local_commcon, local_dws);

//---------COM TimeOuts------------------------------

COMMTIMEOUTS local_timeouts;
GetCommTimeouts(hCom, &local_timeouts);
GetCommTimeouts(hCom, &timeouts);

local_timeouts.ReadIntervalTimeout=0;
local_timeouts.ReadTotalTimeoutMultiplier=10;
local_timeouts.ReadTotalTimeoutConstant=0;

SetCommTimeouts(hCom, &local_timeouts);

opened=true;

return TRUE;
}

void CCom::Destroy()
{
if((false==opened)||(0==hCom)) return;
SetCommConfig(hCom, &commcon, dws);
SetCommTimeouts(hCom, &timeouts);
CloseHandle(hCom);
opened=false;
}

void CCom::Purge()
{
PurgeComm(hCom, PURGE_TXCLEAR|PURGE_RXCLEAR);
}

BOOL CCom::Read(BYTE *s, WORD len)
{
if(!s) return FALSE;
if(!len) return TRUE;

DWORD dw;
BOOL m_Bool=::ReadFile(hCom, s, len, &dw, NULL);
if(len!=dw) m_Bool=FALSE;

return m_Bool;
}

BOOL CCom::Write(BYTE *s, BYTE len)
{
if(!s) return FALSE;
if(!len) return TRUE;

DWORD dw;
BOOL m_Bool=::WriteFile(hCom, s, len, &dw, NULL);
if(len!=dw) m_Bool=FALSE;

return m_Bool;
}


void CCom::Escape(DWORD func)
{
EscapeCommFunction(hCom, func);
}

void CCom::RtsLow()
{
EscapeCommFunction(hCom, CLRRTS);
}

void CCom::RtsHigh()
{
EscapeCommFunction(hCom, SETRTS);
}

void CCom::DtrLow()
{
EscapeCommFunction(hCom, CLRDTR);
}

void CCom::DtrHigh()
{
EscapeCommFunction(hCom, SETDTR);
}

bool CCom::IsOpen()
{
return opened;
}
 Георгий (21-05-2003 21:36:35)
спасибо за заботу о нуждающихся, но в FAQ вроде был какой — то обьект для работы с тем, что выглядит как RS 232. так же надо отметить отсутствие возможности настройти временных характеристик и присутствие приверки возможностей порта (до такой вещи я сам не додумался), но это разве не ухудшит переносимость обьекта?
 _Владимир_ (21-05-2003 22:28:01)
Конечно этот модуль не является универсальным
а поэтому удобным во всех случаях. Это код из
живой программы, заточенный на конкретику.
Ему далеко до универсального компонента.
Думаю что код только поможет разобраться
с тем как работать с портом.