Browse Source

Added Windows helper

Thomas Buck 12 years ago
parent
commit
6d1000c993
2 changed files with 179 additions and 0 deletions
  1. 81
    0
      Cube Control/helper/winSerial.c
  2. 98
    0
      Cube Control/winHelper.c

+ 81
- 0
Cube Control/helper/winSerial.c View File

@@ -0,0 +1,81 @@
1
+/*
2
+ * Windows 16 (& 32 & 64?) compatible serial port library
3
+ * Uses 8 databits, no parity, 1 stop bit, no handshaking
4
+ * By: Thomas Buck <taucher.bodensee@gmail.com>
5
+ * Visit: www.xythobuz.org
6
+ */
7
+
8
+#include <stdio.h>
9
+#include <windows.h>
10
+
11
+#define BAUD CBR_19200;
12
+
13
+HANDLE hSerial = INVALID_HANDLE_VALUE;
14
+
15
+// Open the serial port
16
+int serialOpen(char *port) {
17
+	DCB dcbSerialParams = {0};
18
+	COMMTIMEOUTS timeouts = {0};
19
+
20
+	hSerial = CreateFile(port GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
21
+
22
+	if (hSerial == INVALID_HANDLE_VALUE) {
23
+		return -1;
24
+	}
25
+	
26
+
27
+	dcbSerial.DCBlength = sizeof(dcbSerialParams);
28
+	if (!GetCommState(hSerial, &dcbSerialParams)) {
29
+		CloseHandle(hSerial);
30
+		hSerial = INVALID_HANDLE_VALUE;
31
+		return -1;
32
+	}
33
+	dcbSerialParams.BaudRate = BAUD;
34
+	dcbSerialParams.ByteSize = 8;
35
+	dcbSerialParams.StopBits = ONESTOPBIT;
36
+	dcbSerialParams.Parity = NOPARITY;
37
+	if (!SetCommState(hSerial, &dcbSerialParams)) {
38
+		CloseHandle(hSerial);
39
+		hSerial = INVALID_HANDLE_VALUE;
40
+		return -1;
41
+	}
42
+	
43
+	timeouts.ReadIntervalTimeout = 50;
44
+	timeouts.ReadTotalTimeoutConstant = 50;
45
+	timeouts.ReadTotalTimeoutMultiplier = 10;
46
+	timeouts.WriteTotalTimeoutConstant = 50;
47
+	timeouts.WriteTotalTimeoutMultiplier = 10;
48
+
49
+	if (!SetCommTimeouts(hSerial, &timeouts)) {
50
+		CloseHandle(hSerial);
51
+		hSerial = INVALID_HANDLE_VALUE;
52
+		return -1;
53
+	}
54
+
55
+	return 0;
56
+}
57
+
58
+// Write to port. Returns number of characters sent, -1 on error
59
+ssize_t serialWrite(char *data, size_t length) {
60
+	DWORD dwBytesWritten = 0;
61
+	if (!WriteFile(hSerial, data, length, &dwBytesWritten, NULL)) {
62
+		return -1;
63
+	}
64
+	return dwBytesWritten;
65
+
66
+}
67
+
68
+// Read from port. Return number of characters read, 0 if none available, -1 on error
69
+ssize_t serialRead(char *data, size_t length) {
70
+	DWORD dwBytesRead = 0;
71
+	if (!ReadFile(hSerial, data, length, &dwBytesRead, NULL)) {
72
+		return -1;
73
+	}
74
+	return dwBytesRead;
75
+}
76
+
77
+// Close the serial Port
78
+void serialClose(void) {
79
+	CloseHandle(hSerial);
80
+	hSerial = INVALID_HANDLE_VALUE;
81
+}

+ 98
- 0
Cube Control/winHelper.c View File

@@ -0,0 +1,98 @@
1
+/*
2
+ * By: Thomas Buck <taucher.bodensee@gmail.com>
3
+ * Visit: www.xythobuz.org
4
+ */
5
+#include <stdlib.h>
6
+#include <stdio.h>
7
+#include "helper/winSerial.c"
8
+
9
+char *fileData = NULL;
10
+
11
+void removeFromBeginning(size_t size, size_t remove);
12
+size_t readFile(char *path);
13
+size_t getFileSize(FILE *fp);
14
+
15
+/*
16
+Return values:
17
+0: Success
18
+1: Usage error
19
+2: Serial Port Error
20
+3: Data File Error
21
+*/
22
+int main(int argc, char *argv[]) {
23
+	size_t length, written;
24
+	
25
+	if (argc < 3) {
26
+		printf("Usage:\n%s COM1 C:\\file\\to\\send.txt\n", argv[0]);
27
+		return 1;
28
+	} else {
29
+		if (serialOpen(argv[1]) != 0) {
30
+			printf("Error: Could not open %s\n", argv[1]);
31
+			return 2;
32
+		}
33
+
34
+		length = readFile(argv[2]);
35
+		if (length == 0) {
36
+			printf("Error while reading %s\n", argv[2]);
37
+			return 3;
38
+		}
39
+
40
+		written = serialWrite(fileData, length);
41
+		while (written < length) {
42
+			removeFromBeginning(length, written);
43
+			length -= written;
44
+			written = serialWrite(fileData, length);
45
+		}
46
+
47
+		free(fileData);
48
+		fileData = NULL;
49
+		serialClose();
50
+		return 0;
51
+	}
52
+}
53
+
54
+void removeFromBeginning(size_t size, size_t remove) {
55
+	size_t i;
56
+	char *tmp = (char *)malloc((size - remove) * sizeof(char));
57
+
58
+	for (i = 0; i < (size - remove); i++) {
59
+		tmp[i] = fileData[i + remove];
60
+	}
61
+	free(fileData);
62
+	fileData = tmp;
63
+}
64
+
65
+size_t readFile(char *path) {
66
+	size_t size, i;
67
+	FILE *fp;
68
+
69
+	fp = fopen(path, "r");
70
+	if (!fp) {
71
+		return 0;
72
+	}
73
+
74
+	size = getFileSize(fp);
75
+	fileData = (char *)malloc(size * sizeof(char));
76
+	for (i = 0; i < size; i++) {
77
+		fileData[i] = fgetc(fp);
78
+	}
79
+
80
+	fclose(fp);
81
+	return size;
82
+}
83
+
84
+size_t getFileSize(FILE *fp) {
85
+	size_t size = 0;
86
+	int c;
87
+
88
+	fseek(fp, 0, 0); // Set file pointer to beginning
89
+	
90
+	do { // Calculate size
91
+		c = fgetc(fp);
92
+		size++;
93
+	} while (c != EOF);
94
+	
95
+	fseek(fp, 0, 0);
96
+
97
+	return size;
98
+}

Loading…
Cancel
Save