PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C# Kommunikation mit dem ATMEGA32



Ozstriker
18.03.2012, 16:13
Hallo zusammen,

ich brauche Hilfe, was die Ausgabe über die Serielle Schnittstelle aus C# angeht.

Erstmal allgemein. Ich habe ein Programm geschrieben und benötige nun die Funktionalität zwei verschiedene Signale auf die Serielle Schnittstelle zu schicken. Darüber werden dann Relais geschaltet, um eine Beleuchtung zu aktivieren.
Die Schaltung an sich funktioniert und wurde von Kollegen (Elektrotechnik Studenten) gebaut. Verbunden mit der seriellen Schnittstelle sind allerdings nur die drei Leitungen TXD, RXD und GND.

Nun zu meinem Problem:
Das ganze über Putty anzusprechen ist kein Problem. Nutze ich allerdings mein C# Programm tut sich rein gar nichts.

Hier einmal das wichtigste aus einem Code: (Manches ist wohl überflüssig, aber ich war so verzweifelt, alles mögliche auszuprobieren!

Für jede Hilfe wäre ich echt dankbar!



private SerialPort comPort = new SerialPort("COM1", 2400, Parity.None, 8, StopBits.One);
public const int InfiniteTimeout=0;

private void button_Click(object sender, EventArgs e)
{
char[] buff = new char[1];
buff[0] = 'J';
comPort.ReadBufferSize = 2048;
comPort.WriteBufferSize = 512;
comPort.ReadTimeout = InfiniteTimeout;
comPort.RtsEnable = true;
comPort.DtrEnable = true;

comPort.Handshake = Handshake.None;

if (comPort.IsOpen == false)
{
comPort.Open();
}
comPort.Write(buff, 0,1);

comPort.Close();
}

PS: Habe das ganze auch schon mit nem Serial Port Monitor geloggt, aber weiß einfach nicht, was der Fehler ist...

Ozstriker
19.03.2012, 11:46
Hallo nochmal,

ich bin nun schon ein Stück weiter.

Problem war folgendes: Das erste Zeichen eines Strings wird bei der Übertragung anscheinend verschluckt.
Wenn man dann nur ein Zeichen überträgt kommt nichts an...

Super Sache, stundenlanges Herumsuchen und die Lösung scheint ein beliebiges Zeichen vor dem zu übetragenden Zeichen zu sein :confused:

MagicWSmoke
19.03.2012, 12:50
Du hast aber schon gesehen, dass die übergeordnete Topic "Atmel AVR Controller und Programmierung" lautet ? Hier müsste also eher Dein AVR-Code stehen, welcher beiläufig der hier interessantere sein dürfte und nicht der PC-seitige Teil. Je nach AVR-Teil muss sich der PC-Teil entsprechend verhalten.
Üblicherweise wird nach dem Steuerzeichen ein CR geschickt, geht aber auch ohne. Und verschluckt wir ein einzelnes Zeichen sicher nicht, jetzt wird halt ein Murks einen anderen Murks kompensieren, darum sieht's aus, als ob's richtig wäre.
Stell doch mal den AVR-Code ein.

Ozstriker
21.03.2012, 07:53
Ja, ich war mir schon fast bewusst, dass das Thema nicht in diesem Thread richtig ist... Hatte aber sonst auf einen Moderator gehofft, der das Teil an die passende Stelle verschiebt.

Laufen tut mein C# Code jetzt. Allerdings habe ich ein eigenartiges Problem. Die Kommunikation mit dem Mikrocontroller funktioniert nur, wenn ich auch einen Portmonitor auf dem System anhabe, auf dem auch mein C# Programm läuft.

Hier einmal beide Codeausschnitte:
C# Programm:


public SerialPort comPort = new SerialPort("COM1", 2400, Parity.None, 8, StopBits.One);



public void ser_sendYes()
{
if (comPort.IsOpen == false)
{
comPort.Open();
}
comPort.Write("J\r");
comPort.Close();
}
public void ser_sendReset()
{
if (comPort.IsOpen == false)
{
comPort.Open();
}
comPort.Write("R\r");
comPort.Close();
}

this.ser_sendReset();
this.ser_sendYes();


Mikrocontroller (BASCOM):

Rem This file contains an error in the include statement
Rem the file a.bas does not exist
Rem It shows that the editor will load this file
Rem and displays the error marker on this line
Rem when you compile the main file : include.bas
$regfile = "m32def.dat"
$crystal = 4000000
$baud = 2400

Config Porta.0 = Output
Config Porta.1 = Output
Config Porta.2 = Output
Config Porta.3 = Output
Config Porta.4 = Output

Dim X As Byte
Dim Y As Byte
Dim Empfangen As String * 255

Declare Sub Led1()
Declare Sub Led2()
Declare Sub Led3()
Declare Sub Led4()
Declare Sub Blinken()
Do


X = 0

Do
Empfangen = ""
Input Empfangen

Select Case Empfangen
Case "J"
Led1
X = X + 1
Case "R"
Porta.0 = 0
Porta.1 = 0
Porta.2 = 0
Porta.3 = 0
X = 4
End Select
Loop Until X = 4

Wait 2
Porta.0 = 0
Porta.1 = 0
Porta.2 = 0
Porta.3 = 0
Porta.4 = 0

Loop

End

Sub Led1()
If Porta.0 = 0 Then
Porta.0 = 1
Print "Led 1 ist an"
Else
Led2
End If
End Sub

Sub Led2()
If Porta.1 = 0 Then
Porta.1 = 1
Print "Led 2 ist an"
Else
Led3
End If
End Sub

Sub Led3()
If Porta.2 = 0 Then
Porta.2 = 1
Print "Led 3 ist an"
Else
Led4
End If
End Sub

Sub Led4()
If Porta.3 = 0 Then
Porta.3 = 1
Print "Led 4 ist an: Gewonnen"
Wait 1
Blinken
End If
End Sub

Sub Blinken()

Y = 0

Do
Porta.4 = 1
Waitms 500
Porta.4 = 0
Waitms 500
Y = Y + 1
Loop Until Y=15
End Sub

MagicWSmoke
21.03.2012, 08:25
Da wärst Du wohl im Bascom Thread besser aufgehoben.
Aber zum Code: Mittlerweile sendest Du ja immerhin ein CR, dachte mir vorher schon, dass es daran scheitert. Solltest Du Input von Bascom verwenden wollen, dann musst Du darauf achten, dass dort der String auch mit nur einem CR erkannt wird. Schau' Dir dazu Config Input an, damit kann man das einstellen.
Sonst wirf noch einen Blick auf Waitkey oder das Beispiel zu Ischarwaiting in der Hilfe. Damit kannst Du auf jedes gesendete Zeichen reagieren und musst nicht warten, bis die Input Funktion durch ein CR/LF abgeschlossen wurde. Außerdem würde ich Dir empfehlen $hwstack, $swstack und $framesize im Code zu definieren, damit die nicht zu klein sind.
Edit:
Schreib' Dir einen kleinen Code in Bascom, mit dem Du eine Led kurz blinken lässt sobald ein Zeichen ankam, das geht über Waitkey. Dann siehst Du ob ohne Portmonitor überhaupt Zeichen ankommen. Was ich zum Test auch noch machen würde, ist in der Systemsteuerung den Com1 Port fest auf die 2400, bzw. auch die anderen Parameter einzustellen.