Разработка, производство и продажа радиоэлектронной аппаратуры
|
Требуется программист в Зеленограде - обработка данных с датчиков; ColdFire; 40 тыс.
e-mail: jobsmp@pochta.ru
|
Ответ: (+)
Отправлено
ETM 14 января 2008 г. 00:37
В ответ на:
Builder C++ и COM порт отправлено
<font color=gray>грин</font> 14 января 2008 г. 00:14
comport.cpp
----------------------------------------------------------------------
//////////////////////////////////////////////////////////////////////
#include "ComPort.h"
class CComPort
{
public:
CComPort();
virtual ~CComPort();
void PresetComParameters(DWORD baud,BYTE databits,BYTE parity,BYTE stopbits);
BOOL OpenCom(LPCTSTR lpPortName);
BOOL CloseCom();
BOOL GetByte(LPBYTE rByte,DWORD dwMilliseconds);
BOOL PutByte(BYTE wByte);
DWORD ReadBlock(LPBYTE lpBuffer,DWORD nMax);
BOOL WriteBlock(LPBYTE lpBuffer,DWORD dwBufferLength);
BOOL GetOpenedStatus(void);
protected:
HANDLE m_hCommPort;
BOOL m_bOpened;
DWORD m_Baud;
BYTE m_DataBits;
BYTE m_Parity;
BYTE m_StopBits;
};
//////////////////////////////////////////////////////////////////////
// CComPort class: com_port
//////////////////////////////////////////////////////////////////////
CComPort com_port;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CComPort::CComPort()
{
m_bOpened = FALSE;
m_Baud = CBR_9600;
m_DataBits = 8;
m_Parity = NOPARITY;
m_StopBits = ONESTOPBIT;
}
CComPort::~CComPort()
{
CloseCom();
}
void CComPort::PresetComParameters(DWORD baud,BYTE databits,BYTE parity,BYTE stopbits)
{
m_Baud = baud;
m_DataBits = databits;
m_Parity = parity;
m_StopBits = stopbits;
}
BOOL CComPort::OpenCom(LPCTSTR lpPortName)
{
if(m_bOpened) return FALSE; // we are already opened, so OpenCom failed
BOOL fSuccess;
DCB dcb;
m_hCommPort = CreateFile(lpPortName,
GENERIC_READ | GENERIC_WRITE,
0, // exclusive access
NULL, // no security attrs
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if(m_hCommPort == INVALID_HANDLE_VALUE) return FALSE; // OpenCom failed
// Setup new connection:
GetCommState(m_hCommPort, &dcb);
dcb.BaudRate = m_Baud;
dcb.ByteSize = m_DataBits;
dcb.Parity = m_Parity;
dcb.StopBits = m_StopBits;
dcb.fOutxDsrFlow = 0; // we don't need handshake
dcb.fDtrControl = 0;
dcb.fOutxCtsFlow = 0;
dcb.fRtsControl = 0;
dcb.fBinary = TRUE ;
dcb.fParity = TRUE ;
fSuccess = SetCommState(m_hCommPort, &dcb);
if(!fSuccess) return FALSE; // Can't SetCommState -- OpenCom failed
PurgeComm(m_hCommPort,PURGE_TXABORT | PURGE_RXABORT |
PURGE_TXCLEAR | PURGE_RXCLEAR ); // Clean up COM port
m_bOpened = TRUE;
return TRUE; // OpenCom OK
}
BOOL CComPort::CloseCom()
{
if(m_bOpened) {
m_bOpened = FALSE ;
PurgeComm(m_hCommPort,PURGE_TXABORT | PURGE_RXABORT |
PURGE_TXCLEAR | PURGE_RXCLEAR ); // Clean up COM port
CloseHandle(m_hCommPort) ;
}
return TRUE;
}
BOOL CComPort::WriteBlock(LPBYTE lpBuffer, DWORD dwBufferLength)
{
DWORD dwBytesWritten;
BOOL bResult;
if (!m_bOpened) return FALSE; // we are not connected
bResult = WriteFile(m_hCommPort,lpBuffer,dwBufferLength,&dwBytesWritten,NULL);
if(!bResult) return FALSE;
return TRUE;
}
DWORD CComPort::ReadBlock(LPBYTE lpBuffer,DWORD nMax)
{
BOOL fReadStat ;
COMSTAT ComStat ;
DWORD dwErrorFlags;
DWORD dwLength;
if(!m_bOpened) return (DWORD)-1; // we are not connected
// get number of bytes in queue
if (ClearCommError( m_hCommPort, &dwErrorFlags, &ComStat )) {
dwLength = min( (DWORD) nMax, ComStat.cbInQue ) ;
}
else {
dwLength=0;
}
if(dwLength > 0) {
fReadStat = ReadFile(m_hCommPort,lpBuffer,dwLength,&dwLength,NULL);
if(!fReadStat) {
dwLength = 0;
ClearCommError(m_hCommPort,&dwErrorFlags,&ComStat) ;
}
}
return dwLength;
}
#define SLEEP_TIME 5
BOOL CComPort::GetByte(LPBYTE rByte,DWORD dwMilliseconds)
{
BYTE byt;
DWORD pause_cnt;
pause_cnt = dwMilliseconds/SLEEP_TIME; // we pause in SLEEP_TIME milliseconds increment
while(1) {
if(ReadBlock(&byt,1) > 0) {
*rByte = byt;
return TRUE;
}
if(pause_cnt == 0) break;
Sleep(SLEEP_TIME);
pause_cnt--;
}
return FALSE;
}
BOOL CComPort::PutByte(BYTE wByte)
{
return WriteBlock(&wByte,1);
}
BOOL CComPort::GetOpenedStatus(void)
{
return m_bOpened;
}
//////////////////////////////////////////////////////////////////////
//
// User interface routines to ComPort class
//
//////////////////////////////////////////////////////////////////////
void ComPort_PresetParameters(DWORD baud,BYTE databits,BYTE parity,BYTE stopbits)
{
com_port.PresetComParameters(baud,databits,parity,stopbits);
}
BOOL ComPort_Open(char *name)
{
return com_port.OpenCom(name);
}
void ComPort_Close(void)
{
com_port.CloseCom();
}
BOOL ComPort_PutByte(BYTE byt)
{
return com_port.PutByte(byt);
}
int ComPort_GetByte(DWORD dwMilliseconds)
{
BYTE byt;
if(com_port.GetByte(&byt,dwMilliseconds))
return byt;
else
return -1;
}
BOOL ComPort_GetOpenedStatus(void)
{
return com_port.GetOpenedStatus();
}
---------------------------------------------------------------------
//////////////////////////////////////////////////////////////////////
// ComPort.h: interface for the CComPort class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(_COMPORT_H_)
#define _COMPORT_H_
#include <windows.h>
void ComPort_PresetParameters(DWORD baud,BYTE databits,BYTE parity,BYTE stopbits);
BOOL ComPort_Open(char *name);
void ComPort_Close(void);
BOOL ComPort_PutByte(BYTE byt);
int ComPort_GetByte(DWORD dwMilliseconds);
BOOL ComPort_GetOpenedStatus(void);
#endif // !defined(_COMPORT_H_)
Составить ответ | Вернуться на конференцию
Ответы