| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- #include "../pch/pch.h"
- #include "CChengzhongWorker.h"
- CChengzhongWorker::CChengzhongWorker()
- {
- }
- //启动工作线程
- void CChengzhongWorker::StartWork()
- {
- m_is_work = true;
- std::thread(&CChengzhongWorker::HandleWork, this).detach();
- }
- //结束工作线程
- void CChengzhongWorker::StopWork()
- {
- m_worker_mutex.lock();
- m_is_work = false;
- m_worker_mutex.unlock();
- m_serial.closeComm();
- m_weight = "";
- m_hwnd = NULL;
- }
- void CChengzhongWorker::RestartWork()
- {
- StopWork();
- StartWork();
- }
- void CChengzhongWorker::HandleWork()
- {
- std::string setting_dianzicheng_xinghao = CSetting::GetInstance()->GetParam("setting_dianzicheng_xinghao");
- std::string dianzicheng_com = CSetting::GetInstance()->GetParam("setting_dianzicheng_com");
- std::string setting_dianzicheng_botelv = CSetting::GetInstance()->GetParam("setting_dianzicheng_botelv");
- m_serial.setPortNum(CLewaimaiString::UTF8ToUnicode(dianzicheng_com));
- m_serial.setBaudRate(atoi(setting_dianzicheng_botelv.c_str()));
- bool ret = m_serial.openComm();
- if (!ret)
- {
- //连接电子秤失败了
- m_is_work = false;
- return;
- }
- std::string m_chuankou_string = "";
- while (m_is_work)
- {
- //不同型号的电子秤,数据格式可能不一样,处理方式不一样
- if (setting_dianzicheng_xinghao == "dahua_acs")
- {
- char a[100] = { 0 };
- memset(a, 0, 100);
- //开始读取串口的数据
- DWORD nReaded = 0;
- m_serial.readFromComm(a, 100, &nReaded);
- if (nReaded > 0)
- {
- //把所有读到的内容,拼接到m_chuankou_string后面,避免有的数据中间截断导致格式混乱
- m_chuankou_string += a;
- std::string show_command = "\n\r";
- size_t nPos = m_chuankou_string.find(show_command);
- if (nPos == m_chuankou_string.npos)
- {
- //没有读到足够的长度,继续读
- continue;
- }
- std::string weight;
- //如果前2个不是标志符,那么就判断标志符后面的数字长度够不够5个
- if (m_chuankou_string.length() >= nPos + 7)
- {
- //这个情况是,标志符后面有5个数字
- weight = m_chuankou_string.substr(nPos + 2, 5);
- //然后把前面的字符都删掉
- m_chuankou_string = m_chuankou_string.substr(nPos + 7);
- }
- else if (nPos >= 20)
- {
- //说明前面有20个字符,首先肯定不是稳定模式而是极速模式,另外在极速模式下可以直接得到重量了
- weight = m_chuankou_string.substr(nPos - 20, 5);
- m_chuankou_string = m_chuankou_string.substr(nPos + 2);
- }
- else
- {
- //标志符后面前面都不够读取重量,继续读取串口
- continue;
- }
- if (weight.at(0) == ' ')
- {
- weight = weight.substr(1);
- }
- std::string zhengshu;
- std::string xiaoshu;
- if (weight.length() == 4)
- {
- //重量小于10公斤,第一个数字为空
- zhengshu = weight.substr(0, 1);
- xiaoshu = weight.substr(1, 3);
- }
- else if (weight.length() == 5)
- {
- //重量大于10公斤,第一个数字为空
- zhengshu = weight.substr(0, 2);
- xiaoshu = weight.substr(2, 3);
- }
- else
- {
- continue;
- }
- m_weight = zhengshu + "." + xiaoshu;
- if (m_hwnd != NULL)
- {
- ::SendMessage(m_hwnd, WM_CHENGZHONG_SUCCESS, 0, 0);
- }
- }
- else
- {
- Sleep(100);
- }
- }
- else if (setting_dianzicheng_xinghao == "dingjian_os2x")
- {
- char a[16] = { 0 };
- memset(a, 0, 16);
- //开始读取串口的数据
- DWORD nReaded = 0;
- m_serial.readFromComm(a, 16, &nReaded);
- if (nReaded > 0)
- {
- //把所有读到的内容,拼接到m_chuankou_string后面,避免有的数据中间截断导致格式混乱
- m_chuankou_string = a;
- if (a[0] != 0x01 || a[1] != 0x02 || a[13] != 0x03 || a[14] != 0x04)
- {
- //说明这16个字节的数据不是完整的,这个时候处理方式是把错误数据全部读完,但是不处理,然后下次接着处理
- std::string show_command = "\x01\x02";
- size_t nPos = m_chuankou_string.find(show_command);
- if (nPos == m_chuankou_string.npos)
- {
- //不存在标志服,数据错误
- m_chuankou_string = "";
- continue;
- }
- //把废数据读出来,不处理,下次重新读16个完整的
- m_serial.readFromComm(a, nPos, &nReaded);
- m_chuankou_string = "";
- continue;
- }
- std::string weight = m_chuankou_string.substr(4, 6);
- if (weight.at(0) == '0')
- {
- weight = weight.substr(1);
- }
- m_weight = weight;
- if (m_hwnd != NULL)
- {
- ::SendMessage(m_hwnd, WM_CHENGZHONG_SUCCESS, 0, 0);
- }
- }
- else
- {
- Sleep(100);
- }
- }
- else
- {
- //暂时不支持的其他型号
- Sleep(100);
- }
- }
- }
|