📄 tserial_event.cpp
字号:
if (hard_handshake)
{
dcb.fOutxDsrFlow = TRUE;
dcb.fOutxCtsFlow = TRUE;
dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
dcb.fDtrControl = DTR_CONTROL_HANDSHAKE;
}
else
{
dcb.fOutxDsrFlow = FALSE;
dcb.fOutxCtsFlow = FALSE;
/* */
dcb.fRtsControl = RTS_CONTROL_ENABLE;
dcb.fDtrControl = DTR_CONTROL_ENABLE;
/* * /
dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcb.fDtrControl = DTR_CONTROL_DISABLE;
/* */
}
/* OLD VERSION (modifies 2005-05-16)
dcb.fOutxCtsFlow = 0;
dcb.fOutxDsrFlow = 0;
dcb.fDtrControl = DTR_CONTROL_DISABLE;
dcb.fDsrSensitivity = 0;
dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcb.fOutX = 0;
dcb.fInX = 0;
*/
/* ----------------- misc parameters ----- */
dcb.fErrorChar = 0;
dcb.fBinary = 1;
dcb.fNull = 0;
dcb.fAbortOnError = 0;
dcb.wReserved = 0;
dcb.XonLim = 2;
dcb.XoffLim = 4;
dcb.XonChar = 0x13;
dcb.XoffChar = 0x19;
dcb.EvtChar = 0;
/* -------------------------------------------------------------------- */
serial_handle = CreateFile(port, GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
// opening serial port
ovReader.hEvent = serial_events[SIG_READER];
ovWriter.hEvent = serial_events[SIG_WRITER];
ovWaitEvent.hEvent = serial_events[SIG_MODEM_EVENTS];
if (serial_handle != INVALID_HANDLE_VALUE)
{
if (check_modem)
{
if(!SetCommMask(serial_handle, EV_RING | EV_RLSD))
erreur = 1;
}
else
{
if(!SetCommMask(serial_handle, 0))
erreur = 1;
}
// set timeouts
if(!SetCommTimeouts(serial_handle,&cto))
erreur = 2;
// set DCB
if(!SetCommState(serial_handle,&dcb))
erreur = 4;
}
else
erreur = 8;
}
else
erreur = 16;
/* --------------------------------------------- */
for (i=0; i<SERIAL_SIGNAL_NBR; i++)
{
if (serial_events[i]==INVALID_HANDLE_VALUE)
erreur = 32;
}
/* --------------------------------------------- */
if (erreur!=0)
{
CloseHandle(serial_handle);
serial_handle = INVALID_HANDLE_VALUE;
}
else
{
// start thread
thread_handle = (HANDLE) _beginthreadex(NULL,0,
(PBEGINTHREADEX_THREADFUNC) Tserial_event_thread_start,
this, 0, &threadid);
/*if (thread_handle==-1)
thread_handle=0; */
}
/* --------------------------------------------- */
return(erreur);
}
/* -------------------------------------------------------------------- */
/* --------------------- setManager --------------------- */
/* -------------------------------------------------------------------- */
void Tserial_event::setManager(type_myCallBack manager_arg)
{
manager = manager_arg;
}
/* -------------------------------------------------------------------- */
/* --------------------- setRxSize --------------------- */
/* -------------------------------------------------------------------- */
void Tserial_event::setRxSize(int size)
{
max_rx_size = size;
if (max_rx_size>SERIAL_MAX_RX)
max_rx_size = SERIAL_MAX_RX;
}
/* -------------------------------------------------------------------- */
/* --------------------- setManager --------------------- */
/* -------------------------------------------------------------------- */
char * Tserial_event::getDataInBuffer(void)
{
return(rxBuffer);
}
/* -------------------------------------------------------------------- */
/* --------------------- setManager --------------------- */
/* -------------------------------------------------------------------- */
int Tserial_event::getDataInSize(void)
{
return(received_size);
}
/* -------------------------------------------------------------------- */
/* --------------------- setManager --------------------- */
/* -------------------------------------------------------------------- */
void Tserial_event::dataHasBeenRead(void)
{
SetEvent(serial_events[SIG_READ_DONE]);
}
/* -------------------------------------------------------------------- */
/* ----------------------- getNbrOfBytes --------------------------- */
/* -------------------------------------------------------------------- */
int Tserial_event::getNbrOfBytes (void)
{
struct _COMSTAT status;
int n;
unsigned long etat;
n = 0;
if (serial_handle!=INVALID_HANDLE_VALUE)
{
ClearCommError(serial_handle, &etat, &status);
n = status.cbInQue;
}
return(n);
}
/* -------------------------------------------------------------------- */
/* -------------------------- sendData ------------------------- */
/* -------------------------------------------------------------------- */
void Tserial_event::sendData (char *buffer, int size)
{
if ((!tx_in_progress) && (size<SERIAL_MAX_TX) && (buffer!=0))
{
tx_in_progress = 1;
memcpy(txBuffer, buffer, size);
tx_size = size;
SetEvent(serial_events[SIG_DATA_TO_TX]);
// indicating data to be sent
}
}
/* -------------------------------------------------------------------- */
/* -------------------------- OnEvent ------------------------- */
/* -------------------------------------------------------------------- */
void Tserial_event::OnEvent (unsigned long events)
{
unsigned long ModemStat;
GetCommModemStatus(serial_handle, &ModemStat);
if ((events & EV_RING)!=0)
{
if ((ModemStat & MS_RING_ON)!= 0)
{
if (manager!=0)
manager((uint32) this, SERIAL_RING);
}
}
if ((events & EV_RLSD)!=0)
{
if ((ModemStat & MS_RLSD_ON)!= 0)
{
if (manager!=0)
manager((uint32) this, SERIAL_CD_ON);
}
else
{
if (manager!=0)
manager((uint32) this, SERIAL_CD_OFF);
}
}
}
/* -------------------------------------------------------------------- */
/* -------------------------- run ------------------------- */
/* -------------------------------------------------------------------- */
/**
this function is the main loop of the Tserial object. There is a
do while() loop executed until either an error or a PowerDown is
received.
this is not a busy wait since we use the WaitForMultipleObject function
*/
/* * /
#define DEBUG_EVENTS
/* */
void Tserial_event::run(void)
{
bool done;
long status;
unsigned long read_nbr, result_nbr;
char success;
ready = true;
done = false;
tx_in_progress = 0;
rx_in_progress = 0;
WaitCommEventInProgress = 0;
if (manager!=0)
manager((uint32) this, SERIAL_CONNECTED);
GetLastError(); // just to clear any pending error
SetEvent(serial_events[SIG_READ_DONE]);
if (check_modem)
SetEvent(serial_events[SIG_MODEM_CHECKED]);
/* ----------------------------------------------------------- */
while(!done)
{
/* ------------------------------------------------------------------ */
/* */
/* */
/* */
/* Waiting for signals */
/* */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -