Browse Source

加上对标签打印机的检测

zhangyang 6 years ago
parent
commit
4f946cb85d
2 changed files with 52 additions and 27 deletions
  1. 49 26
      lewaimai_pos_windows/tool/CPosPrinter.cpp
  2. 3 1
      lewaimai_pos_windows/tool/CPosPrinter.h

+ 49 - 26
lewaimai_pos_windows/tool/CPosPrinter.cpp

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

+ 3 - 1
lewaimai_pos_windows/tool/CPosPrinter.h

@@ -38,7 +38,9 @@ private:
 	int WriteData(string meg);
 	int WriteBuf(const char* buf, int len);
 
-	bool PortTest(const TCHAR* Port, HANDLE hPort);
+	bool PortTest(HANDLE hPort);
+
+	void ReadStatus();
 
 	int POS_Reset(void);
 	int POS_FeedLine(void);