CGH_Relays.cpp 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  1. #include "CGH_Relays.h"
  2. /*******************************************************************
  3. * 名称: openSyn
  4. * 功能: 同步方式打开串口,并配置默认信息
  5. * 参数:
  6. serial_name:串口名称
  7. baud_rate :波特率,取值如下
  8. ......
  9. CBR_9600 9600bps
  10. CBR_14400 14400bps
  11. ......
  12. parity :校验方式
  13. EVENPARITY 偶校验
  14. MARKPARITY 标号校验
  15. NOPARITY 无校验
  16. ODDPARITY 奇校验
  17. SPACEPARITY 空格校验
  18. byte_size :数据位大小
  19. 4,5,6,7,8
  20. stop_bits :停止位
  21. ONESTOPBIT 1个停止位
  22. ONE5STOPBITS 1.5个停止位
  23. TWOSTOPBITS 2个停止位
  24. * 返回: 正确返回为ture,错误返回为false
  25. *******************************************************************/
  26. bool CGH_Relays::openSyn(string serial_name, unsigned char baud_rate, unsigned char parity, unsigned char byte_size, unsigned char stop_bits)
  27. {
  28. if (!openSyn(serial_name))
  29. return false;
  30. DCB dcb;
  31. if (false == GetCommState(hCom, &dcb))//获得当前串口的配置信息
  32. {
  33. setSerialLastError("SerialInterface::open() : GetCommState Error");
  34. return false;
  35. }
  36. dcb.DCBlength = sizeof(DCB);
  37. dcb.BaudRate = baud_rate;
  38. dcb.Parity = parity;
  39. dcb.ByteSize = byte_size;
  40. dcb.StopBits = stop_bits;
  41. if (false == SetCommState(hCom, &dcb))//用DCB结构重新配置串行端口信息
  42. {
  43. setSerialLastError("SerialInterface::open() : SetCommState Error");
  44. return false;
  45. }
  46. //超时处理
  47. COMMTIMEOUTS timeouts;
  48. timeouts.ReadIntervalTimeout = MAXDWORD; //读间隔超时
  49. // 把间隔超时设为最大,把总超时设为0将导致ReadFile立即返回并完成操作
  50. timeouts.ReadTotalTimeoutMultiplier = 0; //读时间系数
  51. timeouts.ReadTotalTimeoutConstant = 0; //读时间常量
  52. timeouts.WriteTotalTimeoutMultiplier = 50; // 写时间系数
  53. timeouts.WriteTotalTimeoutConstant = 2000; //写时间常量
  54. //总的读/写超时时间 = Read(Write)TotalTimeoutMultiplier x 要读/写的字节数 + Read(Write)TotalTimeoutConstant.
  55. if (false==SetCommTimeouts(hCom, &timeouts))
  56. {
  57. setSerialLastError("SerialInterface::open() : SetCommTimeouts Error");
  58. return false;
  59. }
  60. //清空缓冲区,为读写串口做准备
  61. if (false == PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_RXABORT))
  62. {
  63. setSerialLastError("SerialInterface::open() : PurgeComm Error");
  64. return false;
  65. }
  66. return true;
  67. }
  68. /*******************************************************************
  69. * 名称: openSyn
  70. * 功能: 同步方式打开串口(需自己配置串口参数)
  71. * 参数:
  72. serial_name:串口名称
  73. * 返回: 正确返回为ture,错误返回为false
  74. *******************************************************************/
  75. bool CGH_Relays::openSyn(string serial_name)
  76. {
  77. hCom = CreateFileA(
  78. serial_name.data(),//普通文件名或者设备文件名,这里是串口名
  79. GENERIC_READ | GENERIC_WRITE,//访问模式,读和写
  80. 0,//共享模式,独占模式
  81. NULL,//指向安全属性的指针,不使用,传NULL
  82. OPEN_EXISTING,//如何创建,在串口中必须设置为OPEN_EXISTING。表示不能创建新端口只能打开已有的端口。
  83. FILE_ATTRIBUTE_NORMAL,//文件属性,使用默认属性FILE_ATTRIBUTE_NORMAL。
  84. NULL//用于复制文件句柄,通常这个参数设置为NULL,为空表示不使用模板
  85. );
  86. if (INVALID_HANDLE_VALUE == hCom)//出错判断
  87. {
  88. hCom = NULL;
  89. setSerialLastError("open():CreateFileA Error!");
  90. return false;
  91. }
  92. return true;
  93. }
  94. /*******************************************************************
  95. * 名称: closeComm
  96. * 功能: 关闭串口
  97. * 参数: 无
  98. * 返回: 正确返回为ture,错误返回为false
  99. *******************************************************************/
  100. void CGH_Relays::closeComm()
  101. {
  102. if(NULL==hCom)
  103. return;
  104. CloseHandle(hCom);
  105. hCom=NULL;
  106. }
  107. /*******************************************************************
  108. * 名称: closeComm
  109. * 功能: 判断串口是否打开
  110. * 参数: 无
  111. * 返回: 正确返回为ture,错误返回为false
  112. *******************************************************************/
  113. bool CGH_Relays::isOpened()
  114. {
  115. return NULL == hCom ? false : true;
  116. }
  117. DWORD CGH_Relays::readData(char *buffer,int length)
  118. {
  119. DWORD writeSize=0;
  120. bool ret=false;
  121. ret=ReadFile(hCom,buffer,length,&writeSize,NULL);
  122. if(false==ret)
  123. return 0;
  124. return writeSize;
  125. }
  126. DWORD CGH_Relays::writeData(char *buffer,int length)
  127. {
  128. DWORD writeSize=0;
  129. bool ret=false;
  130. ret=WriteFile(hCom,buffer,length,&writeSize,NULL);
  131. if(false==ret)
  132. return 0;
  133. return writeSize;
  134. }
  135. DWORD CGH_Relays::writeStr(string str)
  136. {
  137. bool ret = false;
  138. DWORD writeSize = 0;
  139. ret = WriteFile(hCom, str.data(), str.length(), &writeSize, NULL);
  140. if (0 == ret)
  141. {
  142. last_error = "Error By writeStr(string str)";
  143. return 0;
  144. }
  145. last_error = "";
  146. return writeSize;
  147. }
  148. /*******************************************************************
  149. * 名称: setTimeouts
  150. * 功能: 设置超时
  151. * 参数:
  152. timeouts:超时配置的COMMTIMEOUTS结构体
  153. * 返回: 正确返回为ture,错误返回为false
  154. *******************************************************************/
  155. bool CGH_Relays::setTimeouts(COMMTIMEOUTS &timeouts)
  156. {
  157. if (false == SetCommTimeouts(hCom, &timeouts))
  158. {
  159. setSerialLastError("SerialInterface::setTimeouts() : SetCommTimeouts Error");
  160. return false;
  161. }
  162. return true;
  163. }
  164. /*******************************************************************
  165. * 名称: setDCB
  166. * 功能: 设置串口信息
  167. * 参数:
  168. dcb:串口信息配置的DCB结构体
  169. * 返回: 正确返回为ture,错误返回为false
  170. *******************************************************************/
  171. bool CGH_Relays::setDCB(DCB& dcb)
  172. {
  173. if (false == SetCommState(hCom, &dcb))
  174. {
  175. setSerialLastError("SerialInterface::setDCB() : SetCommState Error");
  176. return false;
  177. }
  178. return true;
  179. }
  180. /*******************************************************************
  181. * 名称: purgeBuff
  182. * 功能: 刷新缓冲区
  183. * 参数:
  184. flags:需要完成的操作,取值如下
  185. PURGE_RXABORT 终止所有未完成的重叠读取操作并立即返回,即使读取操作尚未完成。
  186. PURGE_RXCLEAR 清除输入缓冲区(如果设备驱动程序有一个)。
  187. PURGE_TXABORT 终止所有未完成的重叠写操作并立即返回,即使写操作尚未完成。
  188. PURGE_TXCLEAR 清除输出缓冲区(如果设备驱动程序有一个)。
  189. * 返回: 正确返回为ture,错误返回为false
  190. * 提示:PurgeComm()函数可以在读写操作的同时,清空缓冲区。当应用程序在读写操作时
  191. 调用PurgeComm()函数,不能保证缓冲区内的所有字符都被发送。
  192. *******************************************************************/
  193. bool CGH_Relays::purgeBuff(DWORD flags)
  194. {
  195. if (false == PurgeComm(hCom, flags))
  196. {
  197. setSerialLastError("SerialInterface::purgeBuff() : PurgeComm Error");
  198. return false;
  199. }
  200. return true;
  201. }
  202. /*******************************************************************
  203. * 名称:flushBuff
  204. * 功能:刷新缓冲区
  205. * 参数:无
  206. * 返回:正确返回为ture,错误返回为false
  207. * 提示:该函数只受流量控制的支配,不受超时控制的支配,它在所有的写操作完成后才返回。
  208. *******************************************************************/
  209. bool CGH_Relays::flushBuff()
  210. {
  211. if(FlushFileBuffers(hCom))
  212. {
  213. setSerialLastError("SerialInterface::flushBuff() : FlushFileBuffers Error");
  214. return false;
  215. }
  216. return true;
  217. }
  218. /*******************************************************************
  219. * 名称: setBufferSize
  220. * 功能: 设置推荐的缓冲大小
  221. * 参数:
  222. inputBuff:输入缓冲大小
  223. outBuffer:输出缓冲大小
  224. * 返回: 正确返回为ture,错误返回为false
  225. *******************************************************************/
  226. bool CGH_Relays::setBufferSize(DWORD inputBuff,DWORD outBuffer)
  227. {
  228. if(inputBuff<=0||outBuffer<=0)
  229. return false;
  230. return SetupComm(hCom,inputBuff,outBuffer);
  231. }
  232. /*******************************************************************
  233. * 名称: getSerialLastError
  234. * 功能: 得到最后一次失败的错误信息
  235. * 参数: 无
  236. * 返回: 数据类型:string,错误信息
  237. *******************************************************************/
  238. string CGH_Relays::getSerialLastError()
  239. {
  240. return last_error;
  241. }
  242. bool CGH_Relays::OpenUSB1()
  243. {
  244. char OpenUSB1DataBuf[4];
  245. OpenUSB1DataBuf[0] = 0xA0;
  246. OpenUSB1DataBuf[1] = 0x01;
  247. OpenUSB1DataBuf[2] = 0x01;
  248. OpenUSB1DataBuf[3] = 0xA2;
  249. if (writeData(OpenUSB1DataBuf, 4))
  250. {
  251. return true;
  252. }
  253. else
  254. {
  255. return false;
  256. }
  257. }
  258. bool CGH_Relays::CloseUSB1()
  259. {
  260. char CloseUSB1DataBuf[4];
  261. CloseUSB1DataBuf[0] = 0xA0;
  262. CloseUSB1DataBuf[1] = 0x01;
  263. CloseUSB1DataBuf[2] = 0x00;
  264. CloseUSB1DataBuf[3] = 0xA1;
  265. if (writeData(CloseUSB1DataBuf, 4))
  266. {
  267. return true;
  268. }
  269. else
  270. {
  271. return false;
  272. }
  273. }
  274. bool CGH_Relays::OpenUSB2()
  275. {
  276. char OpenUSB2DataBuf[4];
  277. OpenUSB2DataBuf[0] = 0xA0;
  278. OpenUSB2DataBuf[1] = 0x02;
  279. OpenUSB2DataBuf[2] = 0x01;
  280. OpenUSB2DataBuf[3] = 0xA3;
  281. if (writeData(OpenUSB2DataBuf, 4))
  282. {
  283. return true;
  284. }
  285. else
  286. {
  287. return false;
  288. }
  289. }
  290. bool CGH_Relays::CloseUSB2()
  291. {
  292. char CloseUSB2DataBuf[4];
  293. CloseUSB2DataBuf[0] = 0xA0;
  294. CloseUSB2DataBuf[1] = 0x02;
  295. CloseUSB2DataBuf[2] = 0x00;
  296. CloseUSB2DataBuf[3] = 0xA2;
  297. if (writeData(CloseUSB2DataBuf, 4))
  298. {
  299. return true;
  300. }
  301. else
  302. {
  303. return false;
  304. }
  305. }
  306. void CGH_Relays::setSerialLastError(string error_msg)
  307. {
  308. last_error = error_msg;
  309. }
  310. void CGH_Relays::clearSerialLastError()
  311. {
  312. last_error = "";
  313. }
  314. CGH_Relays::CGH_Relays()
  315. {
  316. hCom=NULL;
  317. }
  318. CGH_Relays::~CGH_Relays()
  319. {
  320. }