Zum Hauptinhalt springen

Matlab - Communication

  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;