Laden...

Serielle Schnittstelle C# und C

Erstellt von fsonur vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.859 Views
F
fsonur Themenstarter:in
8 Beiträge seit 2014
vor 9 Jahren
Serielle Schnittstelle C# und C

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);
	
}
1.696 Beiträge seit 2006
vor 9 Jahren

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

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

F
fsonur Themenstarter:in
8 Beiträge seit 2014
vor 9 Jahren

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

1.696 Beiträge seit 2006
vor 9 Jahren

Google hilft dir gern dabei C# get data from serial port. Der C-Code hilft dir dabei die empfangenen Daten auszuwerten.

Grüße

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

F
fsonur Themenstarter:in
8 Beiträge seit 2014
vor 9 Jahren

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)
        {

        }
    }
}
Hinweis von Coffeebean vor 9 Jahren

Bitte benutze Code-Tags! [Hinweis] Wie poste ich richtig? Punkt 6

1.696 Beiträge seit 2006
vor 9 Jahren

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

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

F
fsonur Themenstarter:in
8 Beiträge seit 2014
vor 9 Jahren

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

L
95 Beiträge seit 2009
vor 9 Jahren

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.

463 Beiträge seit 2009
vor 9 Jahren

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

888 Beiträge seit 2007
vor 9 Jahren