|
|
@@ -70,7 +70,7 @@ bool CPosPrinter::InitShouyin()
|
|
|
|
|
|
LOG_INFO("打开usb端口,准备进行打印机检测! hPort:" << hPort);
|
|
|
|
|
|
- if(PortTest(Port, hPort) == true)
|
|
|
+ if(PortTest(hPort) == true)
|
|
|
{
|
|
|
//端口测试连通,保存起来
|
|
|
PrinterHandle newHandle;
|
|
|
@@ -110,7 +110,7 @@ bool CPosPrinter::InitShouyin()
|
|
|
//这个表示并口可以使用
|
|
|
LOG_INFO("找到并口,准备进行打印机检测! hPort:" << hPort);
|
|
|
|
|
|
- if(PortTest(LptStr.c_str(), hPort) == true)
|
|
|
+ if(PortTest(hPort) == true)
|
|
|
{
|
|
|
//并口测试连通,保存起来
|
|
|
PrinterHandle newHandle;
|
|
|
@@ -1091,11 +1091,15 @@ int CPosPrinter::WriteBuf(const char* buf, int len)
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- *测试这个并口是否连通的
|
|
|
+ *测试打印机是否连接,以及是否标签打印机
|
|
|
+ *有的标签打印机的vid和pid跟热敏打印机一样,因此不能通过GetPrinterType函数排除,在这里通过标签打印机的查询状态指令,如果返回数据说明肯定是标签打印机
|
|
|
+ *这里不能用热敏打印机的查询指令,因为测试发现有的热敏打印机会返回状态,有的不会返回,如果不返回的时候就没法确定这台打印机到底是热敏还是标签
|
|
|
+ *当然,这里也不能保证所有标签打印机都会返回,但是只要有返回就可以直接排除(有些热敏和标签两用的咋办。。。)
|
|
|
**/
|
|
|
-bool CPosPrinter::PortTest(const TCHAR* Port, HANDLE hPort)
|
|
|
+bool CPosPrinter::PortTest(HANDLE hPort)
|
|
|
{
|
|
|
- char chInitCode[3] = { 0x1D, 0x49, 0x42 };
|
|
|
+ //标签打印机的查询状态指令
|
|
|
+ char chInitCode[3] = { 0x1b, 0x21, 0x3f };
|
|
|
|
|
|
DWORD dwWrite;
|
|
|
|
|
|
@@ -1113,39 +1117,53 @@ bool CPosPrinter::PortTest(const TCHAR* Port, HANDLE hPort)
|
|
|
{
|
|
|
if(GetLastError() == ERROR_IO_PENDING)
|
|
|
{
|
|
|
- DWORD ret = WaitForSingleObject(hPort, 500);
|
|
|
+ DWORD ret = WaitForSingleObject(hPort, 500);
|
|
|
if(ret == 0)
|
|
|
{
|
|
|
- LOG_INFO("printer is connect, handle:" << hPort);
|
|
|
+ LOG_INFO("printer is connect, handle:" << hPort);
|
|
|
|
|
|
- HANDLE hPort_2 = CreateFile(Port, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
|
+ //开始读取返回值,如果读到说明这个打印机是一个标签打印机
|
|
|
+ char chBuffer[2];
|
|
|
+ memset(chBuffer, 0, 2);
|
|
|
|
|
|
- if (hPort_2 == INVALID_HANDLE_VALUE)
|
|
|
+ OVERLAPPED overlap2;
|
|
|
+ memset(&overlap2, 0, sizeof(overlap2));
|
|
|
+
|
|
|
+ overlap2.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);;//创建时无信号的事件
|
|
|
+
|
|
|
+ DWORD dwReadSize = 0;
|
|
|
+ BOOL bResult = ReadFile(hPort, chBuffer, 1, &dwReadSize, &overlap2);
|
|
|
+ if (!bResult)
|
|
|
{
|
|
|
- // 打开端口失败
|
|
|
- DWORD error = GetLastError();
|
|
|
+ if (ERROR_IO_PENDING == GetLastError()) //函数返回ERROR_IO_PENDING,表明USB正在进行读操作
|
|
|
+ {
|
|
|
+ WaitForSingleObject(overlap2.hEvent, 500);
|
|
|
+
|
|
|
+ DWORD numread = 0;
|
|
|
+ BOOL rc = GetOverlappedResult(hPort, &overlap2, &numread, FALSE);
|
|
|
|
|
|
- if (error == 2)
|
|
|
+ if (numread == 1)
|
|
|
+ {
|
|
|
+ //这是一个标签打印机
|
|
|
+ LOG_INFO("this is a biaoqian printer, handle:" << hPort);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
- //没有指定的文件
|
|
|
- LOG_INFO("没有找对对应的usb端口");
|
|
|
+ return false;
|
|
|
}
|
|
|
- else if (error == 5)
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (dwReadSize == 1)
|
|
|
{
|
|
|
- LOG_INFO("usb端口被占用!");
|
|
|
+ //这是一个标签打印机
|
|
|
+ LOG_INFO("this is a biaoqian printer, handle:" << hPort);
|
|
|
+ return false;
|
|
|
}
|
|
|
-
|
|
|
- return false;
|
|
|
}
|
|
|
|
|
|
- char chBuffer[100];
|
|
|
- memset(chBuffer, 0, 100);
|
|
|
-
|
|
|
- DWORD dwReadSize = 0;
|
|
|
- BOOL bResult = ReadFile(hPort_2, chBuffer, 99, &dwReadSize, NULL);
|
|
|
-
|
|
|
- LOG_INFO("buffer:" << chBuffer);
|
|
|
-
|
|
|
return true;
|
|
|
}
|
|
|
else
|
|
|
@@ -1158,6 +1176,11 @@ bool CPosPrinter::PortTest(const TCHAR* Port, HANDLE hPort)
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+void CPosPrinter::ReadStatus()
|
|
|
+{
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
int CPosPrinter::POS_Reset(void)
|
|
|
{
|
|
|
char s[2] = {0x1B, 0x40};
|