VC串口通讯DLLWord文档下载推荐.docx
《VC串口通讯DLLWord文档下载推荐.docx》由会员分享,可在线阅读,更多相关《VC串口通讯DLLWord文档下载推荐.docx(25页珍藏版)》请在冰豆网上搜索。
_com_handle=CreateFile(
“\\\\.\\COM10“,//对应的就是\\.\COM10
线程中循环的低效率问题
使用SetCommMask(pcom->
_com_handle,EV_RXCHAREV_ERR)监视接受字符和错误消息;
一旦有个字符来就会激活WaitCommEvent通常作以下接受操作:
if(!
WaitCommEvent(pcom->
_wait_o))
{
if(GetLastError()==ERROR_IO_PENDING)
GetOverlappedResult(pcom->
_wait_o,&
length,true);
}
if(mask&
EV_ERR)//==EV_ERR
ClearCommError(pcom->
error,&
stat);
EV_RXCHAR)//==EV_RXCHAR
pcom->
on_receive();
//接收到字符
//或发送到窗口消息
这样频繁的函数调用或接受发送消息,效率低下,我添加扫描缓冲区的代码,当字符数超过设定的字符数才作接受字符的操作;
if(mask&
if(stat.cbInQue>
_notify_num)//_notify_num是设定得字符数
类似于流的输出方式
我编了一个简单的写串口的方式,可以类似于流将简单的数据类型输出
template<
typenameT>
_asyn_com&
operator<
<
(Tx)
strstreams;
s<
x;
write(s.str(),s.pcount());
return*this;
}
就可以这样使用
_sync_comcom1;
com1.open(1,9600);
com1<
“thenrandom()'
sreturnvalueis“<
rand()<
“.\n“;
com1.close();
本串口类库的主要接口
class_base_com
{
boolopen(intport);
boolopen(intport,intbaud_rate);
boolopen(intport,char*set_str);
//set_str:
“9600,8,n,1“
boolset_state(intBaudRate,intByteSize=8,intParity=NOPARITY,intStopBits=ONESTOPBIT)
//设置内置结构串口参数:
波特率,停止位
boolset_state(char*set_str)
boolis_open();
HANDLEget_handle();
virtualboolopen_port()=0;
//继承用的重要函数
virtualclose();
class_sync_com:
public_base_com//同步
intread(char*buf,intbuf_size);
//自动补上'
\0'
将用去一个字符的缓冲区
intwrite(char*buf,intlen);
intwrite(char*buf);
class_asyn_com:
public_base_com//异步
class_thread_com:
public_asyn_com//线程
virtualvoidon_receive()//供线程接受到字符时调用,可继承替换之
if(_notify_hwnd)
PostMessage(_notify_hwnd,ON_COM_RECEIVE,WPARAM(_port),LPARAM(0));
else
if(_func)
_func(_port);
voidset_hwnd(HWNDhwnd);
//设置窗口句柄,发送ON_COM_RECEIVEWM_USER+618
voidset_func(void(*f)(int));
//设置调用函数,窗口句柄优先
voidset_notify_num(intnum);
//设定发送通知,接受字符最小值
一些应用范例
当然首先#include"
_com.h"
一、打开串口1同步写
charstr[]="
com_classtest"
;
_sync_comcom1;
//同步
com1.open
(1);
//相当于com1.open(1,9600);
com1.open(1,"
9600,8,n,1"
);
for(inti=0;
i<
100;
i++)
Sleep(500);
com1.write(str);
//也可以com1.write(str,strlen(str));
com1.close();
二、打开串口2异步读
charstr[100];
_asyn_comcom2;
//异步
com2.open
(2);
//相当于com2.open(2,9600);
com2.open(2,"
if(!
com2.is_open())
cout<
"
COM2notopen,error:
<
GetLastError()<
endl;
/*
也可以如下用法
com2.open
(2))
*/
if(com2.read(str,100)>
0)//异步读,返回读取字符数
str;
com2.close();
三、扩展应用具有监视线程的串口类
class_com_ex:
publicthread_com
public:
virtualon_receive()
if(read(str,100)>
};
intmain(intargc,char*argv[])
try
_com_excom2;
//异步扩展
Sleep(10000);
catch(exception&
e)
e.what()<
return0;
四、桌面应用可发送消息到指定窗口(在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_comcom2;
com2.set_hwnd(ComDlg->
m_hWnd);
处理消息
LRESULTComDlg:
:
On_Receive(WPARAMwp,LPARAMlp)
com2.read(str,100);
charcom_str[10];
strcpy(com_str,"
COM"
ltoa((long)wp,com_str+3,10);
//WPARAM保存端口号
MessageBox(str,com_str,MB_OK);
C++Builder
classTForm1:
publicTForm
__published:
//IDE-managedComponents
void__fastcallFormClose(TObject*Sender,TCloseAction&
Action);
void__fastcallFormCreate(TObject*Sender);
private:
//Userdeclarations
voidOn_Receive(TMessage&
Message);
__fastcallTForm1(TComponent*Owner);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(ON_COM_RECEIVE,TMessage,On_Receive)
END_MESSAGE_MAP(TForm)
void__fastcallTForm1:
FormClose(TObject*Sender,TCloseAction&
Action)
//---------------------------------------------------------------------------
FormCreate(TObject*Sender)
com2.set_hwnd(Handle);
voidTForm1:
On_Receive(TMessage&
Message)
charxx[20];
intport=Message.WParam;
if(com2.read(xx,20)>
0)
ShowMessage(xx);
错误和缺陷在所难免,欢迎来信批评指正;
wushaojian@
附完整源代码_com.h
/*
串口基础类库(WIN32)ver0.1
编译器:
BC++5;
C++BUILDER4,5,6,X;
VC++5,6;
VC.NET;
GCC;
class_base_com:
虚基类基本串口接口;
class_sync_com:
同步I/O串口类;
class_asyn_com:
异步I/O串口类;
class_thread_com:
异步I/O辅助读监视线程可转发窗口消息串口类(可继承虚函数on_receive用于读操作);
class_com:
_thread_com同名
copyright(c)2004.8llbirdwushaojian@
*/
Example:
#ifndef_COM_H_
#define_COM_H_
#pragmawarning(disable:
4530)
4786)
4800)
#include<
cassert>
strstream>
algorithm>
exception>
iomanip>
usingnamespacestd;
windows.h>
class_base_com//虚基类基本串口接口
protected:
volatileint_port;
//串口号
volatileHANDLE_com_handle;
//串口句柄
char_com_str[20];
DCB_dcb;
//波特率,停止位,等
COMMTIMEOUTS_co;
//超时时间
virtualboolopen_port()=0;
voidinit()//初始化
memset(_com_str,0,20);
memset(&
_co,0,sizeof(_co));
_dcb,0,sizeof(_dcb));
_dcb.DCBlength=sizeof(_dcb);
_com_handle=INVALID_HANDLE_VALUE;
}
virtualboolsetup_port()
is_open())
returnfalse;
SetupComm(_com_handle,8192,8192))
//设置推荐缓冲区
GetCommTimeouts(_com_handle,&
_co))
_co.ReadIntervalTimeout=0xFFFFFFFF;
_co.ReadTotalTimeoutMultiplier=0;
_co.ReadTotalTimeoutConstant=0;
_co.WriteTotalTimeoutMultiplier=0;
_co.WriteTotalTimeoutConstant=2000;
SetCommTimeouts(_com_handle,&
//设置超时时间
PurgeComm(_com_handle,PURGE_TXABORTPURGE_RXABORTPURGE_TXCLEARPURGE_RXCLEAR))
//清空串口缓冲区
returntrue;
inlinevoidset_com_port(intport)
charp[12];
_port=port;
strcpy(_com_str,"
\\\\.\\COM"
ltoa(_port,p,10);
strcat(_com_str,p);
public:
_base_com()
init();
virtual~_base_com()
close();
//设置串口参数:
波特率,停止位,等支持设置字符串"
9600,8,n,1"
boolset_state(char*set_str)
if(is_open())
GetCommState(_com_handle,&
_dcb))
BuildCommDCB(set_str,&
returnSetCommState(_com_handle,&
_dcb)==TRUE;
波特率,停止位
_dcb.BaudRate=BaudRate;
_dcb.ByteSize=ByteSize;
_dcb.Parity=Parity;
_dcb.StopBits=StopBits;
//打开串口缺省9600,8,n,1
inlineboolopen(intport)
returnopen(port,9600);
//打开串口缺省baud_rate,8,n,1
inlineboolopen(intport,intbaud_rate)
if(port<
1port>
1024)
set_com_port(port);
open_port())
setup_port())
returnset_state(baud_rate);
//打开串口
inlineboolopen(intport,char*set_str)
returnset_state(set_str);
inlineboolset_buf(intin,intout)
returnis_open()?
SetupComm(_com_handle,in,out):
false;
//关闭串口
inlinevirtualvoidclose()
if(is_open())
CloseHandle(_com_handle);
//判断串口是或打开
inlineboolis_open()
return_com_handle!
=INVALID_HANDLE_VALUE;
//获得串口句炳
HANDLEget_handle()
return_com_handle;
operatorHANDLE()
};
public_base_com
virtualboolopen_port()
_com_str,
FILE_ATTRIBUTE_NORMAL,
assert(is_open());
returnis_open();
//检测串口是否成功打开
_sync_com()
//同步读
intread(char*buf,intbuf_len)
buf[0]='
COMSTATstat;
DWORDerror;
if(ClearCommError(_com_handle,