Browse Source

修复打印机和称重电子秤抢串口导致的异常

张洋 6 days ago
parent
commit
146fd69cbf

BIN
bin/Win32/Debug/zhipuzi_pos_windows/DuiLib_d.dll


BIN
dll/debug/DuiLib_d.dll


+ 10 - 0
zhipuzi_pos_windows/helper/CSerialPort.cpp

@@ -83,6 +83,11 @@ bool CSerialPort::openComm()
             TCHAR szBuf[1024] = { 0 };
             wsprintf(szBuf, L"串口设置失败,错误代码: %d", GetLastError());
             //MessageBox(NULL, szBuf, TEXT("ERROR"), MB_OK);
+
+            //设置失败也要把句柄收掉,否则每次重连都会泄漏一个句柄(R51)
+            CloseHandle(m_hComm);
+            m_hComm = INVALID_HANDLE_VALUE;
+
             return false;
         }
 
@@ -112,6 +117,11 @@ void CSerialPort::closeComm()
 	}
 
     CloseHandle(m_hComm);
+    m_hComm = INVALID_HANDLE_VALUE;
+
+    //必须复位开关标志,否则 getIsOpen() 会一直返回 true,
+    //上层就没法判断「电子秤到底连上没有」(R51)
+    m_bOpen = false;
 }
 
 

+ 45 - 6
zhipuzi_pos_windows/page/CDiandanPageUI.cpp

@@ -4294,20 +4294,59 @@ void CDiandanPageUI::HandleDiandanAIShibieResult()
 
 void CDiandanPageUI::HandleChengzhongValueChange()
 {
-	std::string weight = CChengzhongWorker::GetInstance()->GetWeight();
+	CChengzhongWorker* pWorker = CChengzhongWorker::GetInstance();
+
+	std::string weight = pWorker->GetWeight();
+
+	bool is_work = pWorker->GetIsWork();
+	bool has_signal = pWorker->HasSignal();
 
 	CControlUI* pWendingStatus = static_cast<CControlUI*>(this->FindSubControl(_T("diandan_page_status_chengzhong_wending")));
-	if (CChengzhongWorker::GetInstance()->GetIsWending() == true)
+	if (pWendingStatus != NULL)
 	{
-		pWendingStatus->SetBkImage(L"deng_on.png");
+		if (is_work == true && has_signal == true && pWorker->GetIsWending() == true)
+		{
+			pWendingStatus->SetBkImage(L"deng_on.png");
+		}
+		else
+		{
+			pWendingStatus->SetBkImage(L"deng_off.png");
+		}
 	}
-	else
+
+	CLabelUI* pLabel = static_cast<CLabelUI*>(this->FindSubControl(_T("diandan_page_label_chengzhong_value")));
+	CLabelUI* pUnit = static_cast<CLabelUI*>(this->FindSubControl(_T("diandan_page_label_chengzhong_unit")));
+
+	if (pLabel == NULL)
+	{
+		return;
+	}
+
+	if (is_work == false || has_signal == false)
 	{
-		pWendingStatus->SetBkImage(L"deng_off.png");
+		//电子秤没连上、或者连上了但收不到数据:把话说明白,
+		//别让用户对着一个恒为 0.000 的读数猜到底是秤坏了还是软件坏了(R51)
+		pLabel->SetFont(12);
+		pLabel->SetTextColor(0xFF999999);
+		pLabel->SetText(is_work == false ? L"未连接" : L"无信号");
+
+		if (pUnit != NULL)
+		{
+			pUnit->SetText(L"");
+		}
+
+		return;
 	}
 
-	CLabelUI* pLabel = static_cast<CLabelUI*>(this->FindSubControl(_T("diandan_page_label_chengzhong_value")));
+	//恢复正常显示:字号、颜色、单位都跟着回到原样
+	pLabel->SetFont(132);
+	pLabel->SetTextColor(0xFF2E9B5C);
 	pLabel->SetText(CLewaimaiString::UTF8ToUnicode(weight).c_str());
+
+	if (pUnit != NULL)
+	{
+		pUnit->SetText(L"公斤");
+	}
 }
 
 void CDiandanPageUI::ClickAixuexi()

+ 20 - 0
zhipuzi_pos_windows/page/CSettingPageUI.cpp

@@ -1899,6 +1899,8 @@ void CSettingPageUI::HandleSelectChangeMsg(TNotifyUI& msg)
 		dianzicheng_layout->SetVisible(true);
 
 		CChengzhongWorker::GetInstance()->RestartWork();
+
+		this->RefreshPrinterChannelsForDianzicheng();
 	}
 	else if (name == _T("setting_dianzicheng_weilianjie"))
 	{
@@ -1908,6 +1910,22 @@ void CSettingPageUI::HandleSelectChangeMsg(TNotifyUI& msg)
 		dianzicheng_layout->SetVisible(false);
 
 		CChengzhongWorker::GetInstance()->RestartWork();
+
+		this->RefreshPrinterChannelsForDianzicheng();
+	}
+}
+
+//电子秤启用/停用/换串口之后,打印机要跳过的串口集合就变了(R52 / R53)。
+//串口是独占的:两边都去连同一个口就会互相抢,秤那边表现成读数恒为 0。
+//只有这两种模式可能去占串口:智能识别(枚举全部口)与显式串口(用户指定的那个口)。
+//必须重建而不是改配置:改设置时旧通道可能已经把那个口打开了,不重建它不会自己让出来。
+void CSettingPageUI::RefreshPrinterChannelsForDianzicheng()
+{
+	std::string printer_leixing = CSetting::GetInstance()->GetParam("setting_printer_leixing");
+
+	if (printer_leixing == "auto" || printer_leixing == "chuankou")
+	{
+		CPosPrinterWorker::GetInstance()->RefreshShouyinChannels();
 	}
 }
 
@@ -2114,6 +2132,8 @@ void CSettingPageUI::HandleItemSelectMsg(TNotifyUI& msg)
 		CSetting::GetInstance()->SetParam("setting_dianzicheng_com", CLewaimaiString::UnicodeToUTF8(com_device));
 
 		CChengzhongWorker::GetInstance()->RestartWork();
+
+		this->RefreshPrinterChannelsForDianzicheng();
 	}
 	else if (name == _T("setting_dianzicheng_botelv"))
 	{

+ 3 - 0
zhipuzi_pos_windows/page/CSettingPageUI.h

@@ -13,6 +13,9 @@ public:
 	void HandleClickMsg(TNotifyUI& msg);
 	void HandleSelectChangeMsg(TNotifyUI& msg);
 	void HandleItemSelectMsg(TNotifyUI& msg);
+
+	//电子秤启用/停用/换串口之后,让打印通道按新配置重建一次(R52 / R53)
+	void RefreshPrinterChannelsForDianzicheng();
 	void HandleTextChangedMsg(TNotifyUI& msg);
 	void HandleTextCapture(std::string content);
 	bool HandleCustomMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);

+ 45 - 6
zhipuzi_pos_windows/page/CYubaozhuangbiaoqianPageUI.cpp

@@ -681,20 +681,59 @@ void CYubaozhuangbiaoqianPageUI::HandleDiandanAIShibieResult()
 
 void CYubaozhuangbiaoqianPageUI::HandleChengzhongValueChange()
 {
-	std::string weight = CChengzhongWorker::GetInstance()->GetWeight();
+	CChengzhongWorker* pWorker = CChengzhongWorker::GetInstance();
+
+	std::string weight = pWorker->GetWeight();
+
+	bool is_work = pWorker->GetIsWork();
+	bool has_signal = pWorker->HasSignal();
 
 	CControlUI* pWendingStatus = static_cast<CControlUI*>(this->FindSubControl(_T("yubaozhuangbiaoqian_page_status_chengzhong_wending")));
-	if (CChengzhongWorker::GetInstance()->GetIsWending() == true)
+	if (pWendingStatus != NULL)
 	{
-		pWendingStatus->SetBkImage(L"deng_on.png");
+		if (is_work == true && has_signal == true && pWorker->GetIsWending() == true)
+		{
+			pWendingStatus->SetBkImage(L"deng_on.png");
+		}
+		else
+		{
+			pWendingStatus->SetBkImage(L"deng_off.png");
+		}
 	}
-	else
+
+	CLabelUI* pLabel = static_cast<CLabelUI*>(this->FindSubControl(_T("yubaozhuangbiaoqian_page_label_chengzhong_value")));
+	CLabelUI* pUnit = static_cast<CLabelUI*>(this->FindSubControl(_T("yubaozhuangbiaoqian_page_label_chengzhong_unit")));
+
+	if (pLabel == NULL)
+	{
+		return;
+	}
+
+	if (is_work == false || has_signal == false)
 	{
-		pWendingStatus->SetBkImage(L"deng_off.png");
+		//电子秤没连上、或者连上了但收不到数据:把话说明白,
+		//别让用户对着一个恒为 0.000 的读数猜到底是秤坏了还是软件坏了(R51)
+		pLabel->SetFont(12);
+		pLabel->SetTextColor(0xFF999999);
+		pLabel->SetText(is_work == false ? L"未连接" : L"无信号");
+
+		if (pUnit != NULL)
+		{
+			pUnit->SetText(L"");
+		}
+
+		return;
 	}
 
-	CLabelUI* pLabel = static_cast<CLabelUI*>(this->FindSubControl(_T("yubaozhuangbiaoqian_page_label_chengzhong_value")));
+	//恢复正常显示:字号、颜色、单位都跟着回到原样
+	pLabel->SetFont(132);
+	pLabel->SetTextColor(0xFF2E9B5C);
 	pLabel->SetText(CLewaimaiString::UTF8ToUnicode(weight).c_str());
+
+	if (pUnit != NULL)
+	{
+		pUnit->SetText(L"公斤");
+	}
 }
 
 void CYubaozhuangbiaoqianPageUI::ZhiLing()

+ 13 - 0
zhipuzi_pos_windows/wnd/CChengzhongWnd.cpp

@@ -134,6 +134,19 @@ LRESULT CChengzhongWnd::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL&
 	return 0;
 }
 
+void CChengzhongWnd::OnFinalMessage(HWND /*hWnd*/)
+{
+	//WindowImplBase::OnFinalMessage(hWnd);
+
+	//弹框销毁了,得把 worker 里记着的窗口句柄清掉:
+	//否则称重线程还会一直往这个已经失效的 HWND PostMessage(R51)
+	CChengzhongWorker::GetInstance()->SetHWND(NULL);
+
+	m_pm.RemovePreMessageFilter(this);
+
+	//delete this;
+}
+
 LRESULT CChengzhongWnd::OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
 {
 	bHandled = FALSE;

+ 2 - 7
zhipuzi_pos_windows/wnd/CChengzhongWnd.h

@@ -18,13 +18,8 @@ public:
 		return UI_CLASSSTYLE_DIALOG;
 	};
 
-	void OnFinalMessage(HWND /*hWnd*/)
-	{
-		//WindowImplBase::OnFinalMessage(hWnd);
-		m_pm.RemovePreMessageFilter(this);
-
-		//delete this;
-	};
+	//实现见 CChengzhongWnd.cpp(那里要清 worker 里的窗口句柄,R51)
+	void OnFinalMessage(HWND /*hWnd*/);
 
 	void Init();
 

+ 97 - 1
zhipuzi_pos_windows/worker/CChengzhongWorker.cpp

@@ -39,6 +39,16 @@ void CChengzhongWorker::RestartWork()
 	{
 		this->RestartSerial();
 	}
+	else
+	{
+		//用户改成了「未连接」,把串口让出来
+		m_serial.closeComm();
+
+		m_serial_ok = false;
+	}
+
+	//刚手动重连过,别让循环里的连接自愈马上又插一脚
+	m_last_connect_tick = ::GetTickCount64();
 
 	this->UpdateShow("0.000");
 }
@@ -53,17 +63,67 @@ void CChengzhongWorker::HandleWork()
 		this->RestartSerial();
 	}
 
+	m_last_connect_tick = ::GetTickCount64();
+
 	//暂存串口读到的数据,避免有的数据中间截断导致格式混乱
 	std::string chuankou_string = "";
 
 	while (m_is_work)
 	{
+		//===== 连接自愈(R51)=====
+		//原实现只在进线程时连一次串口:只要那一次失败(USB 转串口晚枚举、驱动没起来、
+		//换了 USB 口、设备重新枚举),后面就永远在 Sleep(100) 里空转,界面钉死在 0.000,
+		//而且完全看不出「没连上」。这里按固定间隔重读配置并重试,让秤插好之后能自己恢复。
+		ULONGLONG dwNow = ::GetTickCount64();
+
+		if (dwNow - m_last_connect_tick >= SERIAL_RECONNECT_INTERVAL_MS)
+		{
+			m_last_connect_tick = dwNow;
+
+			m_dianzicheng_lianjie = CSetting::GetInstance()->GetParam("setting_dianzicheng_is_lianjie");
+			m_dianzicheng_xinghao = CSetting::GetInstance()->GetParam("setting_dianzicheng_xinghao");
+
+			if (m_dianzicheng_lianjie == "1")
+			{
+				if (m_serial.getIsOpen() == false)
+				{
+					//没连上(或者连接掉了),重连一次
+					this->RestartSerial();
+				}
+			}
+			else if (m_serial.getIsOpen() == true)
+			{
+				//用户改成了「未连接」,把串口让出来
+				m_serial.closeComm();
+			}
+		}
+
+		//串口开关状态变了要立刻告诉界面,否则界面会一直挂着「未连接」不刷新
+		this->SyncSerialState();
+
+		//信号从「有」变「无」(或者反过来)时补推一次:
+		//没数据的时候 UpdateShow 不会被调用,界面就永远刷不出「无信号」
+		bool has_signal = this->HasSignal();
+		if (has_signal != m_last_notify_signal)
+		{
+			m_last_notify_signal = has_signal;
+
+			this->NotifyWeightChanged();
+		}
+
 		if (m_dianzicheng_lianjie == "0")
 		{
 			Sleep(100);
 			continue;
 		}
 
+		if (m_serial_ok == false)
+		{
+			//串口还没打开,等下一轮重连
+			Sleep(100);
+			continue;
+		}
+
 		std::string new_weight;
 
 		//不同型号的电子秤,数据格式可能不一样,处理方式不一样
@@ -121,6 +181,9 @@ void CChengzhongWorker::HandleWork()
 			//把所有读到的内容,拼接到chuankou_string后面,避免有的数据中间截断导致格式混乱
 			chuankou_string = a;
 
+			//读到数据了:记下时间,让 HasSignal() 知道秤在出数(R51)
+			m_last_data_tick = ::GetTickCount64();
+
 			//走到这里说明已经读满22个字节了,接下来判断格式是否正确
 			if (chuankou_string.at(20) != 0x0A || chuankou_string.at(21) != 0x0D)
 			{
@@ -224,7 +287,10 @@ void CChengzhongWorker::HandleWork()
 
 			//把所有读到的内容,拼接到chuankou_string后面,避免有的数据中间截断导致格式混乱
 			chuankou_string = a;
-			//LOG_INFO(("称重串口收到数据" + chuankou_string).c_str());		
+			//LOG_INFO(("称重串口收到数据" + chuankou_string).c_str());
+
+			//读到数据了:记下时间,让 HasSignal() 知道秤在出数(R51)
+			m_last_data_tick = ::GetTickCount64();		
 			
 			if (chuankou_string.at(0) != 0x01 || chuankou_string.at(1) != 0x02 || chuankou_string.at(13) != 0x03 || chuankou_string.at(14) != 0x04)
 			{
@@ -281,10 +347,20 @@ void CChengzhongWorker::RestartSerial()
 	m_serial.setBaudRate(atoi(setting_dianzicheng_botelv.c_str()));
 
 	bool ret = m_serial.openComm();
+
+	//把真实结果记下来:以前这里只是 UpdateShow("0.000"),界面上看不出「没连上」(R51)
+	m_serial_ok = ret;
+
 	if (ret == false)
 	{
 		this->UpdateShow("0.000");
 	}
+	else
+	{
+		//串口刚打开,把这一刻当成「有信号」的起点:
+		//8 秒内要是还收不到数据,界面就会提示「无信号」
+		m_last_data_tick = ::GetTickCount64();
+	}
 }
 
 void CChengzhongWorker::UpdateShow(std::string new_weight)
@@ -323,6 +399,11 @@ void CChengzhongWorker::UpdateShow(std::string new_weight)
 		m_is_wending = true;
 	}
 
+	this->NotifyWeightChanged();
+}
+
+void CChengzhongWorker::NotifyWeightChanged()
+{
 	if (m_hwnd != NULL)
 	{
 		PostMessage(m_hwnd, WM_CHENGZHONG_SUCCESS, 0, 0);
@@ -334,6 +415,21 @@ void CChengzhongWorker::UpdateShow(std::string new_weight)
 	}
 }
 
+void CChengzhongWorker::SyncSerialState()
+{
+	bool is_open = m_serial.getIsOpen();
+
+	if (is_open == m_serial_ok)
+	{
+		return;
+	}
+
+	m_serial_ok = is_open;
+
+	//串口开关状态变了,界面要立刻知道,否则会一直挂着「未连接」不刷新(R51)
+	this->NotifyWeightChanged();
+}
+
 void CChengzhongWorker::Zhiling()
 {
 

+ 40 - 1
zhipuzi_pos_windows/worker/CChengzhongWorker.h

@@ -46,9 +46,24 @@ public:
 		return m_weight;
 	}
 
+	//电子秤是否可用:串口真的打开了才算数。
+	//以前直接返回 m_serial.getIsOpen(),但 closeComm() 不复位 m_bOpen,
+	//那个值一旦打开过就恒为 true,界面上永远显示不出「没连上」(R51)
 	bool GetIsWork()
 	{
-		return m_serial.getIsOpen();
+		return m_serial_ok;
+	}
+
+	//串口打开之后有没有在出数据:SERIAL_SIGNAL_TIMEOUT_MS 内收到过才算有信号。
+	//用来把「秤没插好 / 波特率不对 / 线松了」和「重量真的是 0」区分开(R51)
+	bool HasSignal()
+	{
+		if (m_serial_ok == false || m_last_data_tick == 0)
+		{
+			return false;
+		}
+
+		return (::GetTickCount64() - m_last_data_tick) <= SERIAL_SIGNAL_TIMEOUT_MS;
 	}
 
 	bool GetIsWending()
@@ -61,6 +76,18 @@ public:
 	void Qupi();
 
 private:
+	//收到数据之后,超过这么久还没再收到,就认为「无信号」(R51)
+	enum { SERIAL_SIGNAL_TIMEOUT_MS = 8000 };
+
+	//两次尝试重连之间的间隔(R51)
+	enum { SERIAL_RECONNECT_INTERVAL_MS = 2000 };
+
+	//把最新重量推给主窗口和称重弹框
+	void NotifyWeightChanged();
+
+	//串口开关状态有变化时补推一次,让界面马上刷新出「未连接」(R51)
+	void SyncSerialState();
+
 	bool m_is_work = false;
 
 	std::mutex m_worker_mutex;
@@ -76,6 +103,18 @@ private:
 
 	CSerialPort m_serial;
 
+	//串口当前是否真的打开了。给 UI 用,由工作线程维护(R51)
+	bool m_serial_ok = false;
+
+	//最后一次读到有效数据的时刻,配合 HasSignal() 判断秤有没有在出数
+	ULONGLONG m_last_data_tick = 0;
+
+	//最后一次尝试重连的时刻,给连接自愈节流
+	ULONGLONG m_last_connect_tick = 0;
+
+	//上一次推给界面的「有信号」状态,只在变化时补推
+	bool m_last_notify_signal = false;
+
 	//称重金额是否稳定
 	bool m_is_wending = false;
 

+ 63 - 119
zhipuzi_pos_windows/worker/CPosPrinterWorker.cpp

@@ -21,6 +21,39 @@ const DEVPROPKEY PKEY_Device_BusReportedDeviceDesc_local =
 	4
 };
 
+//把配置里存的串口名统一成裸名(形如 COM3),只用于比较(R53)。
+//允许配置里带 \\.\ 前缀(手工改过配置文件的情况),避免比较时对不上。
+static std::wstring ToBareComName(const std::wstring& com_path)
+{
+	std::wstring s = com_path;
+
+	if (s.length() >= 4 && s.compare(0, 4, L"\\\\.\\") == 0)
+	{
+		s = s.substr(4);
+	}
+	else if (s.length() >= 4 && s.compare(0, 4, L"\\\\?\\") == 0)
+	{
+		s = s.substr(4);
+	}
+
+	return s;
+}
+
+//串口必须用 \\.\COMx 的形式打开(R53):裸口名 "COM3" 能打开只是 DOS 设备名的历史兼容,
+//而 "COM10" 及以上不走设备名解析,会被当成普通文件名 ⇒ CreateFile 直接失败。
+//CSerialPort(电子秤那边)一直用的是 \\.\ 前缀,打印机这里漏了。
+static std::wstring ToComDevicePath(const std::wstring& com_path)
+{
+	std::wstring bare = ToBareComName(com_path);
+
+	if (bare.empty())
+	{
+		return com_path;
+	}
+
+	return L"\\\\.\\" + bare;
+}
+
 CPosPrinterWorker::CPosPrinterWorker()
 {
 }
@@ -73,6 +106,16 @@ void CPosPrinterWorker::StartShouyinChannels()
 	//收集本次要打开的端口路径及其类型
 	std::vector<std::pair<std::wstring, PrinterPortKind>> ports;
 
+	//电子秤占用的串口:打印机在**任何**模式下都不能去碰(R52 / R53)。
+	//串口是独占打开的(OpenComPort 用 share=0 的 CreateFile),两边都去连同一个口就会互相抢 ——
+	//谁先打开谁赢,输的那个一直打不开,秤那边表现成称重读数恒为 0。
+	//另外 OpenComPort 打开成功后会顺手把波特率改成 19200,抢到秤的口还会踩坏秤的波特率。
+	std::wstring ws_dianzicheng_com;
+	if (CSetting::GetInstance()->GetParam("setting_dianzicheng_is_lianjie") == "1")
+	{
+		ws_dianzicheng_com = ToBareComName(CLewaimaiString::UTF8ToUnicode(CSetting::GetInstance()->GetParam("setting_dianzicheng_com")));
+	}
+
 	if (printer_leixing == "auto")
 	{
 		//自动模式:同时检测usb、并口、串口
@@ -101,8 +144,15 @@ void CPosPrinterWorker::StartShouyinChannels()
 
 		CComHelper helper;
 		std::vector<std::wstring> comVector = helper.getComPort();
+
 		for (std::vector<std::wstring>::iterator it = comVector.begin(); it != comVector.end(); it++)
 		{
+			if (ws_dianzicheng_com.empty() == false && _wcsicmp(ToBareComName(*it).c_str(), ws_dianzicheng_com.c_str()) == 0)
+			{
+				//这是电子秤的串口,打印机不要去碰
+				continue;
+			}
+
 			ports.push_back(std::make_pair(*it, PrinterPortKind::Com));
 		}
 	}
@@ -125,7 +175,14 @@ void CPosPrinterWorker::StartShouyinChannels()
 		std::wstring ws_printer_com = CLewaimaiString::UTF8ToUnicode(printer_com);
 		if (!ws_printer_com.empty())
 		{
-			ports.push_back(std::make_pair(ws_printer_com, PrinterPortKind::Com));
+			//显式串口模式同样可能选中电子秤的口(R53):也跳过。
+			//宁可这台打印机不出票,也不能让它把秤的口抢掉 —— 抢掉之后称重恒 0,界面上还看不出来。
+			//设置里给打印机换一个别的串口即可。
+			if (ws_dianzicheng_com.empty() == true
+				|| _wcsicmp(ToBareComName(ws_printer_com).c_str(), ws_dianzicheng_com.c_str()) != 0)
+			{
+				ports.push_back(std::make_pair(ws_printer_com, PrinterPortKind::Com));
+			}
 		}
 	}
 
@@ -370,8 +427,12 @@ bool CPosPrinterWorker::OpenChannelHandle(std::shared_ptr<CPortSendChannel> ch)
 
 HANDLE CPosPrinterWorker::OpenComPort(const std::wstring& com_path)
 {
+	//统一补 \\.\ 前缀(R53):裸口名在 COM1~COM9 上能碰巧打开(DOS 设备名兼容),
+	//但 COM10 及以上会被当成普通文件名,CreateFile 直接失败。
+	std::wstring real_path = ToComDevicePath(com_path);
+
 	//同步句柄(不带 FILE_FLAG_OVERLAPPED),WriteFile 写进驱动缓冲即返回,无需超时等待
-	HANDLE hPort = CreateFile(com_path.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+	HANDLE hPort = CreateFile(real_path.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
 
 	if (hPort == INVALID_HANDLE_VALUE)
 	{
@@ -749,68 +810,6 @@ void CPosPrinterWorker::SendDataToChufangPirnter(ChufangPrinterContent chufang_d
 	m_socket.close();
 }
 
-//自动识别用于收银小票的USB打印机列表
-void CPosPrinterWorker::InitUsb()
-{
-	//设置中文字符
-	setlocale(LC_CTYPE, "chs");
-
-	//取设备路径
-	m_usb_devices.clear();
-	int nDevice = GetDevicePath((LPGUID)&USB_GUID, m_usb_devices);
-	//LOG_INFO("可用的USB打印机数量:" << nDevice);
-
-	//添加usb端口
-	int i = 0;
-
-	while (i < nDevice)
-	{
-		std::string setting_biaoqian_printer_usb = CSetting::GetInstance()->GetParam("setting_biaoqian_printer_usb");
-		std::wstring ws_setting_biaoqian_printer_usb = CLewaimaiString::UTF8ToUnicode(setting_biaoqian_printer_usb);
-
-		if (CSetting::GetInstance()->GetParam("setting_is_new_waimai_biaoqian_printer") == "1" && ws_setting_biaoqian_printer_usb == m_usb_devices[i])
-		{
-			//碰到了一个在设置中心明确设置的标签打印机,过滤掉
-			i++;
-			continue;
-		}
-
-		//LOG_INFO("准备打开端口 Port = " << m_usb_devices[i].c_str());
-
-		HANDLE hPort = CreateFile(m_usb_devices[i].c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
-
-		if (hPort == INVALID_HANDLE_VALUE)
-		{
-			//LOG_INFO("打开USB端口失败, Port = " << m_usb_devices[i].c_str());
-
-			// 打开端口失败
-			DWORD error = GetLastError();
-
-			if (error == 2)
-			{
-				//没有指定的文件
-				//LOG_INFO("没有找对对应的usb端口");
-			}
-			else if (error == 5)
-			{
-				//LOG_INFO("usb端口被占用!");
-			}
-
-			i++;
-			continue;
-		}
-
-		//LOG_INFO("打开usb端口成功,准备进行打印机检测! hPort:" << hPort);
-
-		m_hShouyinPorts.push_back(hPort);
-
-		i++;
-	}
-
-	//清空usb集合,下一次调用这个函数的时候会重新设置
-	m_usb_devices.clear();
-}
-
 bool CPosPrinterWorker::InitOneUsb(std::wstring usb_path, int nType)
 {
 	if (usb_path == L"")
@@ -854,61 +853,6 @@ bool CPosPrinterWorker::InitOneUsb(std::wstring usb_path, int nType)
 	return true;
 }
 
-bool CPosPrinterWorker::InitBingkou()
-{
-	std::wstring LptStr = L"lpt1";
-
-	HANDLE hPort = CreateFile(LptStr.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
-
-	if (hPort == INVALID_HANDLE_VALUE)
-	{
-		//LOG_INFO("打开并口失败, Port = " << LptStr.c_str());
-
-		DWORD error = GetLastError();
-
-		if (error == 2)
-		{
-			//没有指定的文件
-			//LOG_INFO("本机器没有并口!");
-		}
-		else if (error == 5)
-		{
-			//LOG_INFO("并口被占用!");
-		}
-
-		return false;
-	}
-	else
-	{
-		//这个表示并口可以使用
-		//LOG_INFO("找到并口,准备进行打印机检测! hPort:" << hPort);
-
-		m_hShouyinPorts.push_back(hPort);
-	}
-
-	return true;
-}
-
-void CPosPrinterWorker::InitCom()
-{
-	CComHelper helper;
-	std::vector<std::wstring> comVector = helper.getComPort();
-
-	for (std::vector<std::wstring>::iterator it = comVector.begin(); it != comVector.end(); it++)
-	{
-		std::wstring com2Str = *it;
-
-		HANDLE hPort = OpenComPort(com2Str);
-
-		if (hPort == NULL)
-		{
-			continue;
-		}
-
-		m_hShouyinPorts.push_back(hPort);
-	}
-}
-
 /*
  *获取CreateFile的USB端口号
  **/

+ 0 - 6
zhipuzi_pos_windows/worker/CPosPrinterWorker.h

@@ -69,16 +69,10 @@ public:
 private:
 	CPosPrinterWorker();
 
-	//自动识别用于收银小票的USB打印机列表
-	void InitUsb();
-
 	//打开某一个指定的usb端口
 	//nType 1 收银打印 2标签打印
 	bool InitOneUsb(std::wstring usb_path, int nType);
 
-	bool InitBingkou();
-	void InitCom();
-
 	//获取USB打印机的路径,用于收银小票打印机的智能识别,也用于设置中心获取所有打印机
 	int GetDevicePath(LPGUID lpGuid, std::vector<std::wstring>& usb_devices);