SerialPortServer.hpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. // SerialPortServer.hpp
  2. //
  3. #pragma once
  4. #ifndef _SerialPortServer_DLL
  5. #define SERIALPORTSERVER_API _declspec(dllimport)
  6. #else
  7. #define SERIALPORTSERVER_API _declspec(dllexport)
  8. #endif
  9. /* Controlcharacters */
  10. #define DLE 0x10 /* Start of a message */
  11. #define CON 0x11 /* Initialisation */
  12. #define CONACK 0x12 /* Confirmation for CON */
  13. #define STX 0x02 /* Start of DATA */
  14. #define BUSY 0x16 /* receiver not ready */
  15. #define ETX 0x03
  16. #define ACK 0x06
  17. #define NAK 0x15
  18. #define ENQ 0x05
  19. #define CR 0x0d
  20. #define LF 0x0a
  21. #include "Stream.hpp"
  22. #include "Buffer.hpp"
  23. // ----------------------------------------------------------------------------
  24. // CSerialPortServer
  25. class SERIALPORTSERVER_API CSerialPortServer
  26. {
  27. public:
  28. class FrameStream;
  29. public:
  30. CSerialPortServer();
  31. virtual ~CSerialPortServer();
  32. public:
  33. bool OpenPort (
  34. UINT portnr = 1,
  35. UINT baud = 19200,
  36. char parity = NOPARITY,
  37. UINT databits = 8,
  38. UINT stopsbits = 1);
  39. void ClosePort ();
  40. public:
  41. // 发送命令,在主线程中调用
  42. int SendCommand (const char * cmd, int length);
  43. // 发送刷新命令,在主线程中调用
  44. int SendRefreshCommand (const char * cmd, int length);
  45. // 把同步队列中的数据搬到异步队列中
  46. int SyncToASync ();
  47. // 检查返回状态值, bRemove指定是否删除, bWait指定是否等待
  48. bool PeekStatus (FrameStream * pStream, bool bRemove, bool bWait);
  49. // 检索状态队列的个数
  50. int GetNbOfStatus ();
  51. protected:
  52. // 处理读队列, 在写周期中调用
  53. int ProcessStatus ();
  54. protected:
  55. virtual int WriteCycle ();
  56. virtual int ReadCycle ();
  57. protected:
  58. virtual int OnCallback (FrameStream data) = 0;
  59. // 把一帧数据写到串口
  60. virtual int WriteFrame (FrameStream data);
  61. virtual FrameStream ReadFrame () = 0;
  62. virtual int GetNbOfACK (FrameStream data) = 0;
  63. protected:
  64. // 写数据到串口,然后等待ACK
  65. virtual int WriteFrameWaitACK (FrameStream data);
  66. protected:
  67. class SerialPortBuffer * m_Port;
  68. public:
  69. bool StartServer ();
  70. void StopServer ();
  71. public:
  72. int SetMaxlenCommandBuffer (int max);
  73. int SetMaxlenRefreshBuffer (int max);
  74. protected:
  75. static int DaemonWrite (void * Arg);
  76. static int DaemonRead (void * Arg);
  77. virtual int RunWrite ();
  78. virtual int RunRead ();
  79. // 反向通知函数
  80. protected:
  81. // 超时通知
  82. virtual void OnTimeOut (FrameStream cmd) { }
  83. virtual int ShouldResend (FrameStream cmd) { return 0; }
  84. protected:
  85. HANDLE ThreadHandleWrite;
  86. HANDLE ThreadHandleRead;
  87. DWORD ThreadIDWrite; // 写线程ID
  88. DWORD ThreadIDRead; // 读线程ID
  89. DWORD ThreadIDMain; // 主线程ID
  90. HANDLE EventHandleWrite; // 当命令写入共享缓存时,发送事件
  91. HANDLE EventHandleRead; // 当状态加入共享缓存时,发送事件
  92. protected:
  93. class CLogFile * LogFile;
  94. public:
  95. class SERIALPORTSERVER_API FrameStream : public Stream
  96. {
  97. public:
  98. FrameStream ();
  99. FrameStream (const FrameStream &);
  100. FrameStream (const char * str);
  101. FrameStream (const char * lpsz, int length);
  102. FrameStream (int length);
  103. ~FrameStream ();
  104. public:
  105. int m_Index;
  106. public:
  107. enum
  108. {
  109. enUnknown = 0,
  110. enState = 1,
  111. enACK = 2,
  112. enNAK = 3,
  113. enBUSY = 4,
  114. enRequest = 5,
  115. enENQ = 8,
  116. enRefresh = 10,
  117. enRefreshCon = 11,
  118. enRefreshSys = 12,
  119. enOther = 100,
  120. };
  121. int m_Type;
  122. public:
  123. bool IsFull () const;
  124. void Restart ();
  125. public:
  126. FrameStream & operator << (BYTE x);
  127. FrameStream & operator << (char x) { return ((*this) << (BYTE) x); };
  128. public:
  129. Stream & operator = (const FrameStream & stringSrc);
  130. };
  131. protected:
  132. class StreamArray * m_arCommand;
  133. class StreamArray * m_arRefreshCommand;
  134. class ExStreamArray * m_exCommand;
  135. class ExStreamArray * m_exRefreshCommand;
  136. class ExStreamArray * m_exStatus;
  137. protected:
  138. DWORD m_LastTickWriteCommand; // 最后一次写命令的时间
  139. DWORD m_LastTickWriteRefresh; // 最后一次写刷新命令的时间
  140. int m_MaxlenCommand; // CommandBuffer的最大尺寸,超过时,就把队列尾部的命令扔了
  141. int m_MaxlenRefresh; // RefreshBuffer的最大尺寸,超过时,就把队列尾部的命令扔了
  142. protected:
  143. int m_Reserved[256];
  144. };