CChengzhongWorker.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. #include "../pch/pch.h"
  2. #include "CChengzhongWorker.h"
  3. CChengzhongWorker::CChengzhongWorker()
  4. {
  5. }
  6. //启动工作线程
  7. void CChengzhongWorker::StartWork()
  8. {
  9. m_is_work = true;
  10. std::thread(&CChengzhongWorker::HandleWork, this).detach();
  11. }
  12. //结束工作线程
  13. void CChengzhongWorker::StopWork()
  14. {
  15. m_worker_mutex.lock();
  16. m_is_work = false;
  17. m_worker_mutex.unlock();
  18. m_serial.closeComm();
  19. m_weight = "";
  20. m_hwnd = NULL;
  21. }
  22. void CChengzhongWorker::RestartWork()
  23. {
  24. StopWork();
  25. StartWork();
  26. }
  27. void CChengzhongWorker::HandleWork()
  28. {
  29. std::string setting_dianzicheng_xinghao = CSetting::GetInstance()->GetParam("setting_dianzicheng_xinghao");
  30. std::string dianzicheng_com = CSetting::GetInstance()->GetParam("setting_dianzicheng_com");
  31. std::string setting_dianzicheng_botelv = CSetting::GetInstance()->GetParam("setting_dianzicheng_botelv");
  32. m_serial.setPortNum(CLewaimaiString::UTF8ToUnicode(dianzicheng_com));
  33. m_serial.setBaudRate(atoi(setting_dianzicheng_botelv.c_str()));
  34. bool ret = m_serial.openComm();
  35. if (!ret)
  36. {
  37. //连接电子秤失败了
  38. m_is_work = false;
  39. return;
  40. }
  41. std::string m_chuankou_string = "";
  42. while (m_is_work)
  43. {
  44. //不同型号的电子秤,数据格式可能不一样,处理方式不一样
  45. if (setting_dianzicheng_xinghao == "dahua_acs")
  46. {
  47. char a[100] = { 0 };
  48. memset(a, 0, 100);
  49. //开始读取串口的数据
  50. DWORD nReaded = 0;
  51. m_serial.readFromComm(a, 100, &nReaded);
  52. if (nReaded > 0)
  53. {
  54. //把所有读到的内容,拼接到m_chuankou_string后面,避免有的数据中间截断导致格式混乱
  55. m_chuankou_string += a;
  56. std::string show_command = "\n\r";
  57. size_t nPos = m_chuankou_string.find(show_command);
  58. if (nPos == m_chuankou_string.npos)
  59. {
  60. //没有读到足够的长度,继续读
  61. continue;
  62. }
  63. std::string weight;
  64. //如果前2个不是标志符,那么就判断标志符后面的数字长度够不够5个
  65. if (m_chuankou_string.length() >= nPos + 7)
  66. {
  67. //这个情况是,标志符后面有5个数字
  68. weight = m_chuankou_string.substr(nPos + 2, 5);
  69. //然后把前面的字符都删掉
  70. m_chuankou_string = m_chuankou_string.substr(nPos + 7);
  71. }
  72. else if (nPos >= 20)
  73. {
  74. //说明前面有20个字符,首先肯定不是稳定模式而是极速模式,另外在极速模式下可以直接得到重量了
  75. weight = m_chuankou_string.substr(nPos - 20, 5);
  76. m_chuankou_string = m_chuankou_string.substr(nPos + 2);
  77. }
  78. else
  79. {
  80. //标志符后面前面都不够读取重量,继续读取串口
  81. continue;
  82. }
  83. if (weight.at(0) == ' ')
  84. {
  85. weight = weight.substr(1);
  86. }
  87. std::string zhengshu;
  88. std::string xiaoshu;
  89. if (weight.length() == 4)
  90. {
  91. //重量小于10公斤,第一个数字为空
  92. zhengshu = weight.substr(0, 1);
  93. xiaoshu = weight.substr(1, 3);
  94. }
  95. else if (weight.length() == 5)
  96. {
  97. //重量大于10公斤,第一个数字为空
  98. zhengshu = weight.substr(0, 2);
  99. xiaoshu = weight.substr(2, 3);
  100. }
  101. else
  102. {
  103. continue;
  104. }
  105. m_weight = zhengshu + "." + xiaoshu;
  106. if (m_hwnd != NULL)
  107. {
  108. ::SendMessage(m_hwnd, WM_CHENGZHONG_SUCCESS, 0, 0);
  109. }
  110. }
  111. else
  112. {
  113. Sleep(100);
  114. }
  115. }
  116. else if (setting_dianzicheng_xinghao == "dingjian_os2x")
  117. {
  118. char a[16] = { 0 };
  119. memset(a, 0, 16);
  120. //开始读取串口的数据
  121. DWORD nReaded = 0;
  122. m_serial.readFromComm(a, 16, &nReaded);
  123. if (nReaded > 0)
  124. {
  125. //把所有读到的内容,拼接到m_chuankou_string后面,避免有的数据中间截断导致格式混乱
  126. m_chuankou_string = a;
  127. if (a[0] != 0x01 || a[1] != 0x02 || a[13] != 0x03 || a[14] != 0x04)
  128. {
  129. //说明这16个字节的数据不是完整的,这个时候处理方式是把错误数据全部读完,但是不处理,然后下次接着处理
  130. std::string show_command = "\x01\x02";
  131. size_t nPos = m_chuankou_string.find(show_command);
  132. if (nPos == m_chuankou_string.npos)
  133. {
  134. //不存在标志服,数据错误
  135. m_chuankou_string = "";
  136. continue;
  137. }
  138. //把废数据读出来,不处理,下次重新读16个完整的
  139. m_serial.readFromComm(a, nPos, &nReaded);
  140. m_chuankou_string = "";
  141. continue;
  142. }
  143. std::string weight = m_chuankou_string.substr(4, 6);
  144. if (weight.at(0) == '0')
  145. {
  146. weight = weight.substr(1);
  147. }
  148. m_weight = weight;
  149. if (m_hwnd != NULL)
  150. {
  151. ::SendMessage(m_hwnd, WM_CHENGZHONG_SUCCESS, 0, 0);
  152. }
  153. }
  154. else
  155. {
  156. Sleep(100);
  157. }
  158. }
  159. else
  160. {
  161. //暂时不支持的其他型号
  162. Sleep(100);
  163. }
  164. }
  165. }