Browse Source

Helper reads and lists ports

Thomas Buck 12 years ago
parent
commit
baf4aad7d1
4 changed files with 247 additions and 31 deletions
  1. 93
    5
      Cube Control/helper/unixSerial.c
  2. 32
    0
      Cube Control/helper/winSerial.c
  3. 4
    4
      Cube Control/makefile
  4. 118
    22
      Cube Control/serialHelper.c

+ 93
- 5
Cube Control/helper/unixSerial.c View File

@@ -26,9 +26,13 @@
26 26
  */
27 27
 
28 28
 #include <stdio.h>
29
+#include <string.h>
29 30
 #include <unistd.h>
30 31
 #include <fcntl.h>
31 32
 #include <termios.h>
33
+#include <dirent.h>
34
+
35
+#define SEARCH "tty."
32 36
 
33 37
 #define BAUD B19200
34 38
 
@@ -38,6 +42,10 @@ int fd = -1;
38 42
 int serialOpen(char *port) {
39 43
 	struct termios options;
40 44
 
45
+	if ((strcmp(ttyname(fileno(stdin)), port) == 0) || (strcmp(ttyname(fileno(stdout)), port) == 0)) {
46
+		return -1;
47
+	}
48
+
41 49
 	if (fd != -1) {
42 50
 		close(fd);
43 51
 	}
@@ -46,10 +54,22 @@ int serialOpen(char *port) {
46 54
 		return -1;
47 55
 	}
48 56
 	
49
-	fcntl(fd, F_SETFL, FNDELAY); // read() isn't blocking'
50
-	tcgetattr(fd, &options);
51
-	cfsetispeed(&options, BAUD); // Set speed
52
-	cfsetospeed(&options, BAUD);
57
+	if (fcntl(fd, F_SETFL, FNDELAY) == -1) { // read() isn't blocking'
58
+		close(fd);
59
+		return -1;
60
+	}
61
+	if (tcgetattr(fd, &options) == -1) {
62
+		close(fd);
63
+		return -1;
64
+	}
65
+	if (cfsetispeed(&options, BAUD) == -1) { // Set speed
66
+		close(fd);
67
+		return -1;
68
+	}
69
+	if (cfsetospeed(&options, BAUD) == -1) {
70
+		close(fd);
71
+		return -1;
72
+	}
53 73
 	options.c_cflag |= (CLOCAL | CREAD);
54 74
 	
55 75
 	options.c_cflag &= ~PARENB; // 8N1
@@ -61,7 +81,10 @@ int serialOpen(char *port) {
61 81
 	options.c_oflag &= ~OPOST; // Raw output
62 82
 	options.c_iflag &= ~(IXON | IXOFF | IXANY); // No flow control
63 83
 
64
-	tcsetattr(fd, TCSANOW, &options);
84
+	if (tcsetattr(fd, TCSANOW, &options) == -1) {
85
+		close(fd);
86
+		return -1;
87
+	}
65 88
 
66 89
 	return 0;
67 90
 }
@@ -80,3 +103,68 @@ ssize_t serialRead(char *data, size_t length) {
80 103
 void serialClose(void) {
81 104
 	close(fd);
82 105
 }
106
+
107
+char** namesInDev(int *siz) {
108
+	DIR *dir;
109
+	struct dirent *ent;
110
+	int i = 0, size = 0;
111
+	char **files = NULL;
112
+	dir = opendir("/dev/");
113
+	while ((ent = readdir(dir)) != NULL) {
114
+		size++;
115
+	}
116
+	files = (char **)malloc((size + 1) * sizeof(char *));
117
+	files[size] = NULL;
118
+	closedir(dir);
119
+	dir = opendir("/dev/");
120
+	while ((ent = readdir(dir)) != NULL) {
121
+		files[i] = (char *)malloc((strlen(ent->d_name) + 1) * sizeof(char));
122
+		files[i] = strcpy(files[i], ent->d_name);
123
+		i++;
124
+	}
125
+	closedir(dir);
126
+
127
+	char *tmp = NULL;
128
+	// Fix every string, addin /dev/ in front of it...
129
+	for (i = 0; i < size; i++) {
130
+		tmp = (char *)malloc((strlen(files[i]) + 6) * sizeof(char));
131
+		tmp[0] = '/';
132
+		tmp[1] = 'd';
133
+		tmp[2] = 'e';
134
+		tmp[3] = 'v';
135
+		tmp[4] = '/';
136
+		files[i] = strncat(tmp, files[i], strlen(files[i]));
137
+	}
138
+
139
+	*siz = size;
140
+	return files;
141
+}
142
+
143
+char** getSerialPorts(void) {
144
+	int size;
145
+	char** files = namesInDev(&size);
146
+	char** fin = NULL;
147
+	int i = 0, j = 0, f, g;
148
+
149
+	fin = (char **)malloc((size + 1) * sizeof(char *));
150
+	fin[size] = NULL;
151
+	while (files[i] != NULL) {
152
+		if (strstr(files[i], SEARCH) != NULL) {
153
+			f = serialOpen(files[i]);
154
+			if (fd != -1) {
155
+				fin[j++] = files[i];
156
+				serialClose();
157
+			}
158
+		}
159
+		i++;
160
+	}
161
+	free(files);
162
+
163
+	char** finish = (char **)malloc((j + 1) * sizeof(char *));
164
+	for (i = 0; i < (j + 1); i++) {
165
+		finish[i] = fin[i];
166
+	}
167
+	free(fin);
168
+
169
+	return finish;
170
+}

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

@@ -99,3 +99,35 @@ void serialClose(void) {
99 99
 	CloseHandle(hSerial);
100 100
 	hSerial = INVALID_HANDLE_VALUE;
101 101
 }
102
+
103
+// Last element has to be NULL
104
+char** getSerialPorts(void) {
105
+	LPTSTR ports;
106
+	DWORD num;
107
+	char **files;
108
+	int i, j = 0, start, k;
109
+
110
+#ifdef UNICODE
111
+	ports = (LPTSTR)malloc(100 * sizeof(WCHAR));
112
+#else
113
+	 ports = (LPTSTR)malloc(100 * sizeof(CHAR));
114
+#endif
115
+
116
+	num = QueryDosDevice(ports, 100);	
117
+	files = (char **)malloc(num * sizeof(char *));
118
+	
119
+	for (i = 0; i < num; i++) {
120
+		start = j;
121
+		j = 0;
122
+		while (ports[start + j] != '\0') {
123
+			j++;
124
+		}
125
+		j++; // \0
126
+		files[i] = (char *)malloc(j * sizeof(char));
127
+		for (k = 0; k < j; k++) {
128
+			files[i] = ports[start + k];
129
+		}
130
+	}
131
+
132
+	return files;
133
+}

+ 4
- 4
Cube Control/makefile View File

@@ -1,7 +1,7 @@
1 1
 JAVAC = javac
2 2
 CC = gcc
3
-#TARGET = unix
4
-TARGET = win
3
+TARGET = unix
4
+#TARGET = win
5 5
 
6 6
 JAVAFILES = cubeWorker.java layerEditFrame.java frame.java
7 7
 
@@ -27,10 +27,10 @@ frame.class: serialHelper
27 27
 endif
28 28
 	$(JAVAC) $(JAVAFILES)
29 29
 
30
-serialHelper.exe:
30
+serialHelper.exe: serialHelper.c helper/winSerial.c
31 31
 	$(CC) -o serialHelper.exe -D winHelper serialHelper.c
32 32
 
33
-serialHelper:
33
+serialHelper: serialHelper.c helper/unixSerial.c
34 34
 	$(CC) -o serialHelper serialHelper.c
35 35
 
36 36
 clean:

+ 118
- 22
Cube Control/serialHelper.c View File

@@ -34,6 +34,11 @@ char *fileData = NULL;
34 34
 void removeFromBeginning(size_t size, size_t remove);
35 35
 size_t readFile(char *path);
36 36
 size_t getFileSize(FILE *fp);
37
+void usage(char *name);
38
+int parseNumber(char *s);
39
+int power(int num, int pow);
40
+void printFileData(size_t size);
41
+void printSerialPorts(char ** ports);
37 42
 
38 43
 /*
39 44
 Return values:
@@ -42,40 +47,84 @@ Return values:
42 47
 2: Serial Port Error
43 48
 3: Data File Error
44 49
 */
50
+
45 51
 int main(int argc, char *argv[]) {
46 52
 	size_t length, written;
47
-	
48
-	if (argc < 3) {
49
-#ifdef winHelper
50
-		printf("Usage:\n%s COM1 C:\\file\\to\\send.txt\n", argv[0]);
51
-#else
52
-		printf("Usage:\n%s /dev/SerialPort /file/to/send\n", argv[0]);
53
-#endif
54
-		return 1;
55
-	} else {
56
-		if (serialOpen(argv[1]) != 0) {
57
-			printf("Error: Could not open %s\n", argv[1]);
58
-			return 2;
59
-		}
60 53
 
61
-		length = readFile(argv[2]);
62
-		if (length == 0) {
63
-			printf("Error while reading %s\n", argv[2]);
64
-			return 3;
54
+		if (argc < 2) {
55
+			usage(argv[0]);
56
+			return 1;
65 57
 		}
66 58
 
67
-		written = serialWrite(fileData, length);
68
-		while (written < length) {
69
-			removeFromBeginning(length, written);
70
-			length -= written;
59
+		if (argv[1][0] == 'p') {
60
+
61
+			if (argc != 2) {
62
+				usage(argv[0]);
63
+				return 1;
64
+			}
65
+			char** ports = getSerialPorts();
66
+			printSerialPorts(ports);
67
+			free(ports);
68
+			return 0;
69
+
70
+		} else if (argv[1][0] == 'w') {
71
+
72
+			if (argc != 4) {
73
+				usage(argv[0]);
74
+				return 1;
75
+			}
76
+			if (serialOpen(argv[2]) != 0) {
77
+				printf("Error: Could not open %s\n", argv[1]);
78
+				return 2;
79
+			}
80
+			// write file to com port
81
+			length = readFile(argv[3]);
82
+			if (length == 0) {
83
+				printf("Error while reading %s\n", argv[2]);
84
+				return 3;
85
+			}
86
+	
71 87
 			written = serialWrite(fileData, length);
88
+			while (written < length) {
89
+				removeFromBeginning(length, written);
90
+				length -= written;
91
+				written = serialWrite(fileData, length);
92
+			}
93
+
94
+		} else {
95
+
96
+			if (argc != 4) {
97
+				usage(argv[0]);
98
+				return 1;
99
+			}
100
+			if (serialOpen(argv[2]) != 0) {
101
+				printf("Error: Could not open %s\n", argv[1]);
102
+				return 2;
103
+			}
104
+			// Read from com port to file
105
+			if (argc < 5) {
106
+				printf("No size given. ");
107
+				usage(argv[0]);
108
+				return 1;
109
+			}
110
+			
111
+			length = parseNumber(argv[3]);
112
+			fileData = (char *)malloc(length * sizeof(char));
113
+			// fill fileData with serial Port data
114
+			written = 0;
115
+			while (written < length) {
116
+				written = serialRead(fileData + written, length - written);
117
+			}
118
+
119
+			printFileData(length);
120
+
72 121
 		}
73 122
 
74 123
 		free(fileData);
75 124
 		fileData = NULL;
76 125
 		serialClose();
77 126
 		return 0;
78
-	}
127
+	// }
79 128
 }
80 129
 
81 130
 void removeFromBeginning(size_t size, size_t remove) {
@@ -124,3 +173,50 @@ size_t getFileSize(FILE *fp) {
124 173
 
125 174
 	return size;
126 175
 }
176
+
177
+void usage(char *name) {
178
+#ifdef winHelper
179
+	printf("Usage:\n%s r|w|p [COM1 [C:\\file\\to\\send.txt] [sizeToRead]]\n", name);
180
+#else
181
+	printf("Usage:\n%s r|w|p [/dev/SerialPort [/file/to/send] [sizeToRead]]\n", name);
182
+#endif
183
+}
184
+
185
+int parseNumber(char *s) {
186
+	int i, size = 0, result = 0;
187
+	while (*(s++) != '\0') {
188
+		size++;
189
+	}
190
+	for (i = 0; i < size; i++) {
191
+		result += (s[i] - '0') * power(10, (size - i));
192
+	}
193
+	return result;
194
+}
195
+
196
+int power(int num, int pow) {
197
+	int result = 1;
198
+	while (pow > 0) {
199
+		result *= num;
200
+		pow--;
201
+	}
202
+	return result;
203
+}
204
+
205
+void printFileData(size_t size) {
206
+	int i;
207
+	for (i = 0; i < size; i++) {
208
+		printf("%x", fileData[i]);
209
+		if (i % 8 == 0) {
210
+			printf("\n");
211
+		}
212
+	}
213
+}
214
+
215
+void printSerialPorts(char ** ports) {
216
+	int i = 0;
217
+	while (ports[i] != NULL) {
218
+		printf("%s\n", ports[i]);
219
+		i++;
220
+	}
221
+}
222
+

Loading…
Cancel
Save