-         

Ergebnis 1 bis 3 von 3

Thema: FEZ Panda II UART mit Interrupt

  1. #1

    Ausrufezeichen FEZ Panda II UART mit Interrupt

    Anzeige

    Hallo Leute

    Ich versuche, einige der FWZ Panda II-Funktionen zu kombinieren und ich habe folgendes Problem:Ich verwende ein Interrupt, um eine Zahl zu zählen um die in einer Endlosschleife an einen Eingang zu senden.Jetzt möchte ich diese Informationen per UART an den Computer senden, wenn das Zeichen "1" empfangen wird. Aber das System ist eine Ausnahme auszulösen, wenn
    UART.open
    aufgerufen wird.
    Haben ihr irgendwelche Ideen?

    Dies ist mein Code. Ganz einfach, aber ich kann den Fehler nicht finden.

    using System;
    using System.Threading;
    using Microsoft.SPOT;
    using Microsoft.SPOT.Hardware;
    using GHIElectronics.NETMF.FEZ;
    using GHIElectronics.NETMF.Hardware;
    using System.IO.Ports;
    using System.Text;

    namespace MFConsoleApplication1
    {

    public class Program
    {

    public static class GlobalVar
    {
    static int _globalValue;

    public static int GlobalValue
    {
    get
    {
    return _globalValue;
    }

    set
    {
    _globalValue = value;
    }
    }
    }


    public static void Main()
    {

    GlobalVar.GlobalValue = 0;

    // the pin will generate interrupt on high and low edges
    InterruptPort IntButton =
    new InterruptPort((Cpu.Pin)FEZ_Pin.Interrupt.LDR, true,
    Port.ResistorMode.PullUp,
    Port.InterruptMode.InterruptEdgeLow);



    // add an interrupt handler to the pin
    IntButton.OnInterrupt +=
    new NativeEventHandler(IntButton_OnInterrupt);

    //do anything you like here
    // Thread.Sleep(Timeout.Infinite);

    AnalogIn voltagePort = new AnalogIn((AnalogIn.Pin)FEZ_Pin.AnalogIn.An3);
    OutputPort lowPort = new OutputPort((Cpu.Pin)FEZ_Pin.Digital.An0, false);
    OutputPort highPort = new OutputPort((Cpu.Pin)FEZ_Pin.Digital.An2, true);

    const double maxVoltage = 3.3;
    const int maxAdcValue = 1023;


    InterruptPort RX =
    new InterruptPort((Cpu.Pin)FEZ_Pin.Interrupt.Di0, true,
    Port.ResistorMode.PullUp,
    Port.InterruptMode.InterruptEdgeLow);

    RX.OnInterrupt +=
    new NativeEventHandler(RX_OnInterrupt);

    while (true)
    {
    double mess = 0;
    int sample = 10000;
    for (int i = 0; i <= (sample - 1); i++)
    {
    mess += (double)voltagePort.Read();
    }
    double valueRaw = mess / sample;
    double valueVoltage = (valueRaw * maxVoltage) / maxAdcValue;
    double valuePercent = (valueVoltage / maxVoltage) * 100;

    Debug.Print("Voltage: " + valueVoltage + "V");
    Debug.Print("Percent: " + valuePercent + "%");

    //Thread.Sleep(1000);

    }
    }

    static void IntButton_OnInterrupt(uint port, uint state,
    DateTime time)
    {
    GlobalVar.GlobalValue++;
    string zaehler_string = GlobalVar.GlobalValue.ToString();
    Debug.Print(zaehler_string);
    }



    static void RX_OnInterrupt(uint port, uint state,
    DateTime time)
    {
    // Initial Daten
    SerialPort UART = new SerialPort("COM1", 115200);
    int read_count = 0;
    byte[] tx_data;
    byte[] rx_data = new byte[10];
    UART.ReadTimeout = 0;
    UART.Open();

    read_count = UART.Read(rx_data, 0, rx_data.Length);
    string empfangen = rx_data.ToString();
    string zaehler_string = GlobalVar.GlobalValue.ToString();
    if (empfangen == "1")
    {
    tx_data = Encoding.UTF8.GetBytes(zaehler_string);
    UART.Write(tx_data, 0, tx_data.Length);
    }


    }
    }
    }

  2. #2
    Hallo Daniela,
    hier habe ich mal den Quelltext so abgeändert soweit ich deine Frage verstanden habe.
    mfg brosal
    using System;
    using System.Threading;
    using Microsoft.SPOT;
    using Microsoft.SPOT.Hardware;
    using GHIElectronics.NETMF.FEZ;
    using GHIElectronics.NETMF.Hardware;
    using System.IO.Ports;
    using System.Text;

    namespace MFConsoleApplication1
    {

    public class Program
    {

    public static class GlobalVar
    {
    static int _globalValue;

    public static int GlobalValue
    {
    get { return _globalValue; }
    set { _globalValue = value; }
    }
    }

    // SerialPort ist nur dann dauerhaft erreichbar wenn als >>>static Globale Variable<<< deklariert ist
    // Das selbe gilt für den Buffer
    // Wenn der Buffer und der Serialport lokal in einer Methode deklariert ist und die Methode verlassen wird
    // wird der Serialport und der Buffer aus dem Speicher gelöscht und ist nicht mehr ansprechbar

    static byte[] Buffer;
    static SerialPort UART = new SerialPort("COM1", 115200);

    public static void Main()
    {

    GlobalVar.GlobalValue = 0;

    //Serialport
    UART.Open();
    //Delegat Interrupt Empfang setzen
    UART.DataReceived += new SerialDataReceivedEventHandler(UART_DataReceived);

    // the pin will generate interrupt on high and low edges
    InterruptPort IntButton =
    new InterruptPort((Cpu.Pin)FEZ_Pin.Interrupt.LDR, true,
    Port.ResistorMode.PullUp,
    Port.InterruptMode.InterruptEdgeLow);

    // add an interrupt handler to the pin
    IntButton.OnInterrupt += new NativeEventHandler(IntButton_OnInterrupt);


    //do anything you like here
    // Thread.Sleep(Timeout.Infinite);

    AnalogIn voltagePort = new AnalogIn((AnalogIn.Pin)FEZ_Pin.AnalogIn.An3);
    OutputPort lowPort = new OutputPort((Cpu.Pin)FEZ_Pin.Digital.An0, false);//???
    OutputPort highPort = new OutputPort((Cpu.Pin)FEZ_Pin.Digital.An2, true);//???

    const double maxVoltage = 3.3;
    const int maxAdcValue = 1023;


    InterruptPort RX =
    new InterruptPort((Cpu.Pin)FEZ_Pin.Interrupt.Di0, true,
    Port.ResistorMode.PullUp,
    Port.InterruptMode.InterruptEdgeLow);

    RX.OnInterrupt += new NativeEventHandler(RX_OnInterrupt);


    while (true)
    {
    double mess = 0;
    int sample = 10000;
    for (int i = 0; i <= (sample - 1); i++)
    {
    mess += (double)voltagePort.Read();
    }
    double valueRaw = mess / sample;
    double valueVoltage = (valueRaw * maxVoltage) / maxAdcValue;
    double valuePercent = (valueVoltage / maxVoltage) * 100;

    Debug.Print("Voltage: " + valueVoltage + "V");
    Debug.Print("Percent: " + valuePercent + "%");

    //Thread.Sleep(1000);

    }
    }
    /// <summary>
    /// Interrupt Routine DataReceived
    /// </summary>
    /// <param name="sender">SerialPort als Object</param>
    /// <param name="e">Daten und </param>
    static void UART_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
    SerialPort SP = (SerialPort)sender; //Zeiger auf den Serialport der den IRQ gesendet hat setzten
    //somit sind mit SP alle Methoden Eigenschaften und Ereignisse des UART erreichbar
    Buffer = new byte[SP.BytesToRead];
    SP.Read(Buffer, 0, SP.BytesToRead);
    String IN = new string(UTF8Encoding.UTF8.GetChars(Buffer)); //Empfangene Zeichen in String wandeln
    //Bricht ab bei einem nicht Druckbaren zeiche
    if (IN == "1")
    {
    //Wandelt GlobalVar.GlobalValue zuerst in einen String toString() dann in Bytes
    byte[] TempBuff = UTF8Encoding.UTF8.GetBytes(GlobalVar.GlobalValue.T oString());
    SP.Write(TempBuff, 0, TempBuff.Length); //und Absenden
    SP.DiscardInBuffer();// InBuffer löschen
    }

    }

    static void IntButton_OnInterrupt(uint port, uint state,
    DateTime time)
    {
    GlobalVar.GlobalValue++;
    //string zaehler_string = GlobalVar.GlobalValue.ToString(); //Kannst du dir sparen
    //Jede Variable kann man mit .toString() in einen String Wandeln >Achtung Klammern nicht vergessen<
    Debug.Print(GlobalVar.GlobalValue.ToString());
    }



    static void RX_OnInterrupt(uint port, uint state,
    DateTime time)
    {
    /*
    * Du brauchst keinen extra interupt an der Com RX Leitung
    * da der SerialPort DataReceived interrupt sowiso ausgelöst wird wenn
    * Daten hereingekommen sind
    *
    SerialPort UART = new SerialPort("COM3", 115200);

    // Initial Daten
    int read_count = 0;
    byte[] tx_data;
    byte[] rx_data = new byte[10];
    UART.ReadTimeout = 0;


    read_count = UART.Read(rx_data, 0, rx_data.Length);
    string empfangen = rx_data.ToString();
    string zaehler_string = GlobalVar.GlobalValue.ToString();
    if (empfangen == "1")
    {
    tx_data = Encoding.UTF8.GetBytes(zaehler_string);
    UART.Write(tx_data, 0, tx_data.Length);
    }
    */

    }
    }
    }

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    29
    Beiträge
    4.545
    Damit man den Code besser lesen kann sollte man mit "Code einfügen" arbeiten, ansonsten wird der Post relativ unübersichtlich.

    Man findet es wenn man auf "Antworten" geht und anschließend auf "Erweitert". Hier muss man das Raute Symbol verwenden.

    Beim Programm von Brosal sieht das dann so aus

    Code:
    using System;
     using System.Threading;
     using Microsoft.SPOT;
     using Microsoft.SPOT.Hardware;
     using GHIElectronics.NETMF.FEZ;
     using GHIElectronics.NETMF.Hardware;
     using System.IO.Ports;
     using System.Text;
    
     namespace MFConsoleApplication1
     {
    
     public class Program
     {
    
     public static class GlobalVar
     {
     static int _globalValue;
    
     public static int GlobalValue
     {
     get { return _globalValue; }
     set { _globalValue = value; } 
     }
     }
    
     // SerialPort ist nur dann dauerhaft erreichbar wenn als >>>static Globale Variable<<< deklariert ist
     // Das selbe gilt für den Buffer
     // Wenn der Buffer und der Serialport lokal in einer Methode deklariert ist und die Methode verlassen wird
     // wird der Serialport und der Buffer aus dem Speicher gelöscht und ist nicht mehr ansprechbar
    
     static byte[] Buffer;
     static SerialPort UART = new SerialPort("COM1", 115200);
    
     public static void Main()
     {
    
     GlobalVar.GlobalValue = 0;
    
     //Serialport
     UART.Open();
     //Delegat Interrupt Empfang setzen
     UART.DataReceived += new SerialDataReceivedEventHandler(UART_DataReceived);
    
     // the pin will generate interrupt on high and low edges
     InterruptPort IntButton =
     new InterruptPort((Cpu.Pin)FEZ_Pin.Interrupt.LDR, true,
     Port.ResistorMode.PullUp,
     Port.InterruptMode.InterruptEdgeLow);
    
     // add an interrupt handler to the pin
     IntButton.OnInterrupt += new NativeEventHandler(IntButton_OnInterrupt);
    
    
     //do anything you like here
     // Thread.Sleep(Timeout.Infinite);
    
     AnalogIn voltagePort = new AnalogIn((AnalogIn.Pin)FEZ_Pin.AnalogIn.An3);
     OutputPort lowPort = new OutputPort((Cpu.Pin)FEZ_Pin.Digital.An0, false);//???
     OutputPort highPort = new OutputPort((Cpu.Pin)FEZ_Pin.Digital.An2, true);//???
    
     const double maxVoltage = 3.3;
     const int maxAdcValue = 1023;
    
    
     InterruptPort RX =
     new InterruptPort((Cpu.Pin)FEZ_Pin.Interrupt.Di0, true,
     Port.ResistorMode.PullUp,
     Port.InterruptMode.InterruptEdgeLow);
    
     RX.OnInterrupt += new NativeEventHandler(RX_OnInterrupt);
    
    
     while (true)
     {
     double mess = 0;
     int sample = 10000;
     for (int i = 0; i <= (sample - 1); i++)
     {
     mess += (double)voltagePort.Read();
     }
     double valueRaw = mess / sample;
     double valueVoltage = (valueRaw * maxVoltage) / maxAdcValue;
     double valuePercent = (valueVoltage / maxVoltage) * 100;
    
     Debug.Print("Voltage: " + valueVoltage + "V");
     Debug.Print("Percent: " + valuePercent + "%");
    
     //Thread.Sleep(1000);
    
     }
     }
     /// <summary>
     /// Interrupt Routine DataReceived
     /// </summary>
     /// <param name="sender">SerialPort als Object</param>
     /// <param name="e">Daten und </param>
     static void UART_DataReceived(object sender, SerialDataReceivedEventArgs e)
     {
     SerialPort SP = (SerialPort)sender; //Zeiger auf den Serialport der den IRQ gesendet hat setzten
     //somit sind mit SP alle Methoden Eigenschaften und Ereignisse des UART erreichbar
     Buffer = new byte[SP.BytesToRead];
     SP.Read(Buffer, 0, SP.BytesToRead); 
     String IN = new string(UTF8Encoding.UTF8.GetChars(Buffer)); //Empfangene Zeichen in String wandeln
     //Bricht ab bei einem nicht Druckbaren zeiche
     if (IN == "1")
     {
     //Wandelt GlobalVar.GlobalValue zuerst in einen String toString() dann in Bytes
     byte[] TempBuff = UTF8Encoding.UTF8.GetBytes(GlobalVar.GlobalValue.T oString()); 
     SP.Write(TempBuff, 0, TempBuff.Length); //und Absenden
     SP.DiscardInBuffer();// InBuffer löschen
     }
    
     }
    
     static void IntButton_OnInterrupt(uint port, uint state,
     DateTime time)
     {
     GlobalVar.GlobalValue++;
     //string zaehler_string = GlobalVar.GlobalValue.ToString(); //Kannst du dir sparen
     //Jede Variable kann man mit .toString() in einen String Wandeln >Achtung Klammern nicht vergessen<
     Debug.Print(GlobalVar.GlobalValue.ToString());
     }
    
    
    
     static void RX_OnInterrupt(uint port, uint state,
     DateTime time)
     {
     /*
     * Du brauchst keinen extra interupt an der Com RX Leitung
     * da der SerialPort DataReceived interrupt sowiso ausgelöst wird wenn
     * Daten hereingekommen sind
     * 
     SerialPort UART = new SerialPort("COM3", 115200);
    
     // Initial Daten
     int read_count = 0;
     byte[] tx_data;
     byte[] rx_data = new byte[10];
     UART.ReadTimeout = 0;
    
    
     read_count = UART.Read(rx_data, 0, rx_data.Length);
     string empfangen = rx_data.ToString();
     string zaehler_string = GlobalVar.GlobalValue.ToString();
     if (empfangen == "1")
     {
     tx_data = Encoding.UTF8.GetBytes(zaehler_string);
     UART.Write(tx_data, 0, tx_data.Length);
     }
     */
    
     }
     }
     }
    MfG Hannes

Ähnliche Themen

  1. FEZ Panda 2
    Von EIK im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 0
    Letzter Beitrag: 22.03.2012, 08:58
  2. UART per Interrupt
    Von sunshine im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 19.03.2011, 23:56
  3. UART Interrupt
    Von skywalker1979 im Forum PIC Controller
    Antworten: 2
    Letzter Beitrag: 04.06.2008, 07:46
  4. UART mit INTERRUPT in C
    Von Nemesis im Forum C - Programmierung (GCC u.a.)
    Antworten: 10
    Letzter Beitrag: 06.10.2007, 13:37
  5. UART Interrupt
    Von jagdfalke im Forum C - Programmierung (GCC u.a.)
    Antworten: 9
    Letzter Beitrag: 13.12.2005, 20:44

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •