Hallo Zusammen,
Muss eine Serielle Schnittstelle in C# entwickeln. Den Rahmen habe ich mit Forms schon entwickelt.
Folgendes Problem:
Ich bin noch sehr neu im C# Bereich und habe bisher keine serielle Schnittstelle Programmiert.
Ich muss aus der Schnittstelle Daten auslesen und eingeben. Das Gegengerät wrude in C Programmiert.
Der C Code ist im Anhang mit dabei. Zu diesem Code muss ich jetzt eine passende Software Programmieren (C#) um die Daten einlesen zu können und Befehel abzuschicken.
Wäre für jede Hilft sehr dankbar!
char COM_CHECK_SINGLE (char* befbuf, short len, unsigned short *deviceid, unsigned short *codeid, unsigned short *channelid, unsigned short *wertid)
{ //0 1 7 13 19 25
//<DIR>,<KENNUNG>,<CODE>,<CHANNEL>,<WERT><ETX>
//Die Zahlen sind grundsätzlich 5-stellig (unsigned short)
// Generelle Befehlslänge OK ?
if (len != COM_LN_SINGLE) return (0);
// Erster Befehlscheck: Größe und Rahmen soweit OK ?
if ( (befbuf[1]!= ',')||
(befbuf[7]!= ',')||
(befbuf[13]!= ',')||
(befbuf[19]!= ',')||
(befbuf[25]!= '#')||
((befbuf[0]!= 'S') && (befbuf[0]!= 'R')))
return (0); // nein, so nicht, Framefehler
// Ok, dann die Devicekennung extrahieren
memset(&buf[0],'0',sizeof(buf));
memcpy(&buf[0],&befbuf[2],sizeof(char)*5);
buf[5]= '\n';
*deviceid = atoi( &buf[0]);
// Ok, dann die Befehlskennung extrahieren
memset(&buf[0],'0',sizeof(buf));
memcpy(&buf[0],&befbuf[8],sizeof(char)*5);
buf[5]= '\n';
*codeid = atoi( &buf[0]);
// Ok, dann die Kanalkennung extrahieren
memset(&buf[0],'0',sizeof(buf));
memcpy(&buf[0],&befbuf[14],sizeof(char)*5);
buf[5]= '\n';
*channelid = atoi( &buf[0]);
// Ok, dann die Befehlswertkennung extrahieren
memset(&buf[0],'0',sizeof(buf));
memcpy(&buf[0],&befbuf[20],sizeof(char)*5);
buf[5]= '\n';
*wertid = atoi( &buf[0]);
// Rückgabe über die Parameterliste, wir sind fertig hier
return (1);
}
char COM_GET_SINGLE (char* befbuf, short len, char befid, unsigned short deviceid, unsigned short codeid, unsigned short channelid, unsigned short wertid)
{ //0 1 7 13 19 25
//<DIR>,<KENNUNG>,<CODE>,<CHANNEL>,<WERT><ETX>
//Die Zahlen sind grundsätzlich 5-stellig (unsigned short)
// Generelle Befehlslänge OK ?
if (len != COM_LN_SINGLE) return (0);
// Gültige Befehlskennung ?
if ((befid != 'S') && (befid != 'R')) return (0);
// ok, bauen wir zusammen
befbuf[0] = befid;
sprintf(&befbuf[1],",%05u,%05u,%05u,%05u#",deviceid,codeid,channelid,wertid);
return (1);
}
Hallo,
wie lautet deine Frage? Was hast du schon versucht? Woran bist du gescheitert? Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.1 + 4 + 4.2 und 6
Grüße
**:::
hi,
mein Problem ist, dass nicht weiß wie ich anfangen soll um das zu realiseren.
Wäre sehr dankbar wenn ich Codebeispiele bekommen könnten wie das aussehen kann.
LG
onur
Google hilft dir gern dabei C# get data from serial port. Der C-Code hilft dir dabei die empfangenen Daten auszuwerten.
Grüße
**:::
soweit bin ich schon. Das ist mein Serialportterminal
Die kommunikation funktioniert leider nicht.
namespace SerialPortTerminal
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
SerialPort serialPort; //Serialport den wir später verwenden - globale Deklaration
delegate void InvokeLB(string Data);
InvokeLB lbRecievedDelegate;
private void label3_Click(object sender, EventArgs e)
{
}
private void bCreateSP_Click(object sender, EventArgs e)
{
//Hier erstellen wir unseren Serialport und legen die Einstellungen fest
serialPort = new SerialPort(cbPort.Text, Convert.ToInt32(cbBaudRate.Text), (Parity)Enum.Parse(typeof(Parity), cbParity.Text), Convert.ToInt16(cbDataBits.Text), (StopBits)Enum.Parse(typeof(StopBits), cbStopbits.Text));
serialPort.Handshake = (Handshake)Enum.Parse(typeof(Handshake), cbHandshake.Text);
serialPort.RtsEnable = Boolean.Parse(cbRtsEnable.Text);
serialPort.DtrEnable = Boolean.Parse(cbDtrEnable.Text);
if (!serialPort.IsOpen)
{
serialPort.Open(); //Serialport öffnen
}
lbRecievedDelegate = new InvokeLB(InvokeLBRecieved);
serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived); //DataRecieved Event abonnieren
}
void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string RecievedLine = " ";
while (RecievedLine != "")
{
RecievedLine = serialPort.ReadLine();
lbRecieved.Invoke(lbRecievedDelegate,new object[]{RecievedLine});
}
}
void InvokeLBRecieved(string Data)
{
lbRecieved.Items.Add(Data);
}
private void Form1_Load(object sender, EventArgs e)
{
//Hier befüllen wir die Options-ComboBoxen
foreach (var item in SerialPort.GetPortNames())
{
cbPort.Items.Add(item);
}
cbPort.Text = cbPort.Items[0].ToString();
foreach (var item in Enum.GetNames(typeof(Parity)))
{
cbParity.Items.Add(item);
}
cbParity.Text = cbParity.Items[0].ToString();
foreach (var item in Enum.GetNames(typeof(StopBits)))
{
cbStopbits.Items.Add(item);
}
cbStopbits.Text = cbStopbits.Items[1].ToString();
cbBaudRate.Items.Add("110");
cbBaudRate.Items.Add("300");
cbBaudRate.Items.Add("600");
cbBaudRate.Items.Add("1200");
cbBaudRate.Items.Add("2400");
cbBaudRate.Items.Add("4800");
cbBaudRate.Items.Add("9600");
cbBaudRate.Items.Add("14400");
cbBaudRate.Items.Add("19200");
cbBaudRate.Items.Add("28800");
cbBaudRate.Items.Add("38400");
cbBaudRate.Items.Add("56000");
cbBaudRate.Items.Add("57600");
cbBaudRate.Items.Add("115200");
cbBaudRate.Text = cbBaudRate.Items[6].ToString();
cbDataBits.Items.Add("5");
cbDataBits.Items.Add("6");
cbDataBits.Items.Add("7");
cbDataBits.Items.Add("8");
cbDataBits.Items.Add("9");
cbDataBits.Text = "8";
foreach (var item in Enum.GetNames(typeof( Handshake)))
{
cbHandshake.Items.Add(item);
}
cbHandshake.Text = cbHandshake.Items[0].ToString();
cbDtrEnable.Items.Add("True");
cbDtrEnable.Items.Add("False");
cbDtrEnable.Text = "False";
cbRtsEnable.Items.Add("True");
cbRtsEnable.Items.Add("False");
cbRtsEnable.Text = "False";
}
private void bSendData_Click(object sender, EventArgs e)
{
//Hier werden die eingebenen Daten über die serielle Schnittstelle gesendet
serialPort.WriteLine(tbDataToSend.Text);
lbSent.Items.Add(tbDataToSend.Text);
tbDataToSend.Clear();
tbDataToSend.Focus();
}
private void bClearSent_Click(object sender, EventArgs e)
{
lbSent.Items.Clear();
}
private void bClearRecieved_Click(object sender, EventArgs e)
{
lbRecieved.Items.Clear();
}
private void cbHandshake_SelectedIndexChanged(object sender, EventArgs e)
{
}
}
}
Bitte benutze Code-Tags! [Hinweis] Wie poste ich richtig? Punkt 6
Die kommunikation funktioniert leider nicht.
Das ist leider keine Fehlerbeschreibung. Wenn du nicht weißt wo es hängt dann hilft dir der Debugger [Artikel] Debugger: Wie verwende ich den von Visual Studio?
Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 6
**:::
Der Code an sich stimmt. Es gibt keine Fehlermeldung.
Das Problem ist wenn ich ein Zeichen Sende, bekomme ich keine Antwort.
Z.B. sollte ich eine Antowrt bekommen wenn ich ein * schicken. Aber leider bekomme ich keine Antwort. Das habe ich mit Kommunikation gemeint.
LG
onur
Also der Code funktioniert. Den habe ich nämlich vor einer halben Ewigkeit mal auf Roboternetz.de gepostet.
Dein Problem könnte eher darin liegen, dass du nämlich nicht verstanden hast was der Code macht
geschweige denn Diskussion dazu gelesen hast:
http://www.roboternetz.de/community/threads/53894-Beispiel-Anwendung-C-Zugriff-auf-SerialPort
Dort wird nämlich z.B. erklärt, was man macht, wenn die Antwort kein "Newline" Zeichen enthält.
string RecievedLine = " ";
while (RecievedLine != "")
{
RecievedLine = serialPort.ReadLine();
lbRecieved.Invoke(lbRecievedDelegate,new object[]{RecievedLine});
}
Wenn deine Antwort eben kein "Newline" hat, dann wird er ewig an der Stelle hängen bleiben.
Sorry, aber sich Code _runterladen _ohne zu verstehen was er macht mag einfach sein, wird dich aber auf Dauer nicht weiterbringen! Du solltest auf jeden Fall versuchen zu **verstehen **was der Code macht... Ansonsten wirst du auch in 6 Monaten noch die gleichen Probleme haben!
Ist echt nicht böse gemeint - aber programmieren ist halt etwas mehr als nur Code runterzuladen.
Stefan