hi,
ich habe mir ein kleines prog. geschrieben, mit dessen hilfe ich zeichen an ein serielles gerät senden kann und auf eine antwort warte. die sache funktioniert auch, hat aber nur einen haken.
wenn ich denn zu sendenden string eingebe, muss ich 2 mal auf senden klicken, erst dann kommt die antwort.
beipiel: eingabe v gibt als ausgabe einer versionsinfo. eingabe h eine hilfe. wenn ich h eintippe und auf senden klicke passiert nichts. wenn ich danach v eintippe und auf senden klicke, kommt die antwort vom vorherigen h befhel. die antworten sind also immer eins versetzt. vielleicht kann mir jemand sagen, woran das liegen kann?
code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.IO;
namespace terminal_app
{
public partial class Form1 : Form
{
SerialPort sp = new SerialPort();
string receivedData = "";
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
comboBox2.SelectedIndex = 0;
comboBox3.SelectedIndex = 0;
comboBox4.SelectedIndex = 3;
comboBox5.SelectedIndex = 11;
comboBox1.Items.AddRange(SerialPort.GetPortNames());
comboBox1.SelectedIndex = 0;
}
private void connect()
{
try
{
if (!sp.IsOpen)
{
sp.Open();
textBox_status.Text = "verbunden";
}
}
catch (Exception e1)
{
textBox_status.Text = "Fehler: Port ist in Benutzung oder nicht verfügbar";
}
}
private void button_connect_Click(object sender, EventArgs e)
{
sp.PortName = comboBox1.SelectedItem.ToString();
sp.BaudRate = int.Parse(comboBox5.SelectedItem.ToString());
sp.DataBits = int.Parse(comboBox4.SelectedItem.ToString());
if (comboBox3.SelectedIndex == 0)
{
sp.StopBits = StopBits.One;
}
if (comboBox3.SelectedIndex == 1)
{
sp.StopBits = StopBits.OnePointFive;
}
if (comboBox3.SelectedIndex == 2)
{
sp.StopBits = StopBits.Two;
}
if (comboBox3.SelectedIndex == 3)
{
sp.StopBits = StopBits.None;
}
if (comboBox2.SelectedIndex == 0)
{
sp.Parity = Parity.None;
}
if (comboBox2.SelectedIndex == 1)
{
sp.Parity = Parity.Even;
}
if (comboBox2.SelectedIndex == 2)
{
sp.Parity = Parity.Odd;
}
sp.DtrEnable = true;
sp.RtsEnable = true;
sp.ReadTimeout = 500;
sp.WriteTimeout = 500;
connect();
}
private void button_disconnect_Click(object sender, EventArgs e)
{
try
{
if (sp.IsOpen)
{
sp.Close();
textBox_status.Text = "getrennt";
}
}
catch {}
}
private void button_send_Click(object sender, EventArgs e)
{
if (sp.IsOpen)
{
try
{
string data1 = textBox_input.Text;
sp.WriteLine(data1);
textBox_status.Text = "gesendet";
textBox_output.AppendText("** Eingabe: " + textBox_input.Text + "\n");
textBox_input.Clear();
receivedData = sp.ReadExisting();
textBox_status.Text = "empfangen";
textBox_output.AppendText("Ausgabe: " + receivedData + "\n");
textBox_output.AppendText("\n");
}
catch {}
}
}
private void command_Click(object sender, EventArgs e)
{
sp.Write("$$$");
receivedData = sp.ReadExisting();
textBox_status.Text = "empfangen";
textBox_output.AppendText("Ausgabe: " + receivedData + "\n");
textBox_output.AppendText("\n");
}
}
}
Hi,
warum gibt es eigentlich keinen Event-Handler für den Empfang von Zeichen ?
Dort könntest Du ja dann debuggen und so vielleicht feststellen, woran es liegt.
Tschüss
ich hatte es mit einem eventhandler versucht, bekam da aber überhaupt keine antwort und hab das deshalb so gemacht, wie oben geschrieben.
und ich muss zugeben, dass ich von eventhandlern keine ahnung hab 😦
aber ich versuchs nochmal damit, wenn ich damit rausbekommen kann, woran so ein fehler liegen kann
Probiers mal hiermit:
Hallo,
bitte poste nicht einfach das gesamte Programm, zudem ohne jegliche Kommentare, mit der Frage "wo liegt der Fehler" (bzw. ähnlich). Beschränke Dich auf die relevanten Teile!
In Deinem Fall wird das Problem wohl daran liegen, dass Du nach dem Senden direkt eine Antwort lesen willst, die einfach Zeit braucht, bis sie vom seriellen Gerät kommt, also zum Zeitpunkt Deiner Abfrage gar nicht da ist. Beim nächsten Senden ist dann die Antwort natürlich da, aber eben auf das vorherige Kommando.
Bevor Du jetzt einfach ein Thread.Sleep einbaust, berücksichtige die anderen Antworten.
das template macht genau das, was ich will. jetzt muss ich nur noch schauen, warum das da funktioniert und bei mir nicht.
danke für den link.