UartContext.cpp 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384
  1. /*
  2. * UartContext.cpp
  3. *
  4. */
  5. #include <stdio.h>
  6. #include <unistd.h>
  7. #include <fcntl.h>
  8. #include <memory.h>
  9. #include <termio.h>
  10. #include <string>
  11. #include <sys/ioctl.h>
  12. #include "uart/UartContext.h"
  13. #include "utils/Log.h"
  14. #include "utils/ByteUtil.h"
  15. #include "base/strings.hpp"
  16. #include "service/BusinessConfig.h"
  17. #define UART_DATA_BUF_LEN 16384 // 16KB
  18. extern int parseProtocol(const BYTE *pData, UINT len);
  19. extern void buildProtocolData(std::string info);
  20. static const char* getBaudRate(UINT baudRate) {
  21. struct {
  22. UINT baud;
  23. const char *pBaudStr;
  24. } baudInfoTab[] = {
  25. { B1200, "B1200" },
  26. { B2400, "B2400" },
  27. { B4800, "B4800" },
  28. { B9600, "B9600" },
  29. { B19200, "B19200" },
  30. { B38400, "B38400" },
  31. { B57600, "B57600" },
  32. { B115200, "B115200" },
  33. { B230400, "B230400" },
  34. { B460800, "B460800" },
  35. { B921600, "B921600" }
  36. };
  37. int len = sizeof(baudInfoTab) / sizeof(baudInfoTab[0]);
  38. for (int i = 0; i < len; ++i) {
  39. if (baudInfoTab[i].baud == baudRate) {
  40. return baudInfoTab[i].pBaudStr;
  41. }
  42. }
  43. return NULL;
  44. }
  45. UartContext::UartContext(int uartNum) :
  46. mIsOpen(false),
  47. mUartID(0),
  48. mDataBufPtr(NULL),
  49. mDataBufLen(0),
  50. mUartNumber(uartNum){
  51. }
  52. UartContext::~UartContext() {
  53. delete[] mDataBufPtr;
  54. closeUart();
  55. }
  56. static bool mUart1IsOpen = false;
  57. static bool mUart2IsOpen = false;
  58. static bool mUart3IsOpen = false;
  59. // 打开串口,pFileName为串口号,baudRate为波特率
  60. bool UartContext::openUart(const char *pFileName, UINT baudRate) {
  61. // LOGD("打开串口 串口号 = %s, 波特率 = %s\n", pFileName, getBaudRate(baudRate));
  62. mUartID = open(pFileName, O_RDWR|O_NOCTTY); // mUartID等于打开的串口
  63. if (mUartID <= 0) {
  64. mIsOpen = false;
  65. if(mUartNumber == 1) {
  66. mUart1IsOpen = false;
  67. }
  68. if(mUartNumber == 2) {
  69. mUart2IsOpen = false;
  70. }
  71. if(mUartNumber == 3) {
  72. mUart3IsOpen = false;
  73. }
  74. LOGD("uart%d open error", mUartNumber);
  75. } else {
  76. struct termios oldtio = { 0 };
  77. struct termios newtio = { 0 };
  78. tcgetattr(mUartID, &oldtio);
  79. newtio.c_cflag = baudRate|CS8|CLOCAL|CREAD;
  80. newtio.c_iflag = 0; // IGNPAR | ICRNL
  81. newtio.c_oflag = 0;
  82. newtio.c_lflag = 0; // ICANON
  83. newtio.c_cc[VTIME] = 0; /* inter-character timer unused */
  84. newtio.c_cc[VMIN] = 1; /* blocking read until 1 character arrives */
  85. tcflush(mUartID, TCIOFLUSH);
  86. tcsetattr(mUartID, TCSANOW, &newtio);
  87. // 设置为非阻塞 Set to non-blocking
  88. fcntl(mUartID, F_SETFL, O_NONBLOCK);
  89. mIsOpen = run("uart");
  90. if (!mIsOpen) {
  91. close(mUartID);
  92. mUartID = 0;
  93. }
  94. if(mUartNumber == 1) {
  95. mUart1IsOpen = true;
  96. }
  97. if(mUartNumber == 2) {
  98. mUart2IsOpen = true;
  99. }
  100. if(mUartNumber == 3) {
  101. mUart3IsOpen = true;
  102. }
  103. LOGD("openUart mIsOpen = %d\n", mIsOpen);
  104. }
  105. return mIsOpen;
  106. }
  107. void UartContext::closeUart() {
  108. LOGD("closeUart mIsOpen: %d...\n", mIsOpen);
  109. if (mIsOpen) {
  110. requestExit();
  111. close(mUartID);
  112. mUartID = 0;
  113. mIsOpen = false;
  114. }
  115. }
  116. // 发送串口消息
  117. bool UartContext::send(const BYTE *pData, UINT len) {
  118. // 这里是串口没有打开
  119. if (!mIsOpen) {
  120. LOGD("uart%d not opend", mUartNumber);
  121. return false;
  122. }
  123. int ret = write(mUartID, pData, len); // 这是发送串口消息
  124. if (ret != (int) len) { // 这里是发送失败
  125. LOGD("发送串口消息失败\n");
  126. return false;
  127. }
  128. std::string logInfo = " >>> ";
  129. for (int i = 0; i < len; ++i) {
  130. logInfo += base::format("%02x",pData[i]);
  131. }
  132. LOGD("%s",logInfo.c_str());
  133. // success
  134. LOGD("send Success\n");
  135. return true;
  136. }
  137. //UartContext* UartContext::getInstance() {
  138. // static UartContext sUC;
  139. // return &sUC;
  140. //}
  141. bool UartContext::readyToRun() {
  142. if (mDataBufPtr == NULL) {
  143. mDataBufPtr = new BYTE[UART_DATA_BUF_LEN];
  144. }
  145. if (mDataBufPtr == NULL) {
  146. closeUart();
  147. }
  148. return (mDataBufPtr != NULL);
  149. }
  150. void handleMsg(int ret, unsigned char* buffer) {
  151. std::string revStr = "";
  152. //依次将读取到的数据输出到日志
  153. for (int i = 1; i < ret - 2; ++i) {
  154. revStr += buffer[i];
  155. }
  156. buildProtocolData(revStr);
  157. }
  158. void handleMsg2(int ret, unsigned char* buffer) {
  159. std::string revStr = "";
  160. //std::string logInfo = " <<< ";
  161. //依次将读取到的数据输出到日志
  162. for (int i = 1; i < ret - 1; ++i) {
  163. revStr += buffer[i];
  164. }
  165. std::vector<std::string> tokens;
  166. std::string token;
  167. std::istringstream stream(revStr);
  168. while (std::getline(stream, token, '#')) {
  169. if (!token.empty()) { // 确保 token 不为空
  170. size_t pos = token.find('$');
  171. if (pos != std::string::npos) {
  172. token = token.substr(pos + 1);
  173. }
  174. tokens.push_back(token);
  175. }
  176. }
  177. if (!tokens.empty()) {
  178. for (std::string t : tokens) {
  179. buildProtocolData(t);
  180. }
  181. }
  182. else {
  183. buildProtocolData(revStr);
  184. }
  185. }
  186. void nfcMsg(int ret, unsigned char* buffer) {
  187. if (buffer[0] == 0xfe && buffer[2] == 0x03) {
  188. if (buffer[1] == 0x08) {
  189. std::string revStr = "";
  190. for (int i = 0; i < ret; ++i) {
  191. if (i==0 || i==1 || i==2 || i==3 || i==4 || i==ret-1){
  192. continue;
  193. }
  194. char buf[1024];
  195. sprintf(buf, "%02x", buffer[i]);
  196. revStr += buf;
  197. }
  198. LOGD("nfc卡号 == %s", revStr.c_str());
  199. // nfcLogin(revStr);
  200. navibarNfcLogin(revStr);
  201. }
  202. }
  203. }
  204. unsigned char handle2Buffer[1024] = {0};
  205. size_t offset = 0;
  206. bool UartContext::threadLoop() {
  207. if (mIsOpen) {
  208. #if 0
  209. // 可能上一次解析后有残留数据,需要拼接起来
  210. int readNum = read(mUartID, mDataBufPtr + mDataBufLen, UART_DATA_BUF_LEN - mDataBufLen);
  211. if (readNum > 0) {
  212. mDataBufLen += readNum;
  213. // 解析协议
  214. int len = parseProtocol(mDataBufPtr, mDataBufLen);
  215. if ((len > 0) && (len < mDataBufLen)) {
  216. // 将未解析的数据移到头部
  217. memcpy(mDataBufPtr, mDataBufPtr + len, mDataBufLen - len);
  218. }
  219. mDataBufLen -= len;
  220. } else {
  221. Thread::sleep(50);
  222. }
  223. #else
  224. unsigned char buffer[1024] = {0};
  225. int ret = read(mUartID, buffer, sizeof(buffer));
  226. if (ret > 0) {
  227. LOGD("收到串口消息");
  228. // std::string revStr = "";
  229. // std::string revStr2 = "";
  230. // for (int i = 0; i < ret; ++i) {
  231. // revStr += buffer[i];
  232. //
  233. // char buf[1024];
  234. // sprintf(buf, "%02x", buffer[i]);
  235. // revStr2 += buf;
  236. // }
  237. // LOGD("revStr == %s", revStr.c_str());
  238. // LOGD("revStr2 == %s", revStr2.c_str());
  239. if (mUartNumber == 2) {
  240. if (buffer[0]==CMD_HEAD && buffer[ret-2] == CMD_END1 && buffer[ret-1] == CMD_END2){
  241. handleMsg(ret, buffer);
  242. }
  243. }
  244. else if (mUartNumber == 1) {
  245. // LOGD("offset ================%d", offset);
  246. ByteUtil::copyUnsignedCharArray(buffer, handle2Buffer, ret, offset);
  247. // LOGD("offset2 ================%d", offset);
  248. //
  249. // int size2Int = sizeof(handle2Buffer) / sizeof(unsigned char);
  250. // std::string revStr = "";
  251. // for (int i = 0; i < size2Int; ++i) {
  252. // revStr += handle2Buffer[i];
  253. // }
  254. if (handle2Buffer[0]==CMD_HEAD && handle2Buffer[offset-1] == CMD_END1) {
  255. handleMsg2(offset, handle2Buffer);
  256. offset = 0;
  257. std::fill(std::begin(handle2Buffer), std::end(handle2Buffer), 0);
  258. }
  259. else {
  260. if (handle2Buffer[0] != CMD_HEAD || offset > 52) {
  261. offset = 0;
  262. std::fill(std::begin(handle2Buffer), std::end(handle2Buffer), 0);
  263. LOGD("handle2Buffer 初始化");
  264. }
  265. }
  266. }
  267. else if (mUartNumber == 3) {
  268. nfcMsg(ret, buffer);
  269. }
  270. } else {
  271. //没收到数据时,休眠50ms,防止过度消耗cpu
  272. usleep(1000 * 50);
  273. }
  274. #endif
  275. return true;
  276. }
  277. return false;
  278. }
  279. static UartContext* uart0 = NULL;
  280. static UartContext* uart1 = NULL;
  281. static UartContext* uart2 = NULL;
  282. static UartContext* uart3 = NULL;
  283. void UartContext::init() {
  284. // uart0 = new UartContext(UART_TTYS0);
  285. // uart0->openUart("/dev/ttyS0", B115200);
  286. uart1 = new UartContext(UART_TTYS1);
  287. uart1->openUart("/dev/ttyS1", B115200);
  288. // 20221108的板子打开了串口2
  289. uart2 = new UartContext(UART_TTYS2);
  290. uart2->openUart("/dev/ttyS2", B115200);
  291. uart3 = new UartContext(UART_TTYS3);
  292. uart3->openUart("/dev/ttyS3", B115200);
  293. LOGD("打开串口");
  294. }
  295. void UartContext::destroy() {
  296. if (uart0) {
  297. delete uart0;
  298. uart0 = NULL;
  299. }
  300. if (uart1) {
  301. delete uart1;
  302. uart1 = NULL;
  303. }
  304. if (uart2) {
  305. delete uart1;
  306. uart2 = NULL;
  307. }
  308. if (uart3) {
  309. delete uart1;
  310. uart3 = NULL;
  311. }
  312. }
  313. bool UartContext::sendTo(int uart, const BYTE* pData, UINT len) {
  314. switch (uart) {
  315. case UART_TTYS0:
  316. return uart0->send(pData, len);
  317. case UART_TTYS1:
  318. return uart1->send(pData, len);
  319. case UART_TTYS2:
  320. return uart2->send(pData, len);
  321. case UART_TTYS3:
  322. return uart3->send(pData, len);
  323. }
  324. LOGD("无效的串口号");
  325. return false;
  326. }
  327. bool UartContext::Uart1IsOpen() {return mUart1IsOpen;}
  328. bool UartContext::Uart2IsOpen() {return mUart2IsOpen;}
  329. bool UartContext::Uart3IsOpen() {return mUart3IsOpen;}