es gib eine eigene virtual machine die auf dem atmega8 läuft. damit könntest du auch java programme auf dem asuro laufen lassen.
meintest du das?
Hallo Alle,
den ASURO will ich mit einem kleine Java-Programm steuern. Um über die Schnittstelle Daten zu übertragen, werde ich RXTX einsetzen.
Hat schon mal jemand versucht, ein Java-Programm zu schreiben?
Gruß,
robo
Nachtrag:
hier ein Bild vom Zwischenstand
Bild hier
es gib eine eigene virtual machine die auf dem atmega8 läuft. damit könntest du auch java programme auf dem asuro laufen lassen.
meintest du das?
Nein, auf dem Atmega8 soll ein C-Programm laufen. Das Steuerprogramm auf dem PC mit Java.
Ich mache das mit JAVA!
Ungefähr so:
mitCode:import javax.comm.*; ... serialPort=open("COM1"); serialPort.setSerialPortParams(2400, SerialPort.DATABITS_8,SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); outputStream = serialPort.getOutputStream(); ... outputStream.write(char); ...
Code:SerialPort open(String name) throws PortInUseException { CommPortIdentifier portId; Enumeration portList; portList = CommPortIdentifier.getPortIdentifiers(); while (portList.hasMoreElements()) { portId = (CommPortIdentifier) portList.nextElement(); if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { if (portId.getName().equals(name)) { return (SerialPort) portId.open(name, 2000); } } } return null; }
Tut's
Hallo rosir,
Zugegebenermaßen habe ich erst vor 4 Tagen angefangen, mich mit Java zu beschäftigen. Die Grundlegende Kommunikation habe ich aber vor kurzem schon hingekriegt.
Wenn ich beim Durchstöbern des Internet nichts übersehen habe, unterstützen die Orginal comm Klassen von Sun Windows nicht.import javax.comm.*;
Unter Window muss man RXTX verwenden und dann sieht das ganze so aus
Was ich mich Frage: Wenn man jemandem ein Java-Programm geben möchte, wie ist das mit der Installation?import gnu.io.*;
Für die Kommunikation wird die JRE und RXTX gebraucht. Gibt es Installer, die alle Datein auf einem Computer an die richtigen Stellen schieben? Kann man ein Java-Programm über eine Verknüpfung auf dem Desktop starten?
Gruß,
robo
Also, wenn ich mich richtig erinnere und man JAVA von den SUN Seiten installiert funktioniert doch alles automatisch?! Selbst JAR Dateien werden mit javaw.exe verbunden. D.h. ein Doppelklick auf eine JAR Datei startet dann das darin enthaltene JAVA Programm.
Ok, bei RXTX wird man wohl die entsprechenden Libraries (jars) händig ins richtige Verzeichnis kopieren müssen (mit RXTX habe ich aber keine Erfahrung).
Oder, habe ich Deine Frage nicht richtig verstanden?
Hallo rosir,
Leier weis ich das nicht. Ich hatte mir Java als großes Zip-File heruntergeladen und dann das Java-Verzeichnis 'händisch' angelegt. Dadurch sind die *.jar- Files leider nicht mit Java verbunden.Also, wenn ich mich richtig erinnere und man JAVA von den SUN Seiten installiert funktioniert doch alles automatisch?! Selbst JAR Dateien werden mit javaw.exe verbunden. D.h. ein Doppelklick auf eine JAR Datei startet dann das darin enthaltene JAVA Programm.
( BTW: wie macht man das eigentlich nachträglich? )
Ja, das befürchte ich auch. Könnte es sein, dass es einfache, selbst zu konfigurierende Installer gibt?Ok, bei RXTX wird man wohl die entsprechenden Libraries (jars) händig ins richtige Verzeichnis kopieren müssen
Geht es auch anders mit Windows? Ich dachte die Sun-Comm-Lib funktioniert nur mit Linus und Mac ( laut Internet ).(mit RXTX habe ich aber keine Erfahrung).
Gruß,
robo
Kommunikationsprogramm auf ASURO-Seite
Hier habe ich ein sehr einfaches Kommunikationsprogramm in C für die ASURO Seite geschrieben. Es versteht im Moment nur zwei Kommandos:
't' für Test
'l' um den linken Liniensesnor abzufragen
man kann aber sehr einfach weitere Kommandos an das Programm hinzufügen. Für das Programm wird die Asuro LibV261 von http://sourceforge.net/projects/asuro/ benötigt
Code:#include "asuro.h" /*************************************************************************** * * AsuroEasyCom * * Programm zur einfachen Kommunikation des PC mit dem ASURO * über die Infrarot Schnittstelle * * * Kommandos: * * t: Testkommando, Asuro sendet xASUROy zurück * l: Abfrage des linken Liniensensors * *************************************************************************** */ // Status LED Farbe wechseln void toggle_led() { static uint8_t k=0; if(k)StatusLED(GREEN); else StatusLED(YELLOW); k=~k; } // Ein Zeichen von IR empfangen uint8_t receive() { /* Warten auf ein Zeichen von der seriellen Schnittstelle */ UCSRB = 0x10; // enable receiver while(!(UCSRA & 0x80)); // wait for received byte toggle_led(); return UDR; } // Text senden void SerPrint(unsigned char *data) { SerWrite(data,strlen(data)); } int main(void) { uint8_t command; int linie[2]; Init(); SerPrint("\n\r-- ASURO Ready --\n\r"); StatusLED(GREEN); while(1) { /* Warten auf ein Kommando der seriellen Schnittstelle */ command = receive(); switch(command) { // Testcommando case 't': { SerPrint("xASUROy"); } break; // Liniensensor links abfragen case 'l': { LineData(linie); SerPrint("x"); PrintInt(linie[0]); SerPrint("y"); } break; // nicht erkannte Kommandos default: { StatusLED(RED); SerPrint("E"); /* Falls kein bekanntes Kommando, 'E' für Error senden */ }break; } } return 0; } /*************************************************************************** * * (c) 2008 robo.fr (Nickname) , christoph(at)roboterclub-freiburg.de * *************************************************************************** * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation version 2 of the License, * * If you extend the program please maintain the list of authors. * * ( if there is no real name, the nick name has to be mentioned ) * If you want to use this software for commercial purposes and you * * don't want to make it open source, please contact the authors for * * licensing. * ***************************************************************************/
Hallo robo,
So ist es. Beim c't-Bot wurde deshalb auch die RXTX Lib verwendet. Zur Installation unter Windows wird lediglich die DateiGeht es auch anders mit Windows? Ich dachte die Sun-Comm-Lib funktioniert nur mit Linus und Mac ( laut Internet ).
rxtxSerial.dll benötigt, die in das Verzeichnis JAVA_HOME\jre\bin kopiert werden muß.
Mit einen Installprogramm wie z.B. NSIS eigentlich kein Problem.
Hallo m.a.r.v.i.n,
vielen Dank für die Auskunft, ich hätte nicht gedacht, dass es so einfach ist. Bei RXTX ist ja noch die Datei rxtxParallel.dll dabei, die man angeblich auch noch mitkopieren soll.
Gruß,
robo
Mittlerweile habe ich es schon geschafft, mein erstes Java-Programm zu schreiben, welches testen kann, ob der ASURO da ist. Es kann auch die Werte des Linken Liniensensors auslesen.
Hier also meine erste Java-Klasse ( bin ja Java-Anfänger )
Zur Entwicklung verwende ich Eclipse. Da gibt es ein Fenster, das heist Javadoc. Kann man damit automatisch eine Dokumentation erstellen? Wie muss ein einfacher Syntax aussehen?Code:/** * Java Testprogramm zur Kommunikation mit dem ASURO Roboter * * Programm zur einfachen Kommunikation des PC mit dem ASURO * über die Infrarot Schnittstelle * * Kommandos: * * t: Testkommando, Asuro sendet xASUROy zurück * l: Abfrage des linken Liniensensors, Asuro sendet xZAHLy zurück * * * @author robo.fr ( Nickname ) christoph(at)roboterclub-freiburg.de * * Feb.2008 * */ public class Test { private static boolean debug = true; // Nachbau von Msleep aus der AsuroLibV261 für Java // ( leider müssen Methoden in Java klein geschrieben werden ) public static void msleep(int millisekunden) { long stop,current; java.util.Date zeit=new java.util.Date(); stop=zeit.getTime()+millisekunden; current=0; while(current<stop) { java.util.Date zeit2=new java.util.Date(); current=zeit2.getTime(); } } // sende das Testzeichen 't' zum ASURO und warte auf die // korrekte Antwort: "xASUROy" // falls der ASURO richtig antwortet, return true public static boolean testCommand(Rs232 port) { port.read(); // Empfangsbuffer leermachen durch lesen port.write((byte)'t'); // Testkommando senden msleep(200); String text=port.read(); if(debug) System.out.println(text); if(text.contains("x") && text.contains("y")) { //if((text.indexOf("ASURO")-text.indexOf('x'))==1) if(text.indexOf("xASUROy")!=-1) { if(debug) System.out.println("Test OK"); return true; // Test OK, der ASURO antwortet korrekt } } if(debug) System.out.println("No ASURO"); return false; } // Wert des linken Liniensensors lesen public static double read_line_left(Rs232 port) { port.read(); // Empfangsbuffer leermachen durch lesen port.write((byte)'l'); // Liniensensor Lesekommando msleep(500); String text=port.read(); if(debug) System.out.println(text); double x; if(text.contains("x") && text.contains("y")) { String s=text.substring(text.indexOf("x")+1,text.indexOf("y")); x=Double.parseDouble(s); if(debug) System.out.println(x); return x; // Test OK, der ASURO antwortet korrekt } if(debug) System.out.println("No Number"); x=Double.NaN; // return Not a Number return x; } public static void main(String[] args) { int n; RS232 port1=new Rs232(); port1.ports_available(); port1.open("COM10") ; port1.write("test"); testCommand(port1); testCommand(port1); for(n=0;n<50;n++) { read_line_left(port1); } port1.close() ; System.out.println("beendet"); } } /*************************************************************************** * * (c) 2008 robo.fr (Nickname) , christoph(at)roboterclub-freiburg.de * *************************************************************************** * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation version 2 of the License, * * If you extend the program please maintain the list of authors. * * ( if there is no real name, the nick name has to be mentioned ) * If you want to use this software for commercial purposes and you * * don't want to make it open source, please contact the authors for * * licensing. * ***************************************************************************/
Hier das ganze Projekt als Zip-File, falls es jemand ausprobieren will.
An die Java-Profis: Was könnte ich den alles besser machen?
Allgemein solltest du dir die Objektorientierung mal etwas näher anschauen -- einfach alle Methoden static zu machen entspricht eigentlich nicht dem Gedanken der objektorientierten Programmierung
Als einfaches Beispiel könnte deine Klasse für die ASURO-Kommunikation folgendes Schema haben:
JavaDoc kann aus den Quellcodekommentaren eine Dokumentation erstellen, bspw. in HTML (siehe SUNs Java API Dokumentation, die ist so erstellt). Damit Javadoc weiß, was/wie/wo dokumentiert wird, muss man sich bei der Erstellung der Kommentare an ein paar Konventionen halten.Code:public class ASURO { private RS232 thePort = null; public boolean testCommand() { //... } //.... Hier alle möglichen Methoden zur // Kommunikation mit dem ASURO public ASURO(Rs232 port) { thePort = port; } public ~ASURO() {} public static void main() { s232 port1=new Rs232(); port1.ports_available(); port1.open("COM10") ASURO myAsuro = new ASURO(port1); myAsuro.testCommand(); //usw. } }
Siehe bspw. hier:
http://www.tobias-seckinger.de/java/...inf-hrung.html
Eine gute Alternative zu Javadoc, die auch mit C++ usw. umgehen kann, ist Doxygen (+doxywizard):
http://www.stack.nl/~dimitri/doxygen/
Lesezeichen