Ты чо, по байту чтоль читаешь? Все люди процесс приема и передачи делают threadами. см MSDN что-то типа Simple com example.
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено goshka 18 марта 2003 г. 19:38
В ответ на: Ответ: вот он отправлено WM 18 марта 2003 г. 17:24


Ну да, и ресурс процессора можно экономить WaitCommEvent (hPort, &dwCommModemStatus, 0); Тож exampl...

DWORD WINAPI PortReadThread (LPVOID lpvoid)
{ static char rxbuf[MAX_BUF_SIZE];
static char inbuf[MAX_BUF_SIZE];
int inbuf_empty=1;
char *inbuf_ptr;
DWORD dwCommModemStatus, dwBytesTransferred;
DWORD i;

inbuf_ptr= inbuf;
SetCommMask (hPort, EV_RXCHAR ); // Specify a set of events to be monitored for the port.
while (hPort != INVALID_HANDLE_VALUE)
{COMSTAT comStat;
DWORD dwErrors;
ClearCommError(hPort, &dwErrors, &comStat);
WaitCommEvent (hPort, &dwCommModemStatus, 0); // Wait for an event to occur for the port.
SetCommMask (hPort, EV_RXCHAR | EV_ERR); // Re-specify the set of events to be monitored for the port.
while(1)
{ClearCommError(hPort, &dwErrors, &comStat);
if(dwErrors){inbuf_ptr= inbuf; inbuf_empty=1;break;}
ReadFile (hPort, rxbuf, 0x400, &dwBytesTransferred, 0); // Loop while waiting for the data. Read the data from the serial port.
if(!dwBytesTransferred) break;
rxbuf[dwBytesTransferred]=0;
rxbuf[dwBytesTransferred+1]=0;
for (i=0;i < dwBytesTransferred;i++)
{//_PortWrite (rxbuf[i]);
switch(rxbuf[i])
{case 0x0a:
case 0x0d:
case 0x00: if(!inbuf_empty && !Form1->CheckBox2->Checked)
{*inbuf_ptr=0x0a;*(++inbuf_ptr)=0x0d;memset(++inbuf_ptr,0,50);
if(logfile!= NULL)
{fprintf(logfile,"%s",inbuf);fflush(logfile);}
rx_count++;pronouncement_walkthrough(inbuf, 0);}
inbuf_ptr= inbuf;
inbuf_empty=1;
break;
default: inbuf_empty=0;
*inbuf_ptr= rxbuf[i];
*(++inbuf_ptr)=0;
if((inbuf_ptr- inbuf) >= 0x800){inbuf_ptr= inbuf; inbuf_empty=1;}
break;
} } }
}
ExitThread(0);
return 0;
}
/***********************************************************************
PortInitialize (LPTSTR lpszPortName)
***********************************************************************/
BOOL PortInitialize (LPTSTR lpszPortName, DWORD baud)
{DWORD dwThreadID;
COMMTIMEOUTS CommTimeouts;
DCB PortDCB;
DWORD err_code;
char str[256];
PortClose ();
hPort = CreateFile (lpszPortName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); // Handle to port with attribute to copy
if ( hPort == INVALID_HANDLE_VALUE )
{err_code= GetLastError(); sprintf(str,"Unable to open the port. Сведения:( %x)", err_code);
ShowMessage(str); PortClose ();return FALSE;}
PortDCB.DCBlength = sizeof (DCB); // sizeof(DCB)
GetCommState (hPort, &PortDCB);
PortDCB.BaudRate = baud; // Current baud rate
PortDCB.fBinary = FALSE; // Binary mode, no EOF check
PortDCB.fParity = FALSE; // Enable parity checking
PortDCB.fOutxCtsFlow = FALSE; // No CTS output flow control
PortDCB.fOutxDsrFlow = FALSE; // No DSR output flow control
PortDCB.fDtrControl = DTR_CONTROL_DISABLE;// DTR flow control type
PortDCB.fDsrSensitivity = FALSE; // DSR sensitivity
PortDCB.fTXContinueOnXoff = FALSE; // XOFF continues Tx
PortDCB.fOutX = FALSE; // No XON/XOFF out flow control
PortDCB.fInX = FALSE; // No XON/XOFF in flow control
PortDCB.fErrorChar = FALSE; // Disable error replacement
PortDCB.fNull = FALSE; // Disable null stripping
PortDCB.fRtsControl = RTS_CONTROL_DISABLE;// RTS flow control
PortDCB.fAbortOnError = FALSE; // Do not abort read/write on error
PortDCB.XonLim=4; // Transmit X-ON threshold
PortDCB.XoffLim=16; // Transmit X-OFF threshold
PortDCB.ByteSize = 8; // Number of bits/byte, 4-8
PortDCB.Parity = NOPARITY; // 0-4=no,odd,even,mark,space
PortDCB.StopBits = ONESTOPBIT; // 0,1,2 = 1, 1.5, 2
PortDCB.XonChar=0x11; // Tx and Rx X-ON character
PortDCB.XoffChar=0x13; // Tx and Rx X-OFF character
if (!SetCommState (hPort, &PortDCB))
{err_code= GetLastError();
sprintf(str,"%s(Не устанавливается DCB) %x", _KERNEL_FAULT, err_code);
ShowMessage(str); PortClose (); return FALSE;
}

GetCommTimeouts (hPort, &CommTimeouts);

CommTimeouts.ReadIntervalTimeout = 500;
CommTimeouts.ReadTotalTimeoutMultiplier = 0;
CommTimeouts.ReadTotalTimeoutConstant = 1;
CommTimeouts.WriteTotalTimeoutMultiplier = 0;
CommTimeouts.WriteTotalTimeoutConstant = 1000;

if (!SetCommTimeouts (hPort, &CommTimeouts))
{err_code= GetLastError();
sprintf(str,"%s(Не устанавливается DCB) Сведения:( %x)", _KERNEL_FAULT, err_code);
ShowMessage(str); PortClose ();return FALSE;
}

EscapeCommFunction (hPort, SETDTR);
EscapeCommFunction (hPort, SETRTS);

if ((hReadThread= CreateThread (NULL, 0, PortReadThread, NULL, 0, &dwThreadID))==NULL)
{err_code= GetLastError();
sprintf(str,"%s(Не не создаетяс Thread Rs232) Сведения:( %x)", _KERNEL_FAULT, err_code);
ShowMessage(str); PortClose (); return FALSE;}
return TRUE;
}



Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru