%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 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;