这两种打印方式有什么区别?

mei想好xi 2016-12-03 09:58:04
http://outofmemory.cn/code-snippet/12300/ESC-POS-type-example

http://blog.csdn.net/rongyong/article/details/46007717

请问这两种打印的方式用起来有什么区别?一种是使用打印API,一种个是通过串口,这种区别就不用说了。哪种适合收银小票的打印?

我把这两篇代码贴上来吧。

第一篇:
#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;
}
//该片段来自于http://outofmemory.cn


第二篇:
void CTestDlg::OnPrint() 
{
 char szprinter[80];
 char *szDevice,*szDriver,*szOutput;
 HDC hdcprint; // 定义一个设备环境句柄
 //定义一个打印作业
 static DOCINFO di={sizeof(DOCINFO),"printer",NULL};
 // 得到设备字符串存入数组szprinter中
 GetProfileString("windows","device",",,,",szprinter,80);
 // 将设备字符串分解
 if(NULL!=(szDevice=strtok(szprinter,","))&&NULL!=(szDriver=strtok(NULL,","))&&
NULL!=(szOutput=strtok(NULL,",")))
  // 创建一个

打印机设备句柄
  if((hdcprint=CreateDC(szDriver,szDevice,szOutput,NULL))!=0)
  {
   if(StartDoc(hdcprint,&di)>0) //开始执行一个打印作业
   {
    StartPage(hdcprint); //打印机走纸,开始打印
    SaveDC(hdcprint); //保存打印机设备句柄
    // 输出一行文字
    TextOut(hdcprint,1,1,"热烈祝贺编程实例出版发行!",16);
    RestoreDC(hdcprint,-1); //恢复打印机设备句柄
    EndPage(hdcprint); //打印机停纸,停止打印
    EndDoc(hdcprint); //结束一个打印作业
    MessageBox("打印完毕!","提示",MB_ICONINFORMATION);
   }
   // 用API函数DeleteDC销毁一个打印机设备句柄
   DeleteDC(hdcprint);
  }
  else
  {
   MessageBox("没有默认打印机,或者没有安装打印机!");
   return;
  }
 }
...全文
251 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
笨笨仔 2016-12-05
  • 打赏
  • 举报
回复
楼主要讨论的是打印机接口问题?
Yofoo 2016-12-03
  • 打赏
  • 举报
回复
区别在于硬件, 串口,并口这种老式的打印机只能打印文字, 一般是无法打印图形, 无法调字体大小等 后面的打印机是需要安装驱动, 可以打印图形的, 如果考虑以后升级加功能, 这种肯定好些, 当然代码也会复杂些

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧