手持PDA,手持数据采集器,盘点 机,数据采集器 服务热线:400-6636-496

国内专业的行业手持终端提供商,产品与解决方案广泛应用于医药,物流快递、零售、制造行 业。

PT300手持机外接微型打印机

来源: 时间:2014-05-28

  微型打印机很多都是通过串口进行控制的,按照微打的指令格式向其发送打印命令和要打印的内容。这种打印机使用起来非常方便,对于一般的打印需求都可以实现,而且还可以打印条形码。

       Windows CE操作系统下,通过应用程序来控制串口微型打印机,其实很简单。第一步就是打开串口,如:

// 打开串口,设置串口参数

bool CprintDlg::OpenPort(LPCTSTR Port, int BaudRate, int DataBits, int StopBits, int Parity)

{

       COMMTIMEOUTS CommTimeOuts;

 

       m_hComm = CreateFile(Port, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);

       if(m_hComm == INVALID_HANDLE_VALUE)

       {

              MessageBox(_T("Error 0002."));

              return FALSE;

       }

 

       GetCommState(m_hComm, &dcb);                                        

       dcb.BaudRate = BaudRate;                 

       dcb.ByteSize = DataBits;

       dcb.Parity = Parity;

       dcb.StopBits = StopBits; 

       dcb.fParity = FALSE;                                         

       dcb.fBinary = TRUE;

       dcb.fDtrControl = 0;                                    

       dcb.fRtsControl = 0;

       dcb.fOutX = 0;

       dcb.fInX = 0;

       dcb.fTXContinueOnXoff = 0;

 

       SetCommMask(m_hComm, EV_RXCHAR);   

       SetupComm(m_hComm, 16384, 16384);

       if(!SetCommState(m_hComm, &dcb))                             {

              MessageBox(_T("Error 0003!"));

              ClosePort();

              return FALSE;

       }

 

       GetCommTimeouts(m_hComm, &CommTimeOuts);             

       CommTimeOuts.ReadIntervalTimeout = 100;                          CommTimeOuts.ReadTotalTimeoutMultiplier = 1;             

       CommTimeOuts.ReadTotalTimeoutConstant = 100;                CommTimeOuts.WriteTotalTimeoutMultiplier = 0;

       CommTimeOuts.WriteTotalTimeoutConstant = 0;           

       if(!SetCommTimeouts(m_hComm, &CommTimeOuts))

       {

              MessageBox(_T("Error 0004!"));

              ClosePort();

              return FALSE;

       }

 

       PurgeComm(m_hComm, PURGE_TXCLEAR | PURGE_RXCLEAR);           return TRUE;

}

       然后可以按照串口微打所指定的数据格式,来向微打发送要打印的内容,或者控制字符。这里以北京荣达创新科技有限公司生产的RD_TH32型微型打印机为例,为了使用方便,示例程序中,封装了几个函数。

       第一个是打印字符:

// 打印字符

void CprintDlg::print_zf(CString str_print)

{

       DWORD dwActlen = 0;

       DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,str_print,-1,NULL,0,NULL,FALSE);

       TRACE(_T("dwNum = %d\n"),dwNum); //1个汉字占2个字节,1个字母占1个字节,1个结束符占1个字节

       char *pszText;

       pszText = new char[dwNum];

       if(!pszText)

       {

              delete []pszText;

       }

       WideCharToMultiByte(CP_OEMCP,NULL,str_print,-1,pszText,dwNum,NULL,FALSE);

       pszText[dwNum - 1] = 0x0d;

       if (!WriteFile(m_hComm, pszText, dwNum, &dwActlen, NULL))

       {

              MessageBox(_T("Send Data failed!"));

       }    

       delete []pszText;

       pszText = NULL;

}

       第二个是打印回车:

// 打印回车(换行)

void CprintDlg::print_hh(void)

{

       DWORD dwActlen = 0;

       char *pszText;

       pszText = new char[1];

       if(!pszText)

       {

              delete []pszText;

       }

       *pszText = 0x0d;

       if (!WriteFile(m_hComm, pszText, 1, &dwActlen, NULL))

       {

              MessageBox(_T("Send Data failed!"));

       }    

       delete []pszText;

       pszText = NULL;

}

       第三个是设置n点行间距:

void CprintDlg::print_hjj(int n)

{

       DWORD dwActlen = 0;

       char *pszText;

       pszText = new char[3];

       if(!pszText)

       {

              delete pszText;

       }

       pszText[0] = 0x1b;

       pszText[1] = 0x31;

       pszText[2] = n;

       if (!WriteFile(m_hComm, pszText, 3, &dwActlen, NULL))

       {

              MessageBox(_T("Send Data failed!"));

       }    

       delete []pszText;

       pszText = NULL;

}

       这三个函数封装完毕之后,在PT300手持机上,来通过应用程序控制微打就变成了一个非常简单的事情。比如这里要打印“北京蓝海微芯科技发展有限公司”

这一行字,那么就用下面这几行代码就可以了。

       OpenPort(_T("COM1:"), 9600, 8, 0, NOPARITY);

print_hjj(8);

CString str1 = _T("北京蓝海微芯科技发展有限公司");

print_zf(str1);

就这么简单的几行代码,就可以控制微型打印机打印了,应该算是很方便了吧。