VC串口通讯DLLWord文档下载推荐.docx

上传人:b****5 文档编号:19673926 上传时间:2023-01-08 格式:DOCX 页数:25 大小:21.96KB
下载 相关 举报
VC串口通讯DLLWord文档下载推荐.docx_第1页
第1页 / 共25页
VC串口通讯DLLWord文档下载推荐.docx_第2页
第2页 / 共25页
VC串口通讯DLLWord文档下载推荐.docx_第3页
第3页 / 共25页
VC串口通讯DLLWord文档下载推荐.docx_第4页
第4页 / 共25页
VC串口通讯DLLWord文档下载推荐.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

VC串口通讯DLLWord文档下载推荐.docx

《VC串口通讯DLLWord文档下载推荐.docx》由会员分享,可在线阅读,更多相关《VC串口通讯DLLWord文档下载推荐.docx(25页珍藏版)》请在冰豆网上搜索。

VC串口通讯DLLWord文档下载推荐.docx

_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,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 面试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1