WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

UART Treiber für Raspberry Pi mit Hilfe eines Matlab System

 

Silli
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 21.05.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.05.2016, 22:38     Titel: UART Treiber für Raspberry Pi mit Hilfe eines Matlab System
  Antworten mit Zitat      
Hallo,

ich bin gerade dabei mir einen UART Treiber für den Pi zu schreiben. Dafür benutze ich ein Matlab System um dann einen Simulink Block erstellen zu können, der als Read und Send Block dient. Zum Testen habe ich Sende und Empfangspin miteinander verbunden.

Das Senden der Daten funktioniert soweit gut und es werden auch die richtigen Werte empfgangen. Das Problem ist nur die empfangenen Daten in den Outout des Matlab System zu bekommen.

Hier einmal das Matlab System:

Code:
classdef UART_read_send < matlab.System ...
        & coder.ExternalDependency ...
        & matlab.system.mixin.Propagates ...
        & matlab.system.mixin.CustomIcon
    %
    % System object template for a sink block.
    %
    % This template includes most, but not all, possible properties,
    % attributes, and methods that you can implement for a System object in
    % Simulink.
    %
    % NOTE: When renaming the class name Sink, the file name and
    % constructor name must be updated to use the class name.
    %
   
    % Copyright 2014 The MathWorks, Inc.
    %#codegen
    %#ok<*EMCA>
   
    properties
        % Public, tunable properties.
    end
   
    properties (Hidden)
        fd;
        size;
        packetID = 17;        
    end
   
    properties (Nontunable)
        % Public, non-tunable properties.
        UART_init_Baudrate = 'B9600';
         
    end
   
    properties (Constant, Hidden)
        AvailableBrate = ['B1200' 'B2400' 'B4800' 'B9600' 'B19200' 'B38400' 'B57600' 'B115200' 'B230400' 'B460800' 'B500000' 'B576000' 'B921600' 'B1000000' 'B1152000' 'B1500000' 'B2000000' 'B2500000' 'B3000000' 'B3500000' 'B4000000'];
    end
   
    properties (Access = private)
        % Pre-computed constants.
    end
   
    methods
        % Constructor
        function obj = UART_read_send(varargin)
            coder.allowpcode('plain');
           
            % Support name-value pair arguments when constructing the object.
            setProperties(obj,nargin,varargin{:});
        end
  end
   
    methods (Access=protected)
        function setupImpl(obj, u1, u2)
            if coder.target('Rtw')
                % Call C-function implementing device initialization
                % coder.cinclude('sink.h');
                % coder.ceval('sink_init');              
                               
                coder.cinclude('uart.h');
                obj.fd = -1;
                obj.fd = coder.ceval('uart_init');
            else
                % Place simulation setup code here
            end
        end
       
        function [out1, out2] = stepImpl(obj,u1,u2)  
            if coder.target('Rtw')
                % Call C-function implementing device output
               
                %Schreiben der Eingänge in den Sendestrukt
                %Zum ändern von Eingängen muss ebenfalls das entsprechende Strukt in der pidata.h angepasst werden
               
                send_struct = struct('velocity',u1,'heading',u2);
                           
                                                                     
                %Berechnen der Bytegröße der Eingänge
                size_u1 = -1;
                size_u2 = -1;
                size_u1 = coder.ceval('sizeof', u1);  
                size_u2 = coder.ceval('sizeof', u2);
                obj.size = size_u1 + size_u2;
               
                %Include der Struct Definition im C-Code und abgleichen der Namen
                coder.cinclude('piData.h');
                coder.cstructname(send_struct, 'piData_toFluco_t', 'extern');
               
                %Senden des struct
                coder.ceval('pidata_send', obj.fd, obj.packetID, coder.ref(send_struct), obj.size);
               
               
                                               
                %Empfangen des struct
               
                rcv_struct = struct('velocity_RCV',single ([0;0;0]),'heading_RCV',single([0;0;0;0;0]));
                coder.cstructname(rcv_struct, 'piData_fromFluco', 'extern');
                rcv_struct = coder.ceval('pidata_parse', obj.fd);
               
                             
                out1 = rcv_struct.velocity_RCV;
                out2 = rcv_struct.heading_RCV;
               
                %out1 = rcv_struct;
                %y2 = rcv_struct.heading_RCV;
               
               
               
            else
                % Place simulation output code here
            end
        end
       
        function releaseImpl(obj)
            if coder.target('Rtw')
                % Call C-function implementing device termination
                coder.ceval('uart_close', obj.fd);
            else
                % Place simulation termination code here
            end
        end
    end
   
    methods (Access=protected)
       
%         %% Define input properties
        function num = getNumInputsImpl(~)
            num = 2;
        end
               
         function flag = isInputSizeLockedImpl(~,~)
           flag = true;
         end
       
        function varargout = isInputFixedSizeImpl(~,~)
            varargout{1} = true;
            varargout{2} = true;
        end
       
        function flag = isInputComplexityLockedImpl(~,~)
            flag = true;
        end
       
        function varargout = isInputComplexImpl(~)
            varargout{1} = false;
            varargout{2} = false;
        end
         
       
        % Define output properties
       
       
       
       
        function num = getNumOutputsImpl(~)
            num = 2;
        end        
     
         function [out1, out2] = outputImpl(obj, ~)
             out1 = obj.PreviousInput(end);
             out2 = obj.PreviousInput(end);
         end
       
         function flag = isOutputSizeLockedImpl(~,~)
             flag = true;
         end
       
        function varargout = isOutputFixedSizeImpl(~,~)
             varargout{1} = true;
             varargout{2} = true;
         end
       
        function flag = isOutputComplexityLockedImpl(~,~)
            flag = true;
        end
       
        function varargout = isOutputComplexImpl(~)
            varargout{1} = false;
            varargout{2} = false;
           
        end
       
        function varargout = getOutputSizeImpl(~)
%            varargout{1} = propagatedInputSize(obj, 1);
             varargout{1} = [3,1];
             varargout{2} = [5,1];
         end
       
        function varargout = getOutputDataTypeImpl(~)

            varargout{1} = 'single';
            varargout{2} = 'single';
           
        end
       
       
        function icon = getIconImpl(~)

%         Define a string as the icon for the System block in Simulink.
            icon = 'Rpi_UART_read_send';
        end
    end
   
    methods (Static, Access=protected)
        function simMode = getSimulateUsingImpl(~)
            simMode = 'Interpreted execution';
        end
       
        function isVisible = showSimulateUsingImpl
            isVisible = false;
        end
    end
   
    methods (Static)
        function name = getDescriptiveName()
            name = 'UART_read_send';
        end
       
        function b = isSupportedContext(context)
            b = context.isCodeGenTarget('rtw');
        end
       
        function updateBuildInfo(buildInfo, context)
            if context.isCodeGenTarget('rtw')
                % Update buildInfo
                rootDir = fullfile(fileparts(mfilename('fullpath')),'src');
                buildInfo.addIncludePaths(rootDir);
                % Use the following API's to add include files, sources and
                % linker flags
                addIncludeFiles(buildInfo,'piData.h','uart.h');
                addSourceFiles(buildInfo,'piData.c',rootDir);
                addSourceFiles(buildInfo,'uart.c',rootDir);
                %addLinkFlags(buildInfo,{'-llibSink'});
            end
        end
    end
end
 


und die PiData.h:

Code:
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * File:   piData.h
 * Author: Michael
 *
 * Created on 19. Mai 2016, 16:04
 */

#ifndef PIDATA_H
#define PIDATA_H


#include <stdint.h>

#pragma once

// Einstellen, dass die Paket-Structs dicht (ohne Byte-Lücken) gepackt sind
#pragma pack(push, 1)

// ######################
// # Paket-Definitionen #
// ######################

typedef struct {
    float velocity [3];
    float heading [5];
} piData_toFluco_t;

typedef struct {
    float velocity_RCV[3];
    float heading_RCV[5];
} piData_fromFluco_t;

piData_toFluco_t piData_toFluco;
piData_fromFluco_t piData_fromFluco;

// Ende von >>#pragma pack(push, 1)<< siehe Oben.
#pragma pack(pop)


// Initialisiert den auxiliary Datalink, es werden Pointer auf die UART-Sende und
// -Empfangsfunktionen übergeben
//void auxdata_init(UART_t* UARTx);

// Liest die über den auxiliary Datalink eingehenden Pakete ein
piData_fromFluco_t pidata_parse(int uartsocket);
// Sendet die auxiliary Datalink-Pakete
void pidata_send(int uartsocket, uint8_t packet_id, piData_toFluco_t* packet_ptr, uint8_t size);


#endif /* PIDATA_H */

 


Die Funktion pidata_parse gibt einen Buffer, welcher ebenfalls dem Struct piData_fromFluco_t entspricht zurück und soll die Werte in den rcv_struct schreiben, der im System intialisiert wird. Wenn ich dann mittels ou1 = rcv_struct.velocity_RCV die ouput zuweisen will kommt folgende Fehlermeldung beim Überspielen auf den Pi:

Code:
The build process will terminate as a result.
Error executing SSH command: make: Entering directory '/home/pi/Test_rtt'
"gcc" -I"./"            -O3 -D"MODEL=Test" -D"NUMST=1" -D"NCSTATES=0" -D"HAVESTDIO=" -D"ON_TARGET_WAIT_FOR_START=1" -D"ONESTEPFCN=0" -D"EXT_MODE=1" -D"TERMFCN=1" -D"MAT_FILE=0" -D"MULTI_INSTANCE_CODE=0" -D"INTEGER_CODE=0" -D"MT=0" -D"CLASSIC_INTERFACE=0" -D"ALLOCATIONFCN=0" -D"TID01EQ=0" -D"_USE_TARGET_UDP_=" -D"_RUNONTARGETHARDWARE_BUILD_=" -D"EXIT_FAILURE=1" -D"EXTMODE_DISABLETESTING=" -c ./linuxUDP.c ./ext_svr.c ./ext_work.c ./rtiostream_interface.c ./updown.c ./rtiostream_tcpip.c ./rtiostream_utils.c ./Test.c ./Test_data.c ./ert_main.c ./piData.c ./uart.c
./Test.c: In function ‘Test_output’:
./Test.c:43:20: error: expected ‘;’ before ‘expl_temp’
./Test.c:73:3: error: ‘expl_temp’ undeclared (first use in this function)
./Test.c:73:3: note: each undeclared identifier is reported only once for each function it appears in
_Test.mk:125: recipe for target 'linuxUDP.o' failed
make: *** [linuxUDP.o] Error 1
make: Leaving directory '/home/pi/Test_rtt'


Ohne die Zuweisung out1= ... und out2 = ... läuft die Simulation ohne Fehler auf dem Pi, allerdings habe ich dann keinen Output aus dem Block.

Ich wäre für jede Hilfe dankbar.

Viele Grüße
Michael
Private Nachricht senden Benutzer-Profile anzeigen


Silli
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 21.05.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.05.2016, 18:22     Titel:
  Antworten mit Zitat      
So hab endlich den Fehler gefunden. Es war ein Fehler in der Struct Bezeichnung:

Zitat:
coder.cstructname(rcv_struct, 'piData_fromFluco_t', 'extern');


Jetzt läuft das ganze 1A
Private Nachricht senden Benutzer-Profile anzeigen
 
HNS

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.07.2016, 09:58     Titel:
  Antworten mit Zitat      
Silli hat Folgendes geschrieben:
So hab endlich den Fehler gefunden. Es war ein Fehler in der Struct Bezeichnung:

Zitat:
coder.cstructname(rcv_struct, 'piData_fromFluco_t', 'extern');


Jetzt läuft das ganze 1A


Hallo, wie startet man denn den code und liest dieser in simulink dann permanent die UART Schnittstelle aus?
 
Silli
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 21.05.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.07.2016, 12:23     Titel:
  Antworten mit Zitat      
Es handelt sich dabei um ein Matlab System. Um den Code auszuführen, muss man in Simulink einen Matlab System Block einfügen und das UART_read_send File darin "laden".

Der Code ist so natürlich nicht vollständig. Aber ja, dann wird in jedem Zeitschritt die UART Schnittstelle so lange ausgelesen, bis keine Daten mehr im Puffer sind und dann wird der letzte gültige Wert an Simulink übergeben.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.