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.

214 lines
6.0 KiB

  1. #include "serial.h"
  2. #include <stdio.h>
  3. #include <windows.h>
  4. PORT OpenPort(int idx) {
  5. HANDLE hComm;
  6. TCHAR comname[100];
  7. wsprintf(comname, TEXT("\\\\.\\COM%d"), idx);
  8. hComm = CreateFile(comname, // port name
  9. GENERIC_READ | GENERIC_WRITE, // Read/Write
  10. 0, // No Sharing
  11. NULL, // No Security
  12. OPEN_EXISTING, // Open existing port only
  13. 0, // Non Overlapped I/O
  14. NULL); // Null for Comm Devices
  15. if (hComm == INVALID_HANDLE_VALUE) return NULL;
  16. COMMTIMEOUTS timeouts = {0};
  17. timeouts.ReadIntervalTimeout = 50;
  18. timeouts.ReadTotalTimeoutConstant = 50;
  19. timeouts.ReadTotalTimeoutMultiplier = 10;
  20. timeouts.WriteTotalTimeoutConstant = 50;
  21. timeouts.WriteTotalTimeoutMultiplier = 10;
  22. if (SetCommTimeouts(hComm, &timeouts) == FALSE) return NULL;
  23. if (SetCommMask(hComm, EV_RXCHAR) == FALSE) return NULL;
  24. printf("open%d ok\n", idx);
  25. return hComm;
  26. }
  27. void ClosePort(PORT com_port) { CloseHandle(com_port); }
  28. int SetPortBoudRate(PORT com_port, int rate) {
  29. DCB dcbSerialParams = {0};
  30. BOOL Status;
  31. dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
  32. Status = GetCommState(com_port, &dcbSerialParams);
  33. if (Status == FALSE) return FALSE;
  34. dcbSerialParams.BaudRate = rate;
  35. Status = SetCommState(com_port, &dcbSerialParams);
  36. return Status;
  37. }
  38. int SetPortDataBits(PORT com_port, int bits) {
  39. DCB dcbSerialParams = {0};
  40. BOOL Status;
  41. dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
  42. Status = GetCommState(com_port, &dcbSerialParams);
  43. if (Status == FALSE) return FALSE;
  44. dcbSerialParams.ByteSize = bits;
  45. Status = SetCommState(com_port, &dcbSerialParams);
  46. return Status;
  47. }
  48. int SetPortStopBits(PORT com_port, int bits) {
  49. DCB dcbSerialParams = {0};
  50. BOOL Status;
  51. dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
  52. Status = GetCommState(com_port, &dcbSerialParams);
  53. if (Status == FALSE) return FALSE;
  54. dcbSerialParams.StopBits = bits;
  55. Status = SetCommState(com_port, &dcbSerialParams);
  56. return Status;
  57. }
  58. // 默认为无校验。NOPARITY 0; ODDPARITY 1;EVENPARITY 2;MARKPARITY 3;SPACEPARITY 4
  59. int SetPortParity(PORT com_port, int parity) {
  60. DCB dcbSerialParams = {0};
  61. BOOL Status;
  62. dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
  63. Status = GetCommState(com_port, &dcbSerialParams);
  64. if (Status == FALSE) return FALSE;
  65. dcbSerialParams.Parity = parity;
  66. Status = SetCommState(com_port, &dcbSerialParams);
  67. return Status;
  68. }
  69. int GetPortBoudRate(PORT com_port) {
  70. DCB dcbSerialParams = {0};
  71. BOOL Status;
  72. dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
  73. Status = GetCommState(com_port, &dcbSerialParams);
  74. if (Status == FALSE) return -1;
  75. return dcbSerialParams.BaudRate;
  76. }
  77. int GetPortDataBits(PORT com_port) {
  78. DCB dcbSerialParams = {0};
  79. BOOL Status;
  80. dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
  81. Status = GetCommState(com_port, &dcbSerialParams);
  82. if (Status == FALSE) return -1;
  83. return dcbSerialParams.ByteSize;
  84. }
  85. int GetPortStopBits(PORT com_port) {
  86. DCB dcbSerialParams = {0};
  87. BOOL Status;
  88. dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
  89. Status = GetCommState(com_port, &dcbSerialParams);
  90. if (Status == FALSE) return -1;
  91. return dcbSerialParams.StopBits;
  92. }
  93. int GetPortParity(PORT com_port) {
  94. DCB dcbSerialParams = {0};
  95. BOOL Status;
  96. dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
  97. Status = GetCommState(com_port, &dcbSerialParams);
  98. if (Status == FALSE) return -1;
  99. return dcbSerialParams.Parity;
  100. }
  101. int SendData(PORT com_port, const char *data) {
  102. DWORD dNoOFBytestoWrite = strlen(data);
  103. DWORD dNoOfBytesWritten;
  104. BOOL Status = WriteFile(com_port, data, dNoOFBytestoWrite, &dNoOfBytesWritten, NULL);
  105. if (Status == FALSE) {
  106. return -1;
  107. } else {
  108. printf("%s\n", data);
  109. }
  110. return dNoOfBytesWritten;
  111. }
  112. int ReciveData(PORT com_port, char *data, int len) {
  113. DWORD dwEventMask;
  114. DWORD NoBytesRead;
  115. BOOL Status = WaitCommEvent(com_port, &dwEventMask, NULL);
  116. if (Status == FALSE) {
  117. return FALSE;
  118. }
  119. Status = ReadFile(com_port, data, len, &NoBytesRead, NULL);
  120. data[NoBytesRead] = 0;
  121. if (Status == FALSE) {
  122. return FALSE;
  123. } else {
  124. printf("%s\n", data);
  125. }
  126. return TRUE;
  127. }
  128. PORT serial_init(int idx, int rate, int databits, int stopbits, int parity) {
  129. int ret = 0;
  130. PORT com_port;
  131. com_port = OpenPort(idx);
  132. if (com_port == INVALID_HANDLE_VALUE) {
  133. printf("open COM%d fail\n", idx);
  134. return NULL;
  135. }
  136. ret = SetPortBoudRate(com_port, rate);
  137. if (ret == FALSE) {
  138. printf("set COM%d band fail\n", idx);
  139. return NULL;
  140. }
  141. ret = SetPortDataBits(com_port, databits);
  142. if (ret == FALSE) {
  143. printf("set COM%d databits fail\n", idx);
  144. return NULL;
  145. }
  146. stopbits = ONESTOPBIT;
  147. printf("stopbits %d\n", stopbits);
  148. ret = SetPortStopBits(com_port, stopbits);
  149. if (ret == FALSE) {
  150. printf("set COM%d stopbits fail\n", idx);
  151. return NULL;
  152. }
  153. ret = SetPortParity(com_port, parity);
  154. if (ret == FALSE) {
  155. printf("set COM%d parity fail\n", idx);
  156. return NULL;
  157. }
  158. return com_port;
  159. }
  160. int Serial_SendData(PORT com_port, const char *data, int len) {
  161. DWORD dNoOfBytesWritten;
  162. BOOL Status = WriteFile(com_port, data, len, &dNoOfBytesWritten, NULL);
  163. if (Status == FALSE)
  164. return -1;
  165. else
  166. printf("send ok\n");
  167. return 0;
  168. }
  169. int Serial_ReciveData(PORT com_port, char *data, int len) {
  170. DWORD dwEventMask;
  171. DWORD NoBytesRead;
  172. BOOL Status = WaitCommEvent(com_port, &dwEventMask, NULL);
  173. if (Status == FALSE) {
  174. return -1;
  175. }
  176. Status = ReadFile(com_port, data, len, &NoBytesRead, NULL);
  177. data[NoBytesRead] = 0;
  178. if (Status == FALSE)
  179. return -1;
  180. else
  181. printf("rcv ok\n");
  182. return NoBytesRead;
  183. }