封装较完整的串口类库

发表于:2007-07-01来源:作者:点击数: 标签:
串口在工业应用是极为普遍的,我用API封装了同步和异步的串口类,以及一个具有监视线程的异步串口类;使用简单高效,具有工业强度,我在BC, BCB, VC, BCBX, G CC 下编译通过,相信足够应付大多数情况,而且还可以继承扩展,下面简单介绍使用方法; 库的层次


   串口在工业应用是极为普遍的,我用API封装了同步和异步的串口类,以及一个具有监视线程的异步串口类;使用简单高效,具有工业强度,我在BC, BCB, VC, BCBX, GCC下编译通过,相信足够应付大多数情况,而且还可以继承扩展,下面简单介绍使用方法;

库的层次结构:
  •   _base_com:虚基类,基本接口,可自行扩展自己的串口类;
  •   _sync_com:_base_com 的子类, 同步应用,适合简单应用;
  •   _asyn_com:_base_com 的子类, 异步应用(重叠I/O),适合较高效应用,NT平台;
  • _thread_com:_asyn_com 的子类, 异步应用,具有监视线程,适合较复杂应用,窗口通知消息和继承扩展的使用方式;


一些应用范例 :

  当然首先 #include "com_class.h"

一、打开串口1同步写

char str[] = "com_class test";
_sync_com com1; //同步
com1.open(1); // 相当于 com1.open(1, 9600);  com1.open(1, "9600,8,n,1");
for(int i=0; i<100; i++)
{
Sleep(500);
com1.write(str); //也可以 com1.write(str, strlen(str));
}
com1.close();

二、打开串口2异步读    

char str[100];
_asyn_com com2; //异步
com2.open(2); // 相当于 com2.open(2, 9600);  com2.open(2, "9600,8,n,1");
if(!com2.is_open())
cout << "COM2 not open , error : " << GetLastError() << endl;
/* 也可以如下用法
if(!com2.open(2))
cout << "COM2 not open , error : " << GetLastError() << endl;
*/
for(int i=0; i<100; i++)
{
Sleep(500);
if(com2.read(str, 100) > 0)//异步读,返回读取字符数
cout << str;
}
com2.close();

三、扩展应用具有监视线程的串口类

class _com_ex : public thread_com
{
public:
virtual on_receive()
{
char str[100];
if(read(str, 100) > 0)//异步读,返回读取字符数
cout << str;
}
};

int main(int argc, char *argv[])
{
try
{
char str[100];
_com_ex com2; //异步扩展
com2.open(2);
Sleep(10000);
com2.close();
}
catch(exception &e)
{
cout << e.what() << endl;
}
return 0;
}

四、桌面应用可发送消息到指定窗口(在C++ Builder 和 VC ++ 测试通过)

VC ++ 接受消息

BEGIN_MESSAGE_MAP(ComDlg, CDialog)
//{{AFX_MSG_MAP(ComDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_DESTROY()
//}}AFX_MSG_MAP
ON_MESSAGE(ON_COM_RECEIVE, On_Receive)
END_MESSAGE_MAP()

打开串口,传递窗口句柄

_thread_com com2;
com2.open(2);
com2.set_hwnd(ComDlg->m_hWnd);

处理消息

LRESULT ComDlg::On_Receive(WPARAM wp, LPARAM lp)
{
char str[100];
com2.read(str, 100);

char com_str[10];
strcpy(com_str, "COM");
ltoa((long)wp, com_str + 3, 10); // WPARAM 保存端口号

MessageBox(str, com_str, MB_OK);
return 0;
}

C++ Builder

class TForm1 : public TForm
{
__published: // IDE-managed Components
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
void __fastcall FormCreate(TObject *Sender);
private: // User declarations
public: // User declarations
void On_Receive(TMessage& Message);
__fastcall TForm1(TComponent* Owner);
_thread_com com2;
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(ON_COM_RECEIVE, TMessage, On_Receive)
END_MESSAGE_MAP(TForm)
};

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
com2.close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   com2.open(2);
   com2.set_hwnd(Handle);
}
//---------------------------------------------------------------------------
void  TForm1::On_Receive(TMessage& Message)
{
char xx[20];
int port = Message.WParam;
if(com2.read(xx, 20) > 0)
ShowMessage(xx);
}

错误和缺陷在所难免,欢迎来信批评指正;

原文转自:http://www.ltesting.net