PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : FEZ Panda II UART mit Interrupt



Daniela
19.06.2012, 17:16
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);
}


}
}
}

brosal
06.11.2012, 19:19
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);
}
*/

}
}
}

021aet04
10.11.2012, 09:28
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


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