You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

167 line
5.6 KiB

  1. #include "common.h"
  2. /*******************************************************************************************
  3.  * 功能     : 打开串口
  4. * port     : 串口号, 如("COM1")
  5. * baud_rate: 波特率
  6. * date_bits: 数据位(有效范围4~8)
  7. * stop_bit : 停止位
  8. * parity   : 奇偶校验。默认为无校验。NOPARITY 0; ODDPARITY 1;EVENPARITY 2
  9. ********************************************************************************************/
  10. HANDLE Init_COM(LPCTSTR Port, int baud_rate, BYTE date_bits, BYTE stop_bit, BYTE parity)
  11. {
  12. HANDLE Handle_Com = CreateFile(Port, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);//同步方式打开串口
  13. if (INVALID_HANDLE_VALUE == Handle_Com)
  14. {
  15. return INVALID_HANDLE_VALUE;
  16. }
  17. SetupComm(Handle_Com, 4096, 4096);//设置缓存
  18. DCB dcb;
  19. if (!GetCommState(Handle_Com, &dcb))
  20. {
  21. cout << "获取串口配置失败" << endl;
  22. }
  23. dcb.BaudRate = baud_rate; //波特率
  24. dcb.fBinary = TRUE; //二进制模式。必须为TRUE
  25. dcb.ByteSize = date_bits; //数据位。范围4-8
  26. if (stop_bit == 0)
  27. dcb.StopBits = ONESTOPBIT; //停止位
  28. if (stop_bit == 1)
  29. dcb.StopBits = ONE5STOPBITS; //停止位
  30. if (stop_bit == 2)
  31. dcb.StopBits = TWOSTOPBITS; //停止位
  32. if (parity == NOPARITY)
  33. {
  34. dcb.fParity = FALSE; //奇偶校验关闭
  35. dcb.Parity = parity; //校验模式
  36. }
  37. else
  38. {
  39. dcb.fParity = TRUE; //奇偶校验开启
  40. dcb.Parity = parity; //校验模式
  41. }
  42. cout << SetCommState(Handle_Com, &dcb) << endl;
  43. PurgeComm(Handle_Com, PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR | PURGE_TXABORT);//清除缓存
  44. //设置串口读写时间
  45. COMMTIMEOUTS CommTimeOuts;
  46. GetCommTimeouts(Handle_Com, &CommTimeOuts);
  47. CommTimeOuts.ReadIntervalTimeout = 5;
  48. CommTimeOuts.ReadTotalTimeoutMultiplier = 1;
  49. CommTimeOuts.ReadTotalTimeoutConstant = 0;
  50. CommTimeOuts.WriteTotalTimeoutMultiplier = 10;
  51. CommTimeOuts.WriteTotalTimeoutConstant = 1000;
  52. if (!SetCommTimeouts(Handle_Com, &CommTimeOuts)) {
  53. return INVALID_HANDLE_VALUE;
  54. }
  55. return Handle_Com;
  56. }
  57. /*********************************************************************************************
  58. * 功能     :  发送响应数据
  59. * 描述    : 向串口写入数据
  60. * 返回值 : true 发送成功 false 发送失败
  61. * m_hComm : 串口句柄
  62. * data : 要写入的数据
  63. * len : 写入数据的长度
  64. **********************************************************************************************/
  65. bool SendData(HANDLE m_hComm, char* data, int len)
  66. {
  67. if (m_hComm == INVALID_HANDLE_VALUE)
  68. return FALSE;
  69. //清空串口
  70. PurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR);
  71. //写串口
  72. DWORD dwWrite = 0;
  73. DWORD dwRet = WriteFile(m_hComm, data, len, &dwWrite, NULL);
  74. //清空串口
  75. PurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR);
  76. if (!dwRet)
  77. return FALSE;
  78. return TRUE;
  79. }
  80. /*********************************************************************************************
  81. * 功能     :  Ms延时器
  82. * 描述    : ms级准确延时
  83. * 输入 : lTime 延时的ms数
  84. * 返回值 : 无
  85. **********************************************************************************************/
  86. void MSleep(long lTime)
  87. {
  88. LARGE_INTEGER litmp;
  89. LONGLONG QPart1, QPart2;
  90. double dfMinus, dfFreq, dfTim, dfSpec;
  91. QueryPerformanceFrequency(&litmp);
  92. dfFreq = (double)litmp.QuadPart;
  93. QueryPerformanceCounter(&litmp);
  94. QPart1 = litmp.QuadPart;
  95. dfSpec = 0.000001*lTime;
  96. do
  97. {
  98. QueryPerformanceCounter(&litmp);
  99. QPart2 = litmp.QuadPart;
  100. dfMinus = (double)(QPart2 - QPart1);
  101. dfTim = dfMinus / dfFreq;
  102. } while (dfTim<dfSpec);
  103. }
  104. /*********************************************************************************************
  105. * 功能     :  输入端口名称
  106. * 描述    : 获取串口通信的端口名称
  107. * 输入 : 无
  108. * 返回值 : COMM 端口名
  109. **********************************************************************************************/
  110. string Input_COMM(void)
  111. {
  112. }
  113. /*********************************************************************************************
  114. * 功能     :  输入波特率
  115. * 描述    : 获取串口通信的波特率
  116. * 输入 : 无
  117. * 返回值 : Boud_Rate 波特率
  118. **********************************************************************************************/
  119. unsigned int Input_Boud_Rate(void)
  120. {
  121. }
  122. /*********************************************************************************************
  123. * 功能     :  输入数据位
  124. * 描述    : 获取串口通信的数据位个数
  125. * 输入 : 无
  126. * 返回值 : Date_Bits 数据位
  127. **********************************************************************************************/
  128. unsigned int Input_Date_Bits(void)
  129. {
  130. }
  131. /*********************************************************************************************
  132. * 功能     :  输入停止位
  133. * 描述    : 获取串口通信的停止位
  134. * 输入 : Date_Bits 数据位
  135. * Stop_Bits= 0,1,2对应的是1bit,1.5bits,2bits.
  136. * Date_Bits=6,7,8时 Stop_Bits不能为1
  137. * Date_Bits=5时 Stop_Bits不能为2
  138. * 返回值 : Stop_Bits 数据位
  139. **********************************************************************************************/
  140. unsigned int Input_Stop_Bits(unsigned int Date_Bits)
  141. {
  142. }
  143. /*********************************************************************************************
  144. * 功能     :  选择校验位
  145. * 描述    : 获取串口通信的校验位
  146. * 输入 : 无
  147. * 返回值 : Parity数据位
  148. **********************************************************************************************/
  149. unsigned int Input_Parity(void)
  150. {
  151. }