Hallo, ich versuche gerade eine CNC-Steuerung für Schrittmotoren zu programmieren mit Hilfe des EMIS USB-Interface. Hat jemand von euch Erfahrung bzgl beschreiben und auslesen des Interface über eine serielle Schnittstelle in C#? Grüße
SaKiDi schrieb: > Hallo, > > ich versuche gerade eine CNC-Steuerung für Schrittmotoren zu > programmieren mit Hilfe des EMIS USB-Interface. > Hat jemand von euch Erfahrung bzgl beschreiben und auslesen des > Interface über eine serielle Schnittstelle in C#? > > Grüße Mal auf der Homepage des Herstellers geschaut? https://emisgmbh.de/downloads/ USB->Seriell scheint von FTDI zu kommen, d.h. die können wie ganz normale serielle Schnittstellen angesprochen werden (Klasse SerialPort in System.IO.Ports). Zudem gibt's auf https://emisgmbh.de/downloads-software/ noch eine DLL, die mit P/Invoke in C# eingebunden werden könnte.
Hallo Arc N., Danke für deine Information. Ich werde es versuchen und hoffe, dass ich dann eine erfolgreiche Kommunikation zwischen INterface und Software herstellen kann Grüße
Hallo Arc N., ich habe versucht die DLL-Datei mit einzubinden, jedoch war die erfolglos, da VS immer einen Error anzeigt... Es konnte kein Verweis auf "... .dll" hinzugefügt werden. Stellen Sie sicher, dass auf die Datei zugegriffen werden kann und dass sie eine gültige Assembly oder COM-Komponente ist. Leider bin ich mit meinem Problem somit nicht weiter gekommen. Hat jemand noch eine Idee oder einen Hinweis? Grüße
SaKiDi schrieb: > Hallo Arc N., > > ich habe versucht die DLL-Datei mit einzubinden, jedoch war die > erfolglos, da VS immer einen Error anzeigt... > > Es konnte kein Verweis auf "... .dll" hinzugefügt werden. > Stellen Sie sicher, dass auf die Datei zugegriffen werden kann und dass > sie eine gültige Assembly oder COM-Komponente ist. > > Leider bin ich mit meinem Problem somit nicht weiter gekommen. > > Hat jemand noch eine Idee oder einen Hinweis? > > Grüße Die DLL nicht als Verweis zum Projekt hinzufügen, dass funktioniert, wie die Fehlermeldung schon sagt, bei .NET nur für .NET-Assemblies/DLLs oder COM-Komponenten. Bei nativen DLLs reicht es, wenn diese im Suchpfad (der Anwendung) liegen. Einbindung, wenn es bspw. die emis_com.dll ist, dann bspw. so:
1 | [DllImport("emis_com.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] |
2 | [return: MarshalAs(UnmanagedType.Bool)] |
3 | public static extern bool Oeffne_Schnittstelle(int iSerComNr); |
4 | |
5 | // danach kann die Funktion ganz normal aufgerufen werden z.B.
|
6 | bool open = Oeffne_Schnittstelle(1); |
Danke für deine Rückmeldung. Leider bin ich bei dem Thema DLL-Dateien noch sehr unerfahren. Ich habe leider keine Ahnung wie ich die Befehle in das char schreibe und wie das alles in meine Funktion eingebunden wird.
SaKiDi schrieb: > Danke für deine Rückmeldung. > > Leider bin ich bei dem Thema DLL-Dateien noch sehr unerfahren. > Ich habe leider keine Ahnung wie ich die Befehle in das char schreibe > und wie das alles in meine Funktion eingebunden wird. Die "komplizierteren" DLL-Funktionen dürften
1 | // extern "C" __declspec(dllexport) void _stdcall SendBefehl(char* befstr, int endekenn);
|
2 | [DllImport("emis_com.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] |
3 | public static extern void SendBefehl( |
4 | [MarshalAs(UnmanagedType.LPStr)] |
5 | string befstr, // string sollte hier reichen außer die DLL schreibt in den String, dann StringBuilder nehmen |
6 | int endekenn); |
7 | |
8 | // extern "C" __declspec (dllexport) long _stdcall GetRueckgabe(char* sRueckgabe, long lRueckgabe);
|
9 | [DllImport("emis_com.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] |
10 | public static extern long GetRueckgabe( |
11 | [MarshalAs(UnmanagedType.LPStr)] |
12 | StringBuilder sRueckgabe, // siehe oben |
13 | int lRueckgabe); // int statt long, da long in C# 64-Bit hat |
sein. Wenn das wirklich nur einfache FTDI-COM-Ports sind, sollte eigentlich SerialPort reichen (Encoding auf Encoding.GetEncoding(28591) setzen, ergibt 8-Bit ASCII (ISO 8859-1 Latin 1; Western European (ISO)) und die Befehle wie dokumentiert senden. Zur Not mit bspw. https://docs.microsoft.com/en-us/sysinternals/downloads/portmon mitschneiden was da gesendet wird.
Danke für deine Ausführliche Antwort > Wenn das wirklich nur einfache FTDI-COM-Ports sind, sollte eigentlich > SerialPort reichen (Encoding auf Encoding.GetEncoding(28591) setzen, > ergibt 8-Bit ASCII (ISO 8859-1 Latin 1; Western European (ISO)) und die > Befehle wie dokumentiert senden Die DLL konnte ich dank deiner Hilfe jetzt komplett einbinden. leider ist mir die Funktion mit dem serialPort noch unklar... Sollte dies ungefähr so aussehen ? public bool Open() { openport = Oeffne_Schnittstelle(1); SerialPort serialport = new SerialPort(); serialport.BaudRate = 115200; serialport.DataBits = 8; serialport.Parity = Parity.None; serialport.StopBits = StopBits.One; serialport.Encoding = System.Text.Encoding.GetEncoding(28591); if (serialport.IsOpen == true) { return true; } else { return false; } } Die weiteren DLL Funktionen können ihre zugewiesenen Variablen über eine Methode erhalten, richtig? Dankeschön
sakidi schrieb: > Danke für deine Ausführliche Antwort > >> Wenn das wirklich nur einfache FTDI-COM-Ports sind, sollte eigentlich >> SerialPort reichen (Encoding auf Encoding.GetEncoding(28591) setzen, >> ergibt 8-Bit ASCII (ISO 8859-1 Latin 1; Western European (ISO)) und die >> Befehle wie dokumentiert senden > > Die DLL konnte ich dank deiner Hilfe jetzt komplett einbinden. > leider ist mir die Funktion mit dem serialPort noch unklar... > Sollte dies ungefähr so aussehen ? War vielleicht etwas missverständlich: Entweder mit der emis_com.dll arbeiten oder mit der Klasse SerialPort. Nicht beide zusammen. > Die weiteren DLL Funktionen können ihre zugewiesenen Variablen über eine > Methode erhalten, richtig? ? Wenn damit die Argumente der Funktionen (tatsächlichen Parameter) gemeint sind, ja.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.