SynSerial.h 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. /************************************************************************/
  2. /* Copyright (C), 2016-2020, [Home], 保留所有权利;
  3. /* 模 块 名:同步串口模块;
  4. /* 描 述:;
  5. /*
  6. /* 版 本:[V];
  7. /* 作 者:[Home];
  8. /* 日 期:[12/20/2017];
  9. /*
  10. /*
  11. /* 注 意:;
  12. /*
  13. /* 修改记录:[Home];
  14. /* 修改日期:;
  15. /* 修改版本:;
  16. /* 修改内容:;
  17. /************************************************************************/
  18. #ifndef __SYN_SERIAL__
  19. #define __SYN_SERIAL__
  20. #define BUFFER_LEN 3000
  21. #include "CritSection.h"
  22. #pragma once
  23. #define MAX_PORT_LEN 10
  24. class CSynSerial
  25. {
  26. public:
  27. CSynSerial(void);
  28. virtual ~CSynSerial(void);
  29. private:
  30. DCB m_dcb;
  31. HANDLE m_hSerialPort;
  32. COMMTIMEOUTS m_cts;
  33. OVERLAPPED m_writeOverlapped;
  34. OVERLAPPED m_readOverlapped;
  35. // 串口号(1~255);
  36. TCHAR m_szSerialPort[MAX_PORT_LEN];
  37. // 输入缓存大小(byte);
  38. DWORD m_dwInQueue;
  39. // 输出缓存大小(byte);
  40. DWORD m_dwOutQueue;
  41. std::string m_strbuffer;
  42. // 当前节点;
  43. static int s_nCurPos;
  44. static byte s_byBuffer[BUFFER_LEN];
  45. static ThreadSection s_csClearBuffer;
  46. void SwapBuffers(TCHAR *szValue, DWORD dwRealRead);
  47. public:
  48. inline BOOL IsOpen() const {
  49. return (m_hSerialPort == NULL || m_hSerialPort == INVALID_HANDLE_VALUE) ? FALSE : TRUE;
  50. }
  51. // 打开串口;
  52. BOOL OpenSerialPort(
  53. IN CONST BYTE& byCommPort, // 串口号;
  54. IN CONST DWORD& dwBaudRate, // 波特率;
  55. IN CONST BYTE& bySize, // 数据位;
  56. IN CONST BYTE& byParity, // 校验位;
  57. IN CONST BYTE& byStopBits, // 停止位;
  58. IN CONST BYTE& byStartAddr, // 起始地址;
  59. IN CONST INT& nInterval // 间隔时间;
  60. );
  61. // 重装打开串口;
  62. BOOL ReOpenSerialPort();
  63. // 关闭串口;
  64. void CloseSerialPort();
  65. // 设置串口参数;
  66. BOOL SetSerialPort(
  67. IN CONST DWORD& dwBaudRate, // 波特率;
  68. IN CONST BYTE& byByteSize, // 数据位;
  69. IN CONST BYTE& byParity, // 校验位;
  70. IN CONST BYTE& byStopBits, // 停止位;
  71. IN CONST BYTE& byStartAddr, // 起始地址;
  72. IN CONST DWORD& dwInQueue, // 输入缓存;
  73. IN CONST DWORD& dwOutQueue // 输出缓存;
  74. );
  75. // 设置dcb参数;
  76. void SetSerialDCB(IN CONST DCB &dcb);
  77. // 设置commtimeouts参数;
  78. void SetSerialCommTimeouts(IN CONST COMMTIMEOUTS &commTimeouts);
  79. virtual bool WriteComm(IN BYTE *pWirteBuf, IN CONST INT32 nWriteSize);
  80. virtual DWORD ReadComm(IN BYTE *pReadBuf, IN CONST DWORD& dwReadSize, WORD timeout = 300);
  81. public:
  82. HANDLE m_hEvent;
  83. HANDLE m_hThread;
  84. void StartThread();
  85. void EndofThread();
  86. static DWORD WINAPI ThreadWatch(LPVOID lpVoid);
  87. bool FindWord(std::string strWord, int nWatchTime = 3000);
  88. void ClearBuffer() {
  89. AutoThreadSection aSection(&s_csClearBuffer);
  90. m_strbuffer.clear();
  91. };
  92. };
  93. #endif // __SYN_SERIAL__