爱普生打印的例子

#include <windows.h>
#include <string>
#include <IOSTREAM>
using namespace std;
 
typedef struct DataInfo
{
    string Port;  //串口端口号
    int BawdRate;//波特率
    int DataBits;  //数据位
    char Parity;  //校验位
    int ReceiveBuffer;  //缓冲区
    int StopBits;//停止位
}PrintDevice;
 
int   WriteData(string meg);
int InitPort(PrintDevice &device);
void InitializeDevicePar(PrintDevice &device);
HANDLE hPort=NULL;  //句柄
 
int main()
{
    PrintDevice device;
    InitializeDevicePar(device);  //初始化打印机参数
 
    InitPort(device);  //初始化打印机端口
 
    string s;
     
    ////////////////////////////打印头信息开始//////////////////////////////////
    //设置中文粗体 + 四倍大小, "FS ! n", n = 4 + 8+128, 
    s= "\x1C\x21\x8C";
    WriteData(s);
 
    s="商店-上海鼎捷\x0A";
    WriteData(s); //打印
     
    //取消中文放大设置
    DWORD iBytesLength;
    char chSetCode[] = "\x1C\x21\x0";
    WriteFile(hPort, chSetCode, (DWORD)3L, &iBytesLength, NULL);
    //////////////////////////打印头信息结束///////////////////////////////////////
 
    //////////////////////////打印商品开始////////////////////////////////////////
    s="山东苹果\t4.00\t2x\t8.00元\x0A";
    WriteData(s); //打印
    s="福建橘子\t5.00\t3x\t15.00元\x0A";
    WriteData(s); //打印
    s="\x0A";
    WriteData(s); //打印
    ////////////////////////////打印商品结束//////////////////////////////////////
    s="小计:23.00元\x0A";
    WriteData(s); //打印
     
    //进纸到切纸位置,再切纸,"GS V m n", n=需要多进的行数
    s= "\x1D\x56\x41\x01";  //m=65 65是全切,66是半切, n=1 0<=n<=255
    WriteData(s); //打印
 
    CloseHandle(hPort);//关闭端口
 
    return 0;
}
void InitializeDevicePar(PrintDevice &device)
{
    device.Port="COM4";
    device.BawdRate=9600;
    device.DataBits=8;
    device.StopBits=ONESTOPBIT;
    device.Parity=NOPARITY;  //NONE
    device.ReceiveBuffer=256;
}
int InitPort(PrintDevice &device)
{
    hPort = CreateFile(device.Port.c_str(), GENERIC_READ | GENERIC_WRITE,
        0, NULL, 
        OPEN_EXISTING,
                            FILE_ATTRIBUTE_NORMAL, NULL );
 
    if (hPort == INVALID_HANDLE_VALUE) 
    {   // 打开端口失败
        return false;
    }
    else
    { 
        //设置端口缓冲
        SetupComm(hPort, 1024, 1024); 
 
        // 设定通讯端口超时参数
        COMMTIMEOUTS tmouts;
        tmouts.ReadIntervalTimeout = 100;
        tmouts.ReadTotalTimeoutMultiplier = 100;
        tmouts.ReadTotalTimeoutConstant = 100;
        tmouts.WriteTotalTimeoutConstant = 100;
        tmouts.WriteTotalTimeoutMultiplier = 100;
        SetCommTimeouts(hPort, &tmouts);
 
        //设定通讯端口通讯参数
        DCB dcb;
        BOOL bol = TRUE;
 
        //dcb.DCBlength = sizeof(dcb);
        bol=GetCommState(hPort, &dcb);
        dcb.BaudRate = device.BawdRate;
        dcb.ByteSize =device.DataBits;
        dcb.StopBits = device.StopBits;
        dcb.Parity = device.Parity;
 
        bol = SetCommState(hPort, &dcb); //配置串口
        // 清除通讯端口缓存
        PurgeComm(hPort, PURGE_TXCLEAR | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_RXABORT);
 
        // 初始化重叠IO对象
        OVERLAPPED m_OverlappedRead;
        OVERLAPPED m_OverlappedWrite;
        HANDLE m_hStopCommEvent;
        HANDLE m_hDataReady;
        memset(&m_OverlappedRead, 0, sizeof(OVERLAPPED));
        m_OverlappedRead.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
        memset(&m_OverlappedWrite, 0, sizeof(OVERLAPPED));
        m_OverlappedWrite.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
 
        // 初始化事件对象
        m_hStopCommEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
        m_hDataReady = CreateEvent(NULL, FALSE, FALSE, NULL);
     
        //初始化打印ESC @
        DWORD iBytesLength;
        char chInitCode[] = "\x0D\x1B\x40";
        WriteFile(hPort, chInitCode, (DWORD)3L, &iBytesLength, NULL);
    }
 
    return 0;
 
}
int   WriteData(string meg)
{
    DWORD dwWrite;
    WriteFile(hPort, meg.c_str(), (DWORD)meg.length(), &dwWrite, NULL);
    return 0;
}

 

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享