//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
HANDLE hComm;
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if(hComm!=INVALID_HANDLE_VALUE) CloseHandle(hComm);
exit(EXIT_SUCCESS);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char *ComNo;
DCB dcb;
String Temp;
//取得要打開的通信端
Temp="COM3";
//轉換至指標型別char
ComNo=Temp.c_str();
hComm=CreateFile(ComNo,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);
if(hComm==INVALID_HANDLE_VALUE)//如果通信端沒有打開
{
MessageBox(0,"打開通信埠錯誤!!","Comn Error",MB_OK);
return;
}//將dcbd地址傳入,以取得通信引數
else MessageBox(0,"打開通信埠成功。","Comn connect",MB_OK);
}
//---------------------------------------------------------------------------
uj5u.com熱心網友回復:
會不會是com的名字,試試:\\.\COM3
uj5u.com熱心網友回復:
類里邊去看看怎么定義的uj5u.com熱心網友回復:
//---------------------------------------------------------------------------#ifndef CommH
#define CommH
//---------------------------------------------------------------------------
#include <Classes.hpp>
class CComm
{
private:
HANDLE hComm;
bool InitComm( int iBaudRate ) ;
bool SendMsg( Byte *bteMsg ) ;
public:
CComm() ;
~CComm() ;
bool Initialize( int iComPort ,int iBaudRate ) ;
bool Initialize( AnsiString sComm , DCB dcbComm ) ;
void CloseComm() ;
bool SendMsg( Byte *buf ,DWORD iCount ) ;
bool ReadMsg( BYTE *buf ,DWORD &dwCount ) ;
bool ClearInBuf() ;
};
#endif
/******************************************************
Comm.cpp
實作串口通訊的類,用于收發二進制資料
******************************************************/
//---------------------------------------------------------------------------
#pragma hdrstop
#include "Comm.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
CComm::CComm()
{
hComm = NULL ;
}
CComm::~CComm()
{
if ( hComm ) CloseHandle( hComm ) ;
}
/*******************************************************
function::
打開串口,并且設定通訊引數,如果失敗,則關閉串口
Input:
iComm:有效串口埠,如:COM1則輸入1
iBaudRate:有效的波特率
Operate:
1、打開串口,成功的話則繼續初始化串口,
2、如果失敗則把串口關閉
Output:
成功則回傳TURE,否則回傳FALSE
Public Value:
hComm
GodAndDog 2003-5-8
*******************************************************/
bool CComm::Initialize( int iComPort ,int iBaudRate )
{
AnsiString strComm ;
strComm = "COM" + IntToStr( iComPort ) ;
hComm = CreateFile( strComm.c_str(),GENERIC_READ | GENERIC_WRITE
,0 ,NULL ,OPEN_EXISTING ,0 ,NULL );
if ( hComm )
{
if( InitComm( iBaudRate ) )
{
return true ;
}
}
if ( hComm )
{
CloseComm();
}
return false ;
}
/*******************************************************
function::
針對打開的串口設定通訊引數
Input:
iBaudRate:有效的波特率
Operate:
設定iBaudRate,8,n,1,二進制方式
Output:
成功則回傳TURE,否則回傳FALSE
Public:
None
GodAndDog 2003-5-8
*******************************************************/
bool CComm::InitComm( int iBaudRate )
{
//==============================
DCB dcbComm ;
//==============================
ZeroMemory( &dcbComm ,sizeof( dcbComm ));
dcbComm.DCBlength = sizeof( dcbComm ) ;
dcbComm.fBinary = true ;
dcbComm.BaudRate = iBaudRate ;
dcbComm.ByteSize = 8 ;
dcbComm.Parity = NOPARITY ;
dcbComm.StopBits = ONESTOPBIT;
return ( SetCommState( hComm ,&dcbComm ) ) ;
}
bool CComm::Initialize( AnsiString sComm ,DCB dcbComm )
{
hComm = CreateFile( sComm.c_str(),GENERIC_READ | GENERIC_WRITE
,0 ,NULL ,OPEN_EXISTING ,0 ,NULL );
if ( hComm )
{
if( SetCommState( hComm ,&dcbComm ) )
{
return true ;
}
}
if ( hComm )
{
CloseHandle( hComm ) ;
}
return false ;
}
bool CComm::SendMsg( Byte *buf ,DWORD iCount )
{
return WriteFile( hComm ,buf,iCount,&iCount,NULL);
}
void CComm::CloseComm()
{
if( hComm )
{
CloseHandle( hComm ) ;
hComm = NULL ;
}
}
bool CComm::ReadMsg( BYTE *buf ,DWORD &dwCount)
{
//=====================
COMSTAT ComStat ;
DWORD dwErrorFlags ;
//=====================
memset( buf ,0 ,dwCount ) ;
ClearCommError( hComm ,&dwErrorFlags,&ComStat ) ;
if( dwCount > ComStat.cbInQue )
{
dwCount = ComStat.cbInQue ;
}
return ReadFile(hComm,buf,dwCount,&dwCount,NULL) ;
}
bool CComm::ClearInBuf()
{
return PurgeComm( hComm ,PURGE_RXCLEAR );
}
uj5u.com熱心網友回復:
應該不能直接--->Temp="COM3";uj5u.com熱心網友回復:
Temp="COM3";這一句錯了你這么編譯也能過?
應該是 3
你看看類的資料型別定義是什么
先用串口精靈測驗你串口功能是否正常
然后再確定是不是自己程式問題
uj5u.com熱心網友回復:
打開串口,實際是訪問的檔案路徑,所以通常是這樣訪問 "\\\\.COM1\\",這樣對于10以上的埠號依舊可以打開。否則,就會出現10以上的埠不能打開 的現象。AnsiString strCom = "\\\\.COM1\\";
CreateFile....
uj5u.com熱心網友回復:
結貼率0%
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/77370.html
標籤:VCL組件使用和開發
上一篇:CB10開發安卓第一步已實作
下一篇:C語言取亂數,幾次之后就不隨機了
