原生态C/C++,如果读取打印机打印的内容

哪位朋友有c/c++相应的示例代码请指导一下。要相对完整的,不要MFC,就要原生态的。打印机是有驱USB小票打印机

不知怎么格式有点乱了...
你照抄就行了。网上的例子很多都不能用,一运行就容易死锁,我参照好几个例子写出来的代码,坑很多的。不会死锁。

USB小票打印机一般都是USB虚拟串口的,可以参考打印机厂家提供的命令格式。接口代码方面,我有串口的驱动,自己写的,完全不依赖MFC。
一共两个文件,一个是CPP,一个是H。
///====================================================================================
//SerialPort.cpp
///====================================================================================
#include "stdafx.h"
#include

#include "serialport.h"

CSerialPort::CSerialPort()
{
m_hCom = NULL;
memset(&m_ov, 0, sizeof(m_ov));
}

CSerialPort::~CSerialPort()
{
Close();
}

void CSerialPort::Close()
{
if(m_hCom)CloseHandle(m_hCom);
m_hCom = NULL;
}
int CSerialPort::Open(int port, DWORD dwBaudRate,BYTE byParity,BYTE byStopBits,BYTE byByteSize)
{
char fname[256];
DCB dcb; // 串口通信设备控制参数结构体
BOOL bSuccess;
COMMTIMEOUTS CommTimeOuts;

sprintf(fname, "\\\\.\\COM%d", port);
m_hCom = CreateFile(fname,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
if ( m_hCom == INVALID_HANDLE_VALUE )
    return -1;
bSuccess = GetCommState(m_hCom, &dcb);
if ( ! bSuccess )
{
    Close();
    return -1;
}
dcb.BaudRate = dwBaudRate;//波特率,默认9600
dcb.ByteSize = byByteSize;//数据位,默认8
dcb.Parity   = byParity;  //校验位,默认无
dcb.StopBits = byStopBits;//停止位,默认1
bSuccess = SetCommState(m_hCom, &dcb);
if ( ! bSuccess )
{
    Close();
    return -1;
}
SetupComm(m_hCom,6000,6000) ;
CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF ;
CommTimeOuts.ReadTotalTimeoutMultiplier = 0 ;
CommTimeOuts.ReadTotalTimeoutConstant = 30 ;
CommTimeOuts.WriteTotalTimeoutMultiplier = 2*CBR_9600/9600 ;
CommTimeOuts.WriteTotalTimeoutConstant = 0 ;
SetCommTimeouts(m_hCom, &CommTimeOuts ) ;
bSuccess = SetCommMask(m_hCom, EV_RXCHAR );

PurgeComm(m_hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ) ;
EscapeCommFunction(m_hCom, SETDTR ) ;
m_ov.hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
if ( m_ov.hEvent == INVALID_HANDLE_VALUE )
{
    Close();
    return(-1);
}

return TRUE;

}

int CSerialPort::Write(unsigned char *pbuff, int len)
{
BOOL bSuccess;
DWORD written = 0;
if ( len < 1 )return -1;
if(m_hCom==NULL) return -1;
bSuccess = WriteFile(m_hCom,pbuff,len,&written,&m_ov);
if(!bSuccess){return -1;}
bSuccess = GetOverlappedResult(m_hCom, &m_ov, &written, TRUE);
if ( ! bSuccess )
return(-1);

return written;

}

int CSerialPort::Read(unsigned char *pbuff, int want_len)
{
BOOL bSuccess;
DWORD read = 0; // 读取的字节数
if(m_hCom==NULL)return -1;
ReadFile(m_hCom,pbuff,want_len,&read,&m_ov);
bSuccess = GetOverlappedResult(m_hCom, &m_ov, &read, TRUE);
if ( ! bSuccess )
return(-1);
return read;
}

int CSerialPort::WaitReceiveReady( DWORD dwMaxWait )
{
BOOL bSuccess;
DWORD result = 0;
DWORD read = 0; // 读取的字节数
DWORD mask = 0; // 指示发生的事件类型
bSuccess = WaitCommEvent(m_hCom, &mask, &m_ov);
if ( ! bSuccess )
{
//事件没有触发,判断异步完成没有
int err = GetLastError();
if ( err == ERROR_IO_PENDING)
{
result = WaitForSingleObject(m_ov.hEvent, dwMaxWait);
if ( result == WAIT_FAILED )
{
return(-1);
}else
{
if (mask & EV_RXCHAR)
return 1;
}
}
return 0;
}
return 1;
}
///====================================================================================
//SerialPort.h
///====================================================================================
#pragma once

class CSerialPort
{
private:
HANDLE m_hCom; //串口通信设备句柄
OVERLAPPED m_ov; //异步IO结构体,记录着输入输出需要的信息
public:
CSerialPort();
~CSerialPort();
int Open(int port, DWORD dwBaudRate=CBR_9600,BYTE byParity=0,BYTE byStopBits=ONESTOPBIT,BYTE byByteSize=8) ;
void Close();
int WaitReceiveReady(DWORD dwMaxWait);
int Read(unsigned char *pbuff, int want_len);
int Write(unsigned char *pbuff, int len);
};

///====================================================================================
//调用方法:在线程里面调用,下面是线程里面相关的调用代码
///====================================================================================
...
CSerialPort csp;
csp.Open(1); // 打开串口1
///只要线程存在就不断读取数据
for (;!bExit;)
{
ret = csp.WaitReceiveReady(50); // 等待50毫秒,如果期间有数据收到就返回1,否则50毫秒到了就返回0
if(ret==1)
{
unsigned char buff[8192];
memset(buff, 0, sizeof(buff));
ret = csp.Read(buff, sizeof(buff)); // 读数据,返回读到数据的长度
if(ret>0) // 读到数据,就处理数据
ProcData(buff, ret);
else if(ret<0)break; // 如果返回-1,说明串口出错,线程就要退出
}
else if(ret==-1)break; // 等50毫秒返回-1,说明等待出错,线程退出
}
csp.Close();
...

这个就是串口通信,串口通信时,注意串口设置清理错误消息、缓存就好了。网上一大把。