You are here

Matlab - Communication

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Kommunikation mittels UART                                        %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
        hUart = serial('COM1');
        set(hUart, 'BaudRate', 115200);
        set(hUart, 'DataBits', 8);
        set(hUart, 'StopBits', 1);
        set(hUart, 'InputBufferSize', 1024);
        set(hUart, 'OutputBufferSize', 1024);
        set(hUart, 'Timeout', 10);
        fopen(hUart);
            tmpData = [uint8(data)];
            transmitUartData(hUart, CMD, size(tmpData,2), tmpData);
 
            if (transmitUartDataWithRetry(hUart, CMD, ...
                                          size(tmpData,2), ...
                                          tmpData) ~= 1)
                disp('Senden fehlgeschlagen!');
            end
 
            [retcmd, retlength, retdata, cksumOk] = receiveUartData(hUart);
        fclose(hUart)
 
 
        function successful = transmitUartDataWithRetry
                              (hUart, cmd, dataLength, data)
        % transmit with retries when send error occurres
        %
        % input:
        %   hUart      ... uart handle for transmit
        %   cmd        ... command to send
        %   dataLength ... length of data
        %   data       ... data to send
        % output:
        %   successful ... how many chars sent
            global CMD_ACK
 
            maxRetry = 5;
            successful = 0;
            sendCnt = 0;
            while (successful == 0) && (sendCnt < maxRetry)
                % send data
                transmitUartData(hUart, cmd, dataLength, data);
 
                % receive message
                [retcmd, retlength, retdata, cksumOk] =
                    receiveUartData(hUart);
 
                % prove if ack message received
                if ((retcmd == CMD_ACK) &&
                    (retlength == 0) &&
                    (cksumOk == 1))
                    successful = 1;
                else
                    sendCnt = sendCnt + 1;
                    pause(1);
                end;
            end;
 
        function transmitUartData(hUart, cmd, dataLength, data)
        % transmit packet to targets
        %
        % input:
        %   hUart      ... uart handle for transmit
        %   cmd        ... command to send
        %   dataLength ... length of data
        %   data       ... data to send
            length = dataLength + 1;
            calccksum = double(cmd) + double(length);
            calccksum = mod(calccksum, 2^8);
            for k=1:dataLength
                calccksum = calccksum + double(data(k));
                calccksum = mod(calccksum, 2^8);
            end
 
            if (dataLength > 0)
                fwrite(hUart, [uint8(cmd), uint8(length),
                       data(1:dataLength), uint8(calccksum)]);
            else
                fwrite(hUart, [uint8(cmd),
                       uint8(length), uint8(calccksum)]);
            end;
 
 
        function [cmd, dataLength, data, cksumOk] = receiveUartData(hUart)
        % reads received packet from targets
        %
        % packet: <cmd><length><data1>...<dataN><cksum>
        %
        % input:
        %   hUart      ... uart handle for transmit
        % output:
        %   cmd        ... command
        %   dataLength ... length of data
        %   data       ... received data
        %   cksumOK    ... if checksum is OK
            data = 0;
            cmd = fread(hUart, 1);
            if cmd
                length = fread(hUart, 1);
                if length
                    dataLength = length-1;
                    if (length-1 > 0)
                        data = fread(hUart, length-1);
                    end
                    calccksum = double(cmd) + double(length);
                    calccksum = mod(calccksum, 2^8);
                    for i=1:length-1
                        calccksum = calccksum + double(data(i));
                        calccksum = mod(calccksum, 2^8);
                    end
 
                    cksum = fread(hUart, 1);
                    if (cksum == calccksum)
                        cksumOk = 1;
                    else
                        display('CS Error!');
                        cksumOk = 0;
                    end;
                else
                    % receive timeout occured
                    cmd = 0;
                    dataLength = 0;
                    data = 0;
                    cksumOk = 0;
                end;
            else
                % receive timeout occured
                cmd = 0;
                dataLength = 0;
                data = 0;
                cksumOk = 0;
            end;
 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Kommunikation mittels TCP/IP                                      %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
        ipAddress = '127.0.0.1';
        targetPort = 1234;
        socket = tcpip(ipAddress, targetPort);
        fopen(socket);
 
        if strcmp(socket.Status, 'open')
            tmpData(1) = mod(floor(data/(2^24)), 2^8);
            tmpData(2) = mod(floor(data/(2^16)), 2^8);
            tmpData(3) = mod(floor(data/(2^8)), 2^8);
            tmpData(4) = mod(data, 2^8);
            transmitTcpData(socket, CMD, 4, tmpData);
 
            tmpData = [tmpData, ...
                       uint8(real(complNr)), ...
                       uint8(imag(complNr))];
            if (transmitTcpDataWithRetry(socket, CMD, size(tmpData,2),
                                         tmpData) ~= 1)
                disp('Senden fehlgeschlagen!');
            end
 
            [cmd, length, data, cksumOk] = receiveTcpData(socket);
        end
 
        fclose(socket);
 
 
        function successful = transmitTcpDataWithRetry(hSocket, cmd,
                                                       dataLength, data)
        % transmit configuration with retries when send error occurres
        %
        % input:
        %   hSocket    ... tcp socket for transmit
        %   cmd        ... command to send
        %   dataLength ... length of data
        %   data       ... data to send
        % output:
        %   successful ... how many chars sent
            global CMD_ACK
 
            maxRetry = 5;
            successful = 0;
            sendCnt = 0;
            while (successful == 0) && (sendCnt < maxRetry)
                % send data
                transmitTcpData(hSocket, cmd, dataLength, data);
 
                % receive message
                [retcmd, retlength, retdata, cksumOk] =
                    receiveTcpData(hSocket);
 
                % prove if ack message received
                if ((retcmd == CMD_ACK) &&
                    (retlength == 0) &&
                    (cksumOk == 1))
                    successful = 1;
                else
                    sendCnt = sendCnt + 1;
                end;
            end;
 
        function transmitTcpData(hSocket, cmd, dataLength, data)
        % transmit packet to targets
        %
        % input:
        %   hSocket    ... tcp socket for transmit
        %   cmd        ... command to send
        %   dataLength ... length of data
        %   data       ... data to send
            length = dataLength + 2;
            calccksum = mod((cmd + length), 2^8);
            for k=1:dataLength
                calccksum = mod((calccksum + data(k)), 2^8);
            end
            if (dataLength > 0)
                fwrite(hSocket,
                       [cmd, length, data(1:dataLength), calccksum]);
            else
                fwrite(hSocket, [cmd, length, calccksum]);
            end;
 
        function [cmd, dataLength, data, cksumOk] = receiveTcpData(hSocket)
        % reads received packet from targets
        %
        % packet: <cmd><length><data1>...<dataN><cksum>
        %
        % input:
        %   hSocket ... tcp socket for receiving
        % output:
        %   cmd     ... command
        %   length  ... length of packet = N(data) + 1(cksum)
        %   data    ... received data
        %   cksum   ... cksum of rec. data = (cmd+length+data1+...+dataN)%2^8
            data = 0;
            cmd = fread(hSocket, 1);
            if cmd
                length = fread(hSocket, 1);
                if length
                    dataLength = length-2;
                    if (length-2 > 0)
                        data = fread(hSocket, length-2);
                    end
                    calccksum = mod((cmd + length), 2^8);
                    for i=1:length-2
                        calccksum = mod((calccksum + data(i)), 2^8);
                    end
                    cksum = fread(hSocket, 1);
                    if (cksum == calccksum)
                        cksumOk = 1;
                    else
                        cksumOk = 0;
                    end;
                else
                    % receive timeout occured
                    cmd = 0;
                    dataLength = 0;
                    data = 0;
                    cksumOk = 0;
                end;
            else
                % receive timeout occured
                cmd = 0;
                dataLength = 0;
                data = 0;
                cksumOk = 0;
            end;