// 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);