?? port_dll.cpp
字號:
// port_dll.cpp : Defines the initialization routines for the DLL.
//
#include "stdafx.h"
#include "port_dll.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//
// Note!
//
// If this DLL is dynamically linked against the MFC
// DLLs, any functions exported from this DLL which
// call into MFC must have the AFX_MANAGE_STATE macro
// added at the very beginning of the function.
//
// For example:
//
// extern "C" BOOL PASCAL EXPORT ExportedFunction()
// {
// AFX_MANAGE_STATE(AfxGetStaticModuleState());
// // normal function body here
// }
//
// It is very important that this macro appear in each
// function, prior to any calls into MFC. This means that
// it must appear as the first statement within the
// function, even before any object variable declarations
// as their constructors may generate calls into the MFC
// DLL.
//
// Please see MFC Technical Notes 33 and 58 for additional
// details.
//
/////////////////////////////////////////////////////////////////////////////
// CPort_dllApp
BEGIN_MESSAGE_MAP(CPort_dllApp, CWinApp)
//{{AFX_MSG_MAP(CPort_dllApp)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPort_dllApp construction
CPort_dllApp::CPort_dllApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}
/////////////////////////////////////////////////////////////////////////////
// The one and only CPort_dllApp object
CPort_dllApp theApp;
CWinThread* m_pThread; // 代表輔助線程
volatile BOOL m_bConnected;//表示連接否,用來標識菜單串口連接和斷開連接是否可用
volatile HWND m_hTermWnd;//輔助窗口
volatile HANDLE m_hPostMsgEvent; // 用于WM_COMMNOTIFY消息的事件對象
OVERLAPPED m_osRead, m_osWrite; // 用于重疊讀/寫
// 串行口句柄
int m_nBaud;//數據傳輸速率
int m_nDataBits;//數據位
BOOL m_bEcho;//表明本地回顯
BOOL m_bNewLine;//表明自動換行
int m_nParity;//校驗位
CString m_sPort;//串行端口
int m_nStopBits;//停止位
HANDLE fp; //打印機句并
FILE *hp;
HANDLE _stdcall OpenConnection(int ipt)
{
HANDLE m_hCom;
COMMTIMEOUTS TimeOuts;
DCB dcb;
m_nBaud = 9600;
m_nDataBits = 8;
m_bEcho = FALSE;
m_bNewLine = FALSE;
m_nParity = 0;
m_sPort = "COM1";
m_nStopBits = 0;
char s[5]="";
sprintf(s,"COM%d",ipt);
m_hCom=CreateFile(s, GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL ,
NULL); // 重疊方式
if(m_hCom==INVALID_HANDLE_VALUE)
return 0;
SetupComm(m_hCom,4096,4096);
// 把間隔超時設為最大,把總超時設為0將導致ReadFile立即返回并完成操作
TimeOuts.ReadIntervalTimeout=MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier=0;
TimeOuts.ReadTotalTimeoutConstant=0;
/* 設置寫超時以指定WriteComm成員函數中的GetOverlappedResult函數的等待時間*/
TimeOuts.WriteTotalTimeoutMultiplier=50;
TimeOuts.WriteTotalTimeoutConstant=2000;
SetCommTimeouts(m_hCom, &TimeOuts);
if(!GetCommState(m_hCom, &dcb))
return 0;
dcb.fBinary=TRUE;
dcb.BaudRate = m_nBaud; // 數據傳輸速率
dcb.StopBits = ONESTOPBIT;//1停止位
dcb.ByteSize = m_nDataBits; // 每字節位數
dcb.Parity = NOPARITY; //////////無奇偶校驗
if(!SetCommState(m_hCom, &dcb))
{
AfxMessageBox("Can not Set DCB");
return 0;
}
SetCommMask(m_hCom, EV_RXCHAR);
return m_hCom;
}
/************************************************
************************************************/
DWORD _stdcall ReadComm(HANDLE m_hCom,char* buf, DWORD dwLength)
{
DWORD length=0;
COMSTAT ComStat;
DWORD dwErrorFlags;
// int i;
ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
//comstate.cbInQue 指明串口中已經接受到的字節數,不是readfile操作要求讀出的字節數
length=min(dwLength, ComStat.cbInQue);
// length=dwLength;
//length 從串口讀取的字節數
//&length指向調用該函數讀出的字節數。
ReadFile(m_hCom,buf,length,&length,&m_osRead);
PurgeComm(m_hCom,PURGE_TXCLEAR);//清除發送緩沖區
PurgeComm(m_hCom,PURGE_RXCLEAR);//清除接受緩沖區
/* FILE *fp;
fp=fopen("cc.txt","w+b"); //寫,二進制
if (fp!=NULL)
fwrite(&dwLength,2,1,fp);
fwrite(buf,dwLength,1,fp);
fclose(fp);
fwrite(buffer,size,count,fp)
buffer 寫入數據的存放地址
size 寫入數據的字節數
count 寫入多少個size字節數據項
fp 文件指針
*/
return length;
//返回讀出的字節數。
}
/************************************************
************************************************/
DWORD _stdcall WriteComm(HANDLE m_hCom,char* buf, DWORD dwLength)
{
BOOL fState;
DWORD length=dwLength;
COMSTAT ComStat;
DWORD dwErrorFlags;
ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
PurgeComm(m_hCom,PURGE_TXCLEAR);//清除發送緩沖區
PurgeComm(m_hCom,PURGE_RXCLEAR);//清除接受緩沖區
fState=WriteFile(m_hCom,buf,length,&length,&m_osWrite);
if(!fState)
{
if(GetLastError()==ERROR_IO_PENDING)
{
GetOverlappedResult(m_hCom,&m_osWrite,&length,TRUE);// 等待
}
else
length=0;
}
return length;
}
void _stdcall CloseConnection(HANDLE m_hCom)
{
CloseHandle(m_hCom);
}
/************************************************
并口打印機打印函數
************************************************/
int __stdcall ClosePalPort(void)
{
CloseHandle(fp);
return 1;
}
int __stdcall PalPortInit(int iPt)
{
DWORD dwBytesWritten =0;
OVERLAPPED overlappedwrite;
overlappedwrite.Internal=0;
overlappedwrite.InternalHigh=0;
overlappedwrite.Offset=0;
overlappedwrite.OffsetHigh=0;
overlappedwrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
if(iPt==1)
{
fp=CreateFile( "LPT1",GENERIC_READ | GENERIC_WRITE, 0, 0,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 0);
}
if(iPt==2)
{
fp=CreateFile( "LPT2",GENERIC_READ | GENERIC_WRITE, 0, 0,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 0);
}
if(fp==INVALID_HANDLE_VALUE)
{
AfxMessageBox("can not open LPT ");
CloseHandle(fp);
return 0;
}
return 1;
}
//************************************************
//函數: POS58_PrnCnEn
//功能: 向POS58打印機發送字符串并打印
//參數: iPt:打印機端口,1:LPT1,2:LPT2
// str:要發送的字符串
//返回: 1:成功;0:錯誤;
//說明: 此函數可以打印中英文混合字符串
//**************************************************
int __stdcall POS58_PrnCnEn(int iPt,char* str)
{
Sleep(5);
DWORD dwBytesWritten =0;
OVERLAPPED overlappedwrite;
overlappedwrite.Internal=0;
overlappedwrite.InternalHigh=0;
overlappedwrite.Offset=0;
overlappedwrite.OffsetHigh=0;
overlappedwrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
WriteFile( fp,str,strlen(str),&dwBytesWritten, &overlappedwrite);
{
DWORD error;
error=GetLastError();
/*
if (error!=ERROR_IO_PENDING)//寫不成功
{
AfxMessageBox("Printer fail ");
return 0;
}
*/
}
return 1;
}
/*
//直接打印字符串
void __stdcall PrnStr(LPSTR str)
{
// PalPortInit(1);
// POS58_PrnCnEn(1,str);
// POS58_PrnCnEn(1,ss);
// ClosePalPort();
char ss[2]="\x0a";
char s1[100]="";
for(unsigned int i=0;i<strlen(str);i++)
s1[i]=str[i];
FILE *fp;
fp=fopen("LPT1","w");
if(fp!=NULL)
{
fwrite(&s1,strlen(s1),1,fp);
fwrite(&ss,strlen(ss),1,fp);
}
fclose(fp);
}
//直接發送命令
void __stdcall PrnComm(LPSTR str)
{
// PalPortInit(1);
// POS58_PrnCnEn(1,str);
// ClosePalPort();
char s1[100]="";
for(unsigned int i=0;i<strlen(str);i++)
s1[i]=str[i];
FILE *fp;
fp=fopen("LPT1","w");
if(fp!=NULL)
{
fwrite(&s1,strlen(s1),1,fp);
}
fclose(fp);
}
//直接發送命令
void __stdcall prn_next(LPSTR str)
{
char s1[2]="\x0a";
FILE *fp;
fp=fopen("LPT1","w");
if(fp!=NULL)
{
fwrite(&s1,strlen(s1),1,fp);
}
fclose(fp);
}
*/
//*********************************
//直接發送命令
//**********************************
int __stdcall open_hp()
{
hp=fopen("LPT1","w");
if(hp!=NULL)
{
return 1;
}
return 0;
}
void __stdcall close_hp()
{
fclose(hp);
}
//****************************************
//直接打印字符串
//****************************************
void __stdcall PrnStr(LPSTR str)
{
char ss[2]="\x0a";
char s1[100]="";
for(unsigned int i=0;i<strlen(str);i++)
s1[i]=str[i];
fwrite(s1,strlen(s1),1,hp);
fwrite(ss,strlen(ss),1,hp);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -