自己动手编写串口动态库超详细.docx
- 文档编号:11608801
- 上传时间:2023-06-01
- 格式:DOCX
- 页数:19
- 大小:126.58KB
自己动手编写串口动态库超详细.docx
《自己动手编写串口动态库超详细.docx》由会员分享,可在线阅读,更多相关《自己动手编写串口动态库超详细.docx(19页珍藏版)》请在冰点文库上搜索。
自己动手编写串口动态库超详细
自己动手编写串口动态库
手把手教你编写串口调试助手,单片机串口程序
岂IIibserialportdill
2015/2/77:
55
应月程序扩晟
6KB
邮libserialport^exp
2015/2/77:
55
ExportsLibrary心
2KB
MSlibserijlpcrtlib
2015/2/77:
55
ObjectFileLibrary
4KE
libserialportHobj
2015/2/77:
54
ObjectFile
8KB
Blibserialpoirtpch
2015/2/618:
53
Pre匚ornpileidHe.„
1,742細
iSrlibserialportres
2015/2/77:
55
CompiledResou^
1KB
FStdAfx.obj
2015/2/61&53
ObjectAle
1KB
vcGOJdb
2015/2/77:
56
VC++Minimuinri“
41KB
、串口库源码:
自行在vc6中建立动态库工程
#inelude"stdafx.h"
#include
#include
#inelude
#ineludevconio.h>
#include"resource.h"
/*导出函数*/
//函数参数:
串口名:
"coml"波特率:
9600用于显示接收数据的文本框的句柄
extern"C"_declspec(dllexport)voidEntry(char*comname,intBaudRate,HWNDrhbox);
extern"C"declspec(dllexport)boolopenport(char*portname);
extern"C"_declspec(dllexport)boolsetupdcb(intrate_arg);
extern"C"_declspec(dllexport)voidSetTimeOut(inta,intb,intc,intd,inte);
//发送字符或16进制数
extern"C"_declspec(dllexport)voidSendChar(unsignedcharch);
//显示方式:
1:
hex0:
char
extern"C"_declspec(dllexport)voidDisplayHex(intflag);
extern"C"_declspec(dllexport)voidClose();
//只使用上面有注释的三个函数即可
HANDLEhComm;串口的句柄
OVERLAPPEDm_d/z;是一个包含了用于异步输入输岀的信息的结构体
COMSTATcomstat//包含串口结构信息
HANDLEhThread1;//读线程句柄
HANDLEhThread2;//写线程句柄
HWNDhRbox;
boolsendflag=false;
unsignedcharsendchar,receivechar;
boolDisplayHEX=false;
ProcessErrorMessage(char*ErrorText)//打印进程错误信息
{
char*Temp=newchar[200];
LPVOIDlpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
MAKELANGID(LANGNEUTRAL,SUBLANGDEFAULDefaultlanguage
(LPTSTR)&lpMsgBuf,
sprintf(Temp,"WARNING:
%sFailedwiththefollowingerror:
\n%s\nPort:
%d\n"(char*)ErrorText,lpMsgBuf,"com2");
MessageBox(NULL,Temp,"ApplicationError",MB」CONSTOP);
LocalFree(lpMsgBuf);
delete[]Temp;
returntrue;
}
/****************扌丁开串口*********************/
boolopenport(char*portname)
{hComm=Create,
GENERIC_READ|GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
deb.fErrorChar=0;
deb.fBinary=1;
dcb.fNull=0;
dcb.fAbortOnError=0;
dcb.wReserved=0;
dcb.XonLim=2;
dcb.XoffLim=4;
dcb.XonChar=0x13;
dcb.XoffChar=0x19;
dcb.EvtChar=0;
/**/
//用上面的设备控制块来设置当前串口
if(!
SetCommState(hComm,&dcb))
{
ProcessErrorMessage("SetCommState()");returnfalse;
}
else
returntrue;//设置成功
}
boolsetuptimeout(intReadInterval,intReadTotalMultiplier,
intReadTotalconstant,
intWriteTotalMultiplier,intWriteTotalconstant)
{
COMMTIMEOUTStimeouts;
timeouts.ReadIntervalTimeout=ReadInterval;
//读间隔超时
timeouts.ReadTotalTimeoutConstant=ReadTotalconstant;
//读时间常量
timeouts.ReadTotalTimeoutMultiplier=ReadTotalMultiplier;
//读时间系数
timeouts.WriteTotalTimeoutConstant=WriteTotalconstant;
//写时间常量
timeouts.WriteTotalTimeoutMultiplier=WriteTotalMultiplier;
//写时间系数
if(!
SetCommTimeouts(hComm,&timeouts))//设置当前串口的超时设置
/*******************
超时的设^置***************************/
ProcessErrorMessage("SetCommTimeouts()");
returnfalse;
else
returntrue;
voidReceiveChar()
{
BOOLbRead=TRUE;
BOOLbResult=TRUE;
DWORDdwError=0;
DWORDBytesRead=0;
charRXBuff;//接收数据缓冲器
charstr[10];
for(;;)//死循环等待
{
Sleep(IOO);
bResult=ClearCommError(hComm,&dwError,&comstat);//清除硬件的通讯错误以及
获取通讯设备的当前状态
if(comstat.cbInQue==0)
continue;
if(bRead)
{I
bResult=Read,//HandletoCOMMport
&RXBuff,
//RXBufferPointer
1,
//Readonebyte
&BytesRead,
//Storesnumberofbytesread
&m_ov);
//pointertothem_ovstructure
if(DisplayHEX){
//printf("0x%08x",RXBuff);//打印接收到的数据
sprintf(str,"0x%08x",RXBuff);
SetWindowText(hRbox,str);
}
else{
//printf("%c",RXBuff);//打印接收到的数据
sprintf(str,"%c",RXBuff);
SetWindowText(hRbox,str);
}
if(!
bResult)//读不成功{J
switch(dwError=GetLastError())
else
bRead=TRUE;
}
}//closeif(bRead)
—if(!
bRead)
{
bRead=TRUE;
bResult=GetOverlappedResult(hComm,//HandletoCOMMport
&m_ov,//Overlappedstructure
&BytesRead,//Storesnumberofbytesread
TRUE);//Waitflag
}
}
}
WriteChar(BYTE*m_szWriteBuffer,DWORDm_nToSend)
{
BOOLbWrite=TRUE;
BOOLbResult=TRUE;
DWORDBytesSent=0;HANDLEm_hWriteEvent;ResetEvent(mhWriteEvent);if(bWrite)
{
mov.Offset=0;
m_ov.OffsetHigh=
o;」
//Clearbuffer
bResult=Write,
//HandletoCOMMPort
m_szWriteBuffer,
//Pointertomessagebufferincallingfinction
mnToSend.
//Lengthofmessagetosend
&BytesSent,
//Wheretostorethenumberofbytessent
&m_ov);//Overlappedstructure
if(!
bResult)
{I
DWORDdwError=GetLastError();
switch(dwError)
//continuetoGetOverlappedResults()
BytesSent=0;
bWrite=FALSE;
//allothererrorcodes
ProcessErrorMessage("WriteFile()");
}
}
}
}//endif(bWrite)
if(!
bWrite)
{
bWrite=TRUE;
bResult=GetOverlappedResult(hComm,//HandletoCOMMport
&m_ov,//Overlappedstructure
&BytesSent,//Storesnumberofbytessent
TRUE);//Waitflag
//dealwiththeerrorcode
if(!
bResult)
//Verifythatthedatasizesendequalswhatwetriedtosend
if(BytesSent!
=mnToSend)
{
printf("WARNING:
WriteFile()error..BytesSent:
%d;MessageLength:
%d\n"BytesSent,strlen((char*)m_szWriteBuffer));
}一
returntrue;
}
//读线程
DWORDWINAPIMyThread1(LPVOIDpParam)
{
ReceiveChar();
return0;
}
//写线程
DWORDWINAPIMyThread2(LPVOIDpParam)
{
while(hComm!
=INVALIDHANDLEVALUE)//串口已被成功打开
{
Sleep(100);//等待100毫秒
if(sendflag){
WriteChar(&sendchar,1);
sendflag=false;//发送
}
return0;
}
/**************
函数名Entry
参数
comname串口名
BaudRate:
波特率
***************/
voidEntry(char*comname,intBaudRate,HWNDrhbox)
{
hRbox=rhbox;
if(openport(comname))
printf("opencomportsuccess'n");
if(setupdcb(BaudRate))
printf("setupDCBsuccess'n");
if(setuptimeout(0,0,0,0,0))
printf("setuptimeoutsuccess'n");
PURGE_RXABORT|PURGE_TXABORT);
//读线程
//写线程
//清空缓冲区
/*****************
PurgeComm(hComm,PURGE_RXCLEAR|PURGE_TXCLEAR|hThreadl=CreateThread(NULL,0,MyThreadl,0,0,NULL);hThread2=CreateThread(NULL,0,MyThread2,0,0,NULL);
^设置显^示******************/
voidDisplayHex(intflag){if(flag==0){
DisplayHEX=false;
else{
DisplayHEX=true;
voidSetTimeOut(inta,intb,intc,intd,inte){
if(setuptimeout(a,b,c,d,e))
printf("setuptimeoutsuccess'n");
/************送数*************/
voidSendChar(unsignedcharch){
sendchar=ch;
sendflag=true;//通知发送线程发送数据
}
/*********关^闭************/
voidClose(){
CloseHandle(hThreadl);//关闭都线程
CloseHandle(hThread2);//关闭写线程
CloseHandle(hComm);//关闭串口
}
、验证是否成功把DLL放在EXE—起
Debug
Release
2015/2/71437
2015/2/69:
32
文际
文持
@0libserhlport.lib
2015/2/610:
0?
ObjectFileLibrary
4KB
C©测试事口库.cpp
2015/2/610:
10
CPP文件
1KB
++Shcsafedsp
2015/2/7K37
VC++5Project
4KB
CA碱雪口库.d河
2015/2/714:
37
DEW文件
1KB
B测试圭□库.mb
2015/2/71437
VC++IntellisenSuH
33KB
—测试謂匚库.opt
2015/2/714^37
OPT文件
43KB
测试自口库的
2015/2/714:
37
PLG交件
2KB
三、验证串口库代码:
#pragmacommen(lib,"libserialport.lib")
extern"C"_declspec(dllimport)voidEntry(char*comname,intBaudRate,NULL);extern"C"_declspec(dllimport)voidSendChar(unsignedcharch);
extern"C"declspec(dllimport)voidClose();
extern"C"_declspec(dllimport)voidDisplayHex(intflag);
#include
#include
ntmain()
{
charch;
Entry("com4",9600,NULL;//根据需要设置串口号
DisplayHex(0);
Sleep(2000);
SendChar('A');//测试字符
Sleep(2000);
SendChar('B');
Sleep(2000);
DisplayHex
(1);
SendChar(OxOO);
Sleep(2000);
SendChar(0xf3);//测试16进制数
Sleep(2000);
SendChar(Oxff);
Sleep(2000);
Close();//关闭串口
return0;
}
四、(可选)编写窗口程序
名称4
修改日期
大小
屈libserialportdll
2015/^/618i53
盍用程序扩最
4
N禺匚JS-^.exe
2015/^/61^7
可以看出不用MFC编写的串口程序体积非常小
五、单片机上的程序
#include
#definejingzhen11059200UL
#definebotelv9600UL//定义波特率为9600volatileunsignedcharsending,receive=0;unsignedcharbuf;
sbitbutton=P1A7;//最后一个按钮
voiddelay(unsignedinti)
{
while(i--);
}
voidinit()
{
EA=0;//暂时关中断
TMOD&=OXOF//定时器1模式控制在高4位
TMOD|=0X20;//定时器1工作在模式2,自动重装模式
SCON=0X50;//串口工作在模式1
TH1=256-jingzhen/(botelv*12*16);//计算定时器重装值
TL1=256-jingzhen/(botelv*12*16);
PCON|=0X80;//串口波特率加倍
ES=1;//串行中断允许
TR1=1;//启动定时器1
REN=1;//允许接收
EA=1;//允许中断
}
voiduart(void)interrupt4//串口中断服务程序
{
if(Rl)//收到数据
{
P2=SBUF;
buf=SBUF;
receive=1;
Rl=0;//清中断请求
}
else//发送数据
{
Tl=0;
sending=0;///清正在发送标志
}
}
voidsend(unsignedchard)//发送一个字节的数据,形参d即为待发送数据
{
SBUF=d;
//将数据写入到串口缓冲
sending=•
1;//设置发送标志
while(sending);//等待发送完毕
voidmain(){
init();
while
(1)
{
if(receive)II接收到数据后发送回去{
send(buf);
receive=0;II发送完毕
}]
if(button==0){
delay(IOOO);
if(button==0){
send(buf);
while(!
button);
}]
}
}
}
然后观察单片机上对应引脚上灯的状态
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 自己动手 编写 串口 动态 详细