有一个C的类:
//---------------------------------------------------------------------------
TComm::TComm(int is, int ir)
{
iSerial = is;
BaudRate = ir; Terminated = false; dwError = CE_FRAME|CE_IOE|CE_TXFULL|CE_RXPARITY|CE_RXOVER; CommOk = Initalize();
}
//---------------------------------------------------------------------------
TComm::~TComm()
{
Terminate();
}
//---------------------------------------------------------------------------
bool TComm::Initalize(void)
{
char *pSerial[] = {"COM1", "COM2", "COM3", "COM4" }; hCom = CreateFile( pSerial[iSerial - 1],
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL
); if (hCom == INVALID_HANDLE_VALUE)
{
MessageBox(NULL, (AnsiString(pSerial[iSerial - 1]) + "¶Ë¿Ú²»ÄÜ´ò¿ª!").c_str(), "´íÎó", MB_ICONSTOP|MB_OK);
return false;
}
else
{
if( ! SetupComm (hCom, RXQUEUE, TXQUEUE) )
{
MessageBox(NULL, "ÉèÖÃÊäÈëÊä³ö»º³åÇø³ö´í!", "´íÎó", MB_ICONSTOP|MB_OK );
return false;
} DCB dcb; if( ! GetCommState(hCom,&dcb) )
{
MessageBox(NULL, "»ñÈ¡¶Ë¿ÚDCB¿éÐÅÏ¢³ö´í!", "´íÎó", MB_ICONSTOP|MB_OK );
return false;
} dcb.BaudRate = BaudRate;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT; if ( ! SetCommState(hCom, &dcb) )
{
MessageBox (NULL, "ÉèÖö˿ÚDCB¿éÐÅÏ¢³ö´í!", "´íÎó", MB_ICONSTOP|MB_OK);
return false;
} if(! GetCommTimeouts(hCom, &timeOuts))
{
MessageBox (NULL, "GetCommTimeouts Error!", "´íÎó", MB_ICONSTOP|MB_OK);
return false;
} // Set Reading And Writing Timeout!
timeOuts.ReadIntervalTimeout = 0;
timeOuts.ReadTotalTimeoutMultiplier = 500;
timeOuts.ReadTotalTimeoutConstant = 0;
if(! SetCommTimeouts(hCom, &timeOuts))
{
MessageBox (NULL, "SetCommTimeouts Error!", "´íÎó", MB_ICONSTOP|MB_OK);
return false;
}
return true;
}
}
//---------------------------------------------------------------------------
void TComm::Terminate(void)
{
Terminated = TRUE;
Sleep(500);
PurgeComm(hCom,PURGE_RXABORT);
PurgeComm(hCom,PURGE_TXABORT);
PurgeComm(hCom,PURGE_RXCLEAR);
PurgeComm(hCom,PURGE_TXCLEAR); CloseHandle(hCom);
}
//---------------------------------------------------------------------------
//---------------Ïò¶Ë¿Ú·¢ËÍÊý¾Ý------------------------
void TComm::Send (BYTE cmdCode)
{
if (!CommOk)
return;
PurgeComm (hCom, PURGE_TXCLEAR); // Çå³ý·¢ËÍ»º³åÇø
if (WriteFile(hCom, &cmdCode, 1, &dwWrcn, NULL) == FALSE )
{
ClearError();
// ShowMessage ("д¶Ë¿Ú´íÎó") ;
}
// else
}
//---------------------------------------------------------------------------
//---------------¶Á¶Ë¿ÚÊý¾Ý------------------------
byte TComm::Recieve()
{
if (!CommOk)
return 0;
DWORD count(1);
byte key;
if (ReadFile(hCom, &key, 1, &count, NULL) == false)
{
ClearError();
// ShowMessage ("¶Á¶Ë¿Ú´íÎó") ;
}
return key;
}
//---------------------------------------------------------------------------
void TComm::ClearError()
{
( ClearCommError( hCom, &dwError, &comStat) <= 0 );
// ShowMessage("CLEAR FAILUER");
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
TComm::TComm(int is, int ir)
{
iSerial = is;
BaudRate = ir; Terminated = false; dwError = CE_FRAME|CE_IOE|CE_TXFULL|CE_RXPARITY|CE_RXOVER; CommOk = Initalize();
}
//---------------------------------------------------------------------------
TComm::~TComm()
{
Terminate();
}
//---------------------------------------------------------------------------
bool TComm::Initalize(void)
{
char *pSerial[] = {"COM1", "COM2", "COM3", "COM4" }; hCom = CreateFile( pSerial[iSerial - 1],
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL
); if (hCom == INVALID_HANDLE_VALUE)
{
MessageBox(NULL, (AnsiString(pSerial[iSerial - 1]) + "¶Ë¿Ú²»ÄÜ´ò¿ª!").c_str(), "´íÎó", MB_ICONSTOP|MB_OK);
return false;
}
else
{
if( ! SetupComm (hCom, RXQUEUE, TXQUEUE) )
{
MessageBox(NULL, "ÉèÖÃÊäÈëÊä³ö»º³åÇø³ö´í!", "´íÎó", MB_ICONSTOP|MB_OK );
return false;
} DCB dcb; if( ! GetCommState(hCom,&dcb) )
{
MessageBox(NULL, "»ñÈ¡¶Ë¿ÚDCB¿éÐÅÏ¢³ö´í!", "´íÎó", MB_ICONSTOP|MB_OK );
return false;
} dcb.BaudRate = BaudRate;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT; if ( ! SetCommState(hCom, &dcb) )
{
MessageBox (NULL, "ÉèÖö˿ÚDCB¿éÐÅÏ¢³ö´í!", "´íÎó", MB_ICONSTOP|MB_OK);
return false;
} if(! GetCommTimeouts(hCom, &timeOuts))
{
MessageBox (NULL, "GetCommTimeouts Error!", "´íÎó", MB_ICONSTOP|MB_OK);
return false;
} // Set Reading And Writing Timeout!
timeOuts.ReadIntervalTimeout = 0;
timeOuts.ReadTotalTimeoutMultiplier = 500;
timeOuts.ReadTotalTimeoutConstant = 0;
if(! SetCommTimeouts(hCom, &timeOuts))
{
MessageBox (NULL, "SetCommTimeouts Error!", "´íÎó", MB_ICONSTOP|MB_OK);
return false;
}
return true;
}
}
//---------------------------------------------------------------------------
void TComm::Terminate(void)
{
Terminated = TRUE;
Sleep(500);
PurgeComm(hCom,PURGE_RXABORT);
PurgeComm(hCom,PURGE_TXABORT);
PurgeComm(hCom,PURGE_RXCLEAR);
PurgeComm(hCom,PURGE_TXCLEAR); CloseHandle(hCom);
}
//---------------------------------------------------------------------------
//---------------Ïò¶Ë¿Ú·¢ËÍÊý¾Ý------------------------
void TComm::Send (BYTE cmdCode)
{
if (!CommOk)
return;
PurgeComm (hCom, PURGE_TXCLEAR); // Çå³ý·¢ËÍ»º³åÇø
if (WriteFile(hCom, &cmdCode, 1, &dwWrcn, NULL) == FALSE )
{
ClearError();
// ShowMessage ("д¶Ë¿Ú´íÎó") ;
}
// else
}
//---------------------------------------------------------------------------
//---------------¶Á¶Ë¿ÚÊý¾Ý------------------------
byte TComm::Recieve()
{
if (!CommOk)
return 0;
DWORD count(1);
byte key;
if (ReadFile(hCom, &key, 1, &count, NULL) == false)
{
ClearError();
// ShowMessage ("¶Á¶Ë¿Ú´íÎó") ;
}
return key;
}
//---------------------------------------------------------------------------
void TComm::ClearError()
{
( ClearCommError( hCom, &dwError, &comStat) <= 0 );
// ShowMessage("CLEAR FAILUER");
}
//---------------------------------------------------------------------------
解决方案 »
- TEdit控件KeyDown事件中回车的问题
- 如何求不规则边界图形的周长
- 测试
- 为什么存取长度不一样?
- 在C/S结构的数据库中大家用什么Grid来显示数据?还是DBGrid,DBGridEH吗?恐怕用连通数据库的方式不行吧?
- 在使用adoquery控件时,总提示出错???
- 如何利用Tquery组件和Tdbgrid修改数据?
- 缓存更新和事务有什么区别吗??如果有请高手解释一下!
- 我是个Delphi初学者,请大家指点我应该重哪方面学起。算法?数据结构?还是直接些个软件?见者有分。
- 怎样在两个进程窗体之间拖动可视组件
- 关于DELPHI4 之查询
- 用什么办法可以知道网上邻居里有哪些计算机和他们的ip地址呢
1.打开串口:代入串口号,返回串口名柄
function OpenCommPort(Port:Byte):THandle;
var
S : array [0..6] of char;
begin
BaudRate := Rate;
FillChar(S,7,0);
StrCopy(@S[0],'COM');
if Port>9 then begin
S[3]:=chr(Port div 10+48);
S[4]:=chr(Port mod 10+48);
end
else
S[3]:=chr(Port+48); Result := CreateFile(@S[0], GENERIC_READ or GENERIC_WRITE, 0, nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,
0);
end;
2。关闭串口:代入串口名柄
procedure CloseCommPort(hPort:THandle);
begin
if (hPort <> INVALID_HANDLE_VALUE) and (hPort <> 0) then
CloseHandle(hPort);
end;
3.读串口数据
Right := ReadFile(hPort,Buf,读多少字节 ,Num,@lpol);
if not Right and (GetLastError() = ERROR_IO_PENDING) then
Right := WaitForSingleObject(post_Event,TIMEOUT) = WAIT_OBJECT_0;
4.写数据到串口
Right := WriteFile(hPort,Buf,StrLen(Cmd),Num,@lpol);
Num := GetLastError();
if not Right and (Num = ERROR_IO_PENDING) then
Right := WaitForSingleObject(post_Event,TIMEOUT) = WAIT_OBJECT_0;在写读写函数很复杂,这里不够详细,想进一少了解,请邮
[email protected]