+\r
+#include "__serial.h"\r
+\r
+HANDLE SerialPort = NULL; // Handle of SerialPort itself.\r
+\r
+BOOL SerialOpen(int port, int baud)\r
+{\r
+ HANDLE Comport;\r
+ DCB myDCB;\r
+ COMMTIMEOUTS CTout;\r
+ char str[100];\r
+\r
+ if (port > 9)\r
+ sprintf(str, "\\\\.\\COM%d", port);\r
+ else\r
+ sprintf(str, "COM%d", port);\r
+\r
+ // Open the serial port\r
+ if ((Comport = CreateFile(str, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE)\r
+ return FALSE;\r
+\r
+ // Configure Serial port (Setup Comm)\r
+\r
+ // Buffer sizes\r
+ if (!SetupComm(Comport, 128, 128))\r
+ return FALSE;\r
+\r
+ // Setup DCB using current values\r
+ if (!GetCommState(Comport, &myDCB))\r
+ return FALSE;\r
+\r
+ myDCB.fInX = FALSE; // Turn off xon/xoff handler\r
+ myDCB.fOutX = FALSE;\r
+ myDCB.fOutxDsrFlow = FALSE;\r
+ myDCB.fOutxCtsFlow = FALSE; // no hardware flow control.\r
+ myDCB.BaudRate = baud;\r
+ myDCB.DCBlength = sizeof(DCB);\r
+ myDCB.fBinary = 1;\r
+ myDCB.fParity = 0;\r
+ myDCB.fDtrControl = DTR_CONTROL_DISABLE;\r
+ myDCB.fDsrSensitivity = 0;\r
+ myDCB.fTXContinueOnXoff = 1;\r
+ myDCB.fNull = 0;\r
+ myDCB.fRtsControl = RTS_CONTROL_DISABLE;\r
+ myDCB.fDummy2 = 0;\r
+ myDCB.wReserved = 0;\r
+ myDCB.Parity = NOPARITY;\r
+ myDCB.StopBits = ONESTOPBIT;\r
+ myDCB.wReserved1 = 0;\r
+ myDCB.ByteSize = 8;\r
+\r
+ if (!SetCommState(Comport, &myDCB))\r
+ return FALSE;\r
+\r
+ // Set timeouts\r
+ CTout.ReadIntervalTimeout = 0xffffffff;\r
+ CTout.ReadTotalTimeoutMultiplier = 0;\r
+ CTout.ReadTotalTimeoutConstant = 0;\r
+ CTout.WriteTotalTimeoutMultiplier = 0;\r
+ CTout.WriteTotalTimeoutConstant = 5000; // don't hang if CTS is locked, for example\r
+\r
+ SetCommTimeouts(Comport, &CTout);\r
+ EscapeCommFunction(Comport, SETDTR);\r
+ PurgeComm(Comport, PURGE_TXCLEAR | PURGE_RXCLEAR);\r
+\r
+ SerialPort = Comport;\r
+\r
+ return TRUE;\r
+}\r
+\r
+void SerialClose(void)\r
+{\r
+ if (SerialPort == NULL) return;\r
+\r
+ PurgeComm(SerialPort, PURGE_TXCLEAR | PURGE_RXCLEAR);\r
+ CloseHandle(SerialPort);\r
+\r
+ SerialPort = NULL;\r
+}\r
+\r
+BOOL SerialSendChar(int c)\r
+{\r
+ DWORD cr;\r
+ if(WriteFile(SerialPort, &c, 1, (LPDWORD)&cr, NULL) && cr)\r
+ return TRUE;\r
+ else\r
+ return FALSE;\r
+}\r
+\r
+int SerialIsOpen(void)\r
+{\r
+ return (SerialPort != NULL);\r
+}\r
+\r
+int SerialGetChar(void)\r
+{\r
+ uint8 ch;\r
+ DWORD cr;\r
+ if (SerialPort != NULL) {\r
+ if (ReadFile(SerialPort, &ch, 1, (LPDWORD)&cr, NULL) && cr)\r
+ return (int)ch;\r
+ }\r
+ return EOF;\r
+}\r
+\r
+void SendCmd(uint8 *cmd, int size)\r
+{\r
+ int i;\r
+ for(i=0; i<size; i++) {\r
+ SerialSendChar(cmd[i]);\r
+ }\r
+}\r
+\r
+int ReadResp(uint8 *resp, int size)\r
+{\r
+ int i = 0, sum = 0, data;\r
+ while(i < size) {\r
+ while ((data = SerialGetChar()) == EOF) {}\r
+ resp[i] = data & 0xff;\r
+ sum += (data & 0xff);\r
+ i++;\r
+ }\r
+ return sum;\r
+}\r