1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2% Kommunikation mittels UART %
3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4
5 hUart = serial('COM1');
6 set(hUart, 'BaudRate', 115200);
7 set(hUart, 'DataBits', 8);
8 set(hUart, 'StopBits', 1);
9 set(hUart, 'InputBufferSize', 1024);
10 set(hUart, 'OutputBufferSize', 1024);
11 set(hUart, 'Timeout', 10);
12 fopen(hUart);
13 tmpData = [uint8(data)];
14 transmitUartData(hUart, CMD, size(tmpData,2), tmpData);
15
16 if (transmitUartDataWithRetry(hUart, CMD, ...
17 size(tmpData,2), ...
18 tmpData) ~= 1)
19 disp('Senden fehlgeschlagen!');
20 end
21
22 [retcmd, retlength, retdata, cksumOk] = receiveUartData(hUart);
23 fclose(hUart)
24
25
26 function successful = transmitUartDataWithRetry
27 (hUart, cmd, dataLength, data)
28 % transmit with retries when send error occurres
29 %
30 % input:
31 % hUart ... uart handle for transmit
32 % cmd ... command to send
33 % dataLength ... length of data
34 % data ... data to send
35 % output:
36 % successful ... how many chars sent
37 global CMD_ACK
38
39 maxRetry = 5;
40 successful = 0;
41 sendCnt = 0;
42 while (successful == 0) && (sendCnt < maxRetry)
43 % send data
44 transmitUartData(hUart, cmd, dataLength, data);
45
46 % receive message
47 [retcmd, retlength, retdata, cksumOk] =
48 receiveUartData(hUart);
49
50 % prove if ack message received
51 if ((retcmd == CMD_ACK) &&
52 (retlength == 0) &&
53 (cksumOk == 1))
54 successful = 1;
55 else
56 sendCnt = sendCnt + 1;
57 pause(1);
58 end;
59 end;
60
61 function transmitUartData(hUart, cmd, dataLength, data)
62 % transmit packet to targets
63 %
64 % input:
65 % hUart ... uart handle for transmit
66 % cmd ... command to send
67 % dataLength ... length of data
68 % data ... data to send
69 length = dataLength + 1;
70 calccksum = double(cmd) + double(length);
71 calccksum = mod(calccksum, 2^8);
72 for k=1:dataLength
73 calccksum = calccksum + double(data(k));
74 calccksum = mod(calccksum, 2^8);
75 end
76
77 if (dataLength > 0)
78 fwrite(hUart, [uint8(cmd), uint8(length),
79 data(1:dataLength), uint8(calccksum)]);
80 else
81 fwrite(hUart, [uint8(cmd),
82 uint8(length), uint8(calccksum)]);
83 end;
84
85
86 function [cmd, dataLength, data, cksumOk] = receiveUartData(hUart)
87 % reads received packet from targets
88 %
89 % packet: <cmd><length><data1>...<dataN><cksum>
90 %
91 % input:
92 % hUart ... uart handle for transmit
93 % output:
94 % cmd ... command
95 % dataLength ... length of data
96 % data ... received data
97 % cksumOK ... if checksum is OK
98 data = 0;
99 cmd = fread(hUart, 1);
100 if cmd
101 length = fread(hUart, 1);
102 if length
103 dataLength = length-1;
104 if (length-1 > 0)
105 data = fread(hUart, length-1);
106 end
107 calccksum = double(cmd) + double(length);
108 calccksum = mod(calccksum, 2^8);
109 for i=1:length-1
110 calccksum = calccksum + double(data(i));
111 calccksum = mod(calccksum, 2^8);
112 end
113
114 cksum = fread(hUart, 1);
115 if (cksum == calccksum)
116 cksumOk = 1;
117 else
118 display('CS Error!');
119 cksumOk = 0;
120 end;
121 else
122 % receive timeout occured
123 cmd = 0;
124 dataLength = 0;
125 data = 0;
126 cksumOk = 0;
127 end;
128 else
129 % receive timeout occured
130 cmd = 0;
131 dataLength = 0;
132 data = 0;
133 cksumOk = 0;
134 end;
135
136
137%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
138% Kommunikation mittels TCP/IP %
139%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
140
141 ipAddress = '127.0.0.1';
142 targetPort = 1234;
143 socket = tcpip(ipAddress, targetPort);
144 fopen(socket);
145
146 if strcmp(socket.Status, 'open')
147 tmpData(1) = mod(floor(data/(2^24)), 2^8);
148 tmpData(2) = mod(floor(data/(2^16)), 2^8);
149 tmpData(3) = mod(floor(data/(2^8)), 2^8);
150 tmpData(4) = mod(data, 2^8);
151 transmitTcpData(socket, CMD, 4, tmpData);
152
153 tmpData = [tmpData, ...
154 uint8(real(complNr)), ...
155 uint8(imag(complNr))];
156 if (transmitTcpDataWithRetry(socket, CMD, size(tmpData,2),
157 tmpData) ~= 1)
158 disp('Senden fehlgeschlagen!');
159 end
160
161 [cmd, length, data, cksumOk] = receiveTcpData(socket);
162 end
163
164 fclose(socket);
165
166
167 function successful = transmitTcpDataWithRetry(hSocket, cmd,
168 dataLength, data)
169 % transmit configuration with retries when send error occurres
170 %
171 % input:
172 % hSocket ... tcp socket for transmit
173 % cmd ... command to send
174 % dataLength ... length of data
175 % data ... data to send
176 % output:
177 % successful ... how many chars sent
178 global CMD_ACK
179
180 maxRetry = 5;
181 successful = 0;
182 sendCnt = 0;
183 while (successful == 0) && (sendCnt < maxRetry)
184 % send data
185 transmitTcpData(hSocket, cmd, dataLength, data);
186
187 % receive message
188 [retcmd, retlength, retdata, cksumOk] =
189 receiveTcpData(hSocket);
190
191 % prove if ack message received
192 if ((retcmd == CMD_ACK) &&
193 (retlength == 0) &&
194 (cksumOk == 1))
195 successful = 1;
196 else
197 sendCnt = sendCnt + 1;
198 end;
199 end;
200
201 function transmitTcpData(hSocket, cmd, dataLength, data)
202 % transmit packet to targets
203 %
204 % input:
205 % hSocket ... tcp socket for transmit
206 % cmd ... command to send
207 % dataLength ... length of data
208 % data ... data to send
209 length = dataLength + 2;
210 calccksum = mod((cmd + length), 2^8);
211 for k=1:dataLength
212 calccksum = mod((calccksum + data(k)), 2^8);
213 end
214 if (dataLength > 0)
215 fwrite(hSocket,
216 [cmd, length, data(1:dataLength), calccksum]);
217 else
218 fwrite(hSocket, [cmd, length, calccksum]);
219 end;
220
221 function [cmd, dataLength, data, cksumOk] = receiveTcpData(hSocket)
222 % reads received packet from targets
223 %
224 % packet: <cmd><length><data1>...<dataN><cksum>
225 %
226 % input:
227 % hSocket ... tcp socket for receiving
228 % output:
229 % cmd ... command
230 % length ... length of packet = N(data) + 1(cksum)
231 % data ... received data
232 % cksum ... cksum of rec. data = (cmd+length+data1+...+dataN)%2^8
233 data = 0;
234 cmd = fread(hSocket, 1);
235 if cmd
236 length = fread(hSocket, 1);
237 if length
238 dataLength = length-2;
239 if (length-2 > 0)
240 data = fread(hSocket, length-2);
241 end
242 calccksum = mod((cmd + length), 2^8);
243 for i=1:length-2
244 calccksum = mod((calccksum + data(i)), 2^8);
245 end
246 cksum = fread(hSocket, 1);
247 if (cksum == calccksum)
248 cksumOk = 1;
249 else
250 cksumOk = 0;
251 end;
252 else
253 % receive timeout occured
254 cmd = 0;
255 dataLength = 0;
256 data = 0;
257 cksumOk = 0;
258 end;
259 else
260 % receive timeout occured
261 cmd = 0;
262 dataLength = 0;
263 data = 0;
264 cksumOk = 0;
265 end;