?? readdll.cpp
字號:
// ReadDLL.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "ReadDLL.h"
#include "ISO15693.h"
#include <iostream.h>
HANDLE m_hCom;
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
// m_count=0;
//printf("\nprocess attach of dll");
break;
case DLL_THREAD_ATTACH:
//printf("\nthread attach of dll");
break;
case DLL_THREAD_DETACH:
// printf("\nthread detach of dll");
break;
case DLL_PROCESS_DETACH:
// m_count=0;
// printf("\nprocess detach of dll");
break;
}
return TRUE;
}
int _stdcall SetCom(const char *m_sPort, int BaudRate, int Databit, char *parity, char *stopbit)
{
COMMTIMEOUTS TimeOuts; ///串口輸出時間 超時設置
DCB dcb; ///與端口匹配的設備
m_hCom=CreateFile(m_sPort, GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
NULL); // 以重疊方式打開串口
if(m_hCom==INVALID_HANDLE_VALUE)
{
//AfxMessageBox("設置串口部分,串口打開失敗"); /////重疊方式 異步通信(INVALID_HANDLE_VALUE)函數失敗。
return 0x01;
}
SetupComm(m_hCom,MAXBLOCK,MAXBLOCK); //設置緩沖區
memset(&TimeOuts,0,sizeof(TimeOuts));
TimeOuts.ReadIntervalTimeout=MAXDWORD; // 把間隔超時設為最大,把總超時設為0將導致ReadFile立即返回并完成操作
TimeOuts.ReadTotalTimeoutMultiplier=0; //讀時間系數
TimeOuts.ReadTotalTimeoutConstant=0; //讀時間常量
TimeOuts.WriteTotalTimeoutMultiplier=50; //總超時=時間系數*要求讀/寫的字符數+時間常量
TimeOuts.WriteTotalTimeoutConstant=2000; //設置寫超時以指定WriteComm成員函數中的
SetCommTimeouts(m_hCom, &TimeOuts); //GetOverlappedResult函數的等待時間*/
if(!GetCommState(m_hCom, &dcb)) ////串口打開方式、端口、波特率 與端口匹配的設備
{
// AfxMessageBox("GetCommState Failed");
return 0x02;
}
dcb.fParity=TRUE; //允許奇偶校驗
dcb.fBinary=TRUE;
if(parity=="NONE")
dcb.Parity=NOPARITY;
if(parity=="ODD")
dcb.Parity=ODDPARITY;
if(parity=="EVEN")
dcb.Parity=EVENPARITY;
if(stopbit=="1")//設置波特率
dcb.StopBits=ONESTOPBIT;
//if(stopbit=="0")//設置波特率
// dcb.StopBits=NONESTOPBIT;
if(stopbit=="2")//設置波特率
dcb.StopBits=TWOSTOPBITS;
BOOL m_bEcho=FALSE; ///
int m_nFlowCtrl=0;
BOOL m_bNewLine=FALSE; ///
dcb.BaudRate=BaudRate; // 波特率
dcb.ByteSize=Databit; // 每字節位數
// 硬件流控制設置
dcb.fOutxCtsFlow=m_nFlowCtrl==1;
dcb.fRtsControl=m_nFlowCtrl==1 ?RTS_CONTROL_HANDSHAKE:RTS_CONTROL_ENABLE;
// XON/XOFF流控制設置(軟件流控制!)
dcb.fInX=dcb.fOutX=m_nFlowCtrl==2;
dcb.XonChar=XON;
dcb.XoffChar=XOFF;
dcb.XonLim=50;
dcb.XoffLim=50;
if(SetCommState(m_hCom, &dcb))
{
return 0; ////com的通訊口設置
}
else
{
//AfxMessageBox("串口已打開,設置失敗");
return 0x03;
}
}
int _stdcall ReadCom(BYTE inbuff[], DWORD &nBytesRead, int ReadTime)
{
DWORD lrc; ///縱向冗余校驗
DWORD endtime; /////////jiesuo
static OVERLAPPED ol;
int ReadNumber=0;
int numCount=0 ; //控制讀取的數目
DWORD dwErrorMask,nToRead;
COMSTAT comstat;
ol.Offset=0; ///相對文件開始的字節偏移量
ol.OffsetHigh=0; ///開始傳送數據的字節偏移量的高位字,管道和通信時調用進程可忽略。
ol.hEvent=NULL; ///標識事件,數據傳送完成時設為信號狀態
ol.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
endtime=GetTickCount()+ReadTime;//GetTickCount()取回系統開始至此所用的時間(毫秒)
// for(int i=0;i<2000;i++)
// inbuff[i]=0;
Sleep(ReadTime);
ClearCommError(m_hCom,&dwErrorMask,&comstat);
nToRead=min(2000,comstat.cbInQue);
if(int(nToRead)<2)
goto Loop;
if(!ReadFile(m_hCom,inbuff,nToRead,&nBytesRead,&ol))
{
if((lrc=GetLastError())==ERROR_IO_PENDING)
{
///////////////////
endtime=GetTickCount()+ReadTime;//GetTickCount()取回系統開始至此所用的時間(毫秒)
while(!GetOverlappedResult(m_hCom,&ol,&nBytesRead,FALSE))//該函數取回重疊操作的結果
{
if(GetTickCount()>endtime)
break;
}
}
}
return 1;
Loop: return 0;
}
int _stdcall WriteCom(BYTE Outbuff[], int size)
{
DWORD nBytesWrite,endtime,lrc;
static OVERLAPPED ol;
DWORD dwErrorMask,dwError;
COMSTAT comstat;
ol.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
ol.Offset=0;
ol.OffsetHigh=0;
ol.hEvent=NULL; ///標識事件,數據傳送完成時,將它設為信號狀態
ClearCommError(m_hCom,&dwErrorMask,&comstat);
if(!WriteFile(m_hCom,Outbuff,size,&nBytesWrite,&ol))
{
if((lrc=GetLastError())==ERROR_IO_PENDING)
{
endtime=GetTickCount()+1000;
while(!GetOverlappedResult(m_hCom,&ol,&nBytesWrite,FALSE))
{
dwError=GetLastError();
if(GetTickCount()>endtime)
{
//AfxMessageBox("寫串口時間過長,目前串口發送緩沖區中的數據數目為空");
break;
}
if(dwError=ERROR_IO_INCOMPLETE)
continue; //未完全讀完時的正常返回結果
else
{
// 發生錯誤,嘗試恢復!
ClearCommError(m_hCom,&dwError,&comstat);
break;
}
}
}
}
FlushFileBuffers(m_hCom);
PurgeComm(m_hCom,PURGE_TXCLEAR);
return 1;
}
int _stdcall CloseCom()
{
if(m_hCom==INVALID_HANDLE_VALUE)
{
//AfxMessageBox("設置串口部分,串口打開失敗"); /////重疊方式 異步通信(INVALID_HANDLE_VALUE)函數失敗。
return 0x01;
}
else
{
if(CloseHandle(m_hCom)==true)
{
return 0;
}
else
{
return 3;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -