16,548
社区成员




#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;
}
}