PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Com Port einlesen per Java



DavidN
23.02.2005, 10:59
Ich weiß Java ist für hardwarenahe Anwendungen eigentlich nicht geeignet, aber zur Zeit kann ich noch keine andere Sprache.

Frage:
an den com Port gebe ich an Rxd(Pin 2) ein high, wie zählt der Rechner den Impuls denn dann aus?

Bitte nicht zu kompliziert, ich bin ganz am Anfang und kann noch nichts.

eFFex
23.02.2005, 16:58
ich denke das wird problematisch mit Java...
C hat ne ähnliche Syntax und wenn du dich durch n paar Tutorials druchgewurschdelt hast, sollte es kein Problem sein, das mit C zu realisieren.

SlyD
23.02.2005, 18:18
Wie ich es immer wieder empfehle: http://www.rxtx.org/

Sorry hab grad keine Zeit für details...

MJA
23.02.2005, 21:59
Dafür brauchst du eine spezielle Libary. Ich kann dir leider nicht verraten, wo man die bekommt, aber ich kann dir sagen wie sie heißt: javax.comm

Zu dem Thema gibt es in Software, Algorithmen und KI auch einen Thread mit einer ähnlichen Frage. Da geht es um die Steuerung des COM-Ports über eine Website mithilfe eines Applets.

Hier ist ein Codefetzen (copyright Jochen Steinmann):


class RS232Driver
{
/**Vector für Dateneinlesen*/
public static Vector rs232vector = new Vector();
/** Port-Identifier*/
public static CommPortIdentifier portId;
/**Serielle Schnittstelle*/
public static SerialPort RS232port;
/** RS232-Input-Stream*/
public static InputStream RS232in;
/** RS232-Output-Stream*/
public static OutputStream RS232out;
PrintWriter Out;
/**Methode zum Testen des Vektors*/
public void testvector()
{
for(int i=0;i<50;i++)
{
rs232vector.add("test");
}
checkvector();
}
/**Port öffnen*/
public void openport(String comname,PrintWriter Out)
{
try
{
CommPortIdentifier cpi = CommPortIdentifier.getPortIdentifier(comname);
if(cpi.getPortType() == cpi.PORT_SERIAL)
{
RS232port = (SerialPort)cpi.open("server",1000);
RS232port.setSerialPortParams(9600,RS232port.DATAB ITS_8,
RS232port.STOPBITS_1,
RS232port.PARITY_NONE);
RS232port.enableReceiveTimeout(2000);
System.out.println(" "+RS232port.getName()+" wurde geöffnet");
Out.println("Schnittstelle geoeffnet
");
}
}
catch(Exception e)
{
Out.println(e);
System.out.println(e);
}
try
{
RS232in = RS232port.getInputStream();
RS232port.notifyOnDataAvailable(true);
RS232out = RS232port.getOutputStream();
RS232port.addEventListener(new commListener());
}
catch (Exception e) { System.out.println("Fehler: "+e);}
}
/** Serielle Schnittstelle schliessen */
public static void closeRS232()
{
if(RS232port != null)
{
RS232port.close();
//Out.println(" Schnittstelle wurde geschlossen");
}
}
/** STRING auf die RS232 ausgeben*/
public void writeRS232(String ausgabe,PrintWriter Out)
{
if (RS232port != null)
{
PrintWriter aus = new PrintWriter(RS232out);
aus.println(ausgabe);
aus.flush();
aus.close();
}
}
/** CHAR auf die RS232 ausgeben*/
public void writecharRS232(char ausgabe,PrintWriter Out)
{
if (RS232port != null)
{
PrintWriter aus = new PrintWriter(RS232out);
aus.print(ausgabe);
aus.flush();
aus.close();
}
}
/**Vektor auslesen*/
public void getrs232vector(PrintWriter Out)
{
for(int i=0;i<rs232vector.size();i++)
{
Out.println("RS232> "+(String)rs232vector.get(i)+"
");
}
Out.println();
}
/**Vektor auf Länge überprüfen und trimmen*/
public void checkvector()
{
if(rs232vector.size()>50)
{
rs232vector.remove(0);
}
}
/** Klasse für die permanente Datenaufzeichnung der seriellen Schnittstelle
* @author Jochen Steinmann
* @version 1.0
* @since 1.0
*/
public class commListener implements SerialPortEventListener{
int z = 0;
public void serialEvent(SerialPortEvent event) {
if(event.getEventType()==SerialPortEvent.DATA_AVAI LABLE){
byte[] readBuffer = new byte[20];
try {
while (RS232in.available() > 0) {int numBytes = RS232in.read(readBuffer);}
String nachricht = new String(readBuffer);
rs232vector.add(nachricht);
checkvector();
}
catch (IOException e) {System.out.println("Fehler: "+e);}
}
}
}

Hoffe, ich konnte dir weiterhelfen.

Gruß

MJA
23.02.2005, 22:10
Achja, hier is auch noch näheres: https://www.roboternetz.de/phpBB2/viewtopic.php?t=6192

Gruß, Jan

DavidN
24.02.2005, 11:31
Das Paket habe ich. Ist auch schon eingebunden. Habe damit einen Analogrechner angesteuert (Jugend forscht / Technik). Probleme habe ich bei dem benutzen des Ports. Ich habe eine Schlatung die mir zu einer bestimmten Zeit High zum RxD gibt, aber ich weiß nicht, woher der Computer weiß, wann das Signal anfängt und in welcher Zeit ich ein Byte rüberschicke. Ich bekomme zwar signale, aber nur bestimmte Zahlen (ist ja logisch).
Das ganze ist ein Drehzahlmesser.

Was ich habe:
1. Stufe: 0000 0000 0001
2. Stufe: 1000 0000 0001
3. Stufe: 0100 0000 0001
4. Stufe: 0010 0000 0001
...

Was ich bekomme:
1. Stufe: 8xxx
2. Stufe: 3xx
3. Stufe: 2xx
4. Stufe: 2xx
...

wie liest der Port die Daten ein und warum passt dass nicht wirklich mit den Zahlen überein dich haben müsste?

Außerdem, ich habe gedacht der liest immer nur ein Byte ein, aber in wirklichkeit habe ich Zahlen die Größer sind (1,5 Byte).

Stoneman
24.02.2005, 13:45
Wenn hier schon meine Codefetzen gepostet werden, dann will ich auch mal was dazu schreiben. Es dürfte nicht möglich sein den RXD Pin abzufragen, da Java das nicht unterstützt, aber du kannst andere pins benutzen, denn JAVA kann andere Pins auslesen und sogar setzen, nur nicht RXD und TXD.

Edit: ich meine dass man die Empfangspufferlänge setzen kann, irgendwo setz t du den meistens auf acht, wenn du da dann 12 eingibt, könnte das gehen.


RS232port.setSerialPortParams(9600,RS232port.DATAB ITS_8,
RS232port.STOPBITS_1,
RS232port.PARITY_NONE);
Wo DATABITS_8 steht, müsste das andere Hin, habe ich aber noch nie gemacht, also nur so eine Idee[/code]

MJA
24.02.2005, 19:14
@Stoneman: Ich habe ja extra ein Copyright angegeben! Ich selber hab mich mit dem Thema nicht mehr beschäftigt.

Gruß, Jan.

Stoneman
24.02.2005, 19:56
@MJA ok, ich habe vergessen die Ironietags einzufügen, mach dir nichts draus

DavidN
28.02.2005, 08:18
Ne ne,
grade RxD und TxD werden benutzt. Der Rest weiß ich nicht wie man den anspricht. Probiers einfach mal selber aus:
- an den Pin 2 leg eine Frequenz
- lies den Port aus
- aus dem ersten zeichen des strings mach ein bit-code

wenn du das machst, weist was am Port ankommt.
außerdem wird der Wert 12 bei Databits nicht unterstützt, es gibt nur 5,6,7 und 8.
eigentlich wollte ich aber wissen , wie der Port die Signale auswertet.
rechnert der die takte ab dem ersten high oder bekommt der erst eine bestimmte zeit lang ein (Start) High oder wie geht das?

MJA
01.03.2005, 10:09
@Frage: Also da kann ich dir nicht weiterhelfen, ich bin eher ein Mensch von der Softwareebene ;) Aber ich bin sicher dir kann irgendjemand hier helfen. Viel Glück!

Gruß, Jan.

DavidN
02.03.2005, 12:31
kannst du mir denn villeicht mal nebenhe als nachricht, einen quelltext schicken wie man den Parallel-Port anspricht? wäre nett.

MJA
02.03.2005, 17:02
Das geht mit dem Code, den ich auch weiter oben schon gepostet hab. Damit kannst du den Port öffnen, schließen, was an den Port ausgeben und einlesen. Ist auch in den Kommentaren erklärt vofür die jeweilige Funktion gut ist.
Oder ist das nicht das was du suchst?

Gruß, Jan.

Stoneman
02.03.2005, 20:08
Parallelport und Java gibt Kopfschmerzen, denn das geht nicht so ohne weiteres, wie man es von den alten Basiczeiten noch kennt.
Du benötigst da noch eine Schaltung, die den Drucker "emuliert", so dass du nur die 8 Datensignale steuern kannst. Ausgabe geht auf jeden Fall, aber Eingabe?

MJA
03.03.2005, 07:19
Ok Stoneman ist der Experte, was er sagt is Gesetz! ;-) Nein ich hab mir einfach nur den Quellcode angeguckt und geschaut was der für Funktionen implementiert. Der Code kommt ja auch von Stoneman ;-) Naja, der wird dir bestimmt besser weiterhelfen können.

Gruß, Jan.

Stoneman
03.03.2005, 10:35
@MJA naja ich lasse mich gerne Verbessern :D
Der Quellcode unterstützt den Parallelport auch, nur benötig man da halt eine besondere Schaltung, aus einem Flipflop oder so, ich muss das noch mal genau nachgucken, wenns hier wen interessiert...
Warum nimmst du keinen µC, und den dann per RS232 -> JAVA ? Wäre hier glaube ich einfacher, aber mal hören, was die anderen dazu sagen...

DavidN
03.03.2005, 12:12
@com Wie ich das so merke weis auch keiner so richtig, wie der ComPort genau liest. Aber weiß vielleicht einer wo ich ein tutroial dazu finde?

@ parallel wenn du weißt wie das geht, muss der µC das tun:
- von dem Comport auf einen byte warten
- umwandeln auf 3 Leitungen (dauerhaft-parallel)
- auf short!! warten und 1x an den Comport weitergeben.

also
,-----,
-PIN 2--(recieve data)----| |---(receive data)--
-PIN 3--(transmitt data)--| |---(A)---------------
-PIN 5--(ground)----------| |---(B)---------------
| |---(C)--------------
'------'

da sind noch zwei ein/ausgang auf der rechten seite, aber da muss ich mal kurz zu haus nachsehen was die machen (bin in der schule).
dabei muss ich sagen, dass ich µCs nicht programmieren kann. wie läuft das also?
Ich glaub am einfachsten ist es wenn man an den parallel port rankommt.

Stoneman
03.03.2005, 12:19
ich verstehe dein Problem im Augenblick noch nicht ganz, aber vielleicht kommt das noch.

Parallele Ausgabe geht mit JAVA, nur das Einlesen geht nicht.

MJA
03.03.2005, 14:07
Wie ich das so merke weis auch keiner so richtig, wie der ComPort genau liest. Aber weiß vielleicht einer wo ich ein tutroial dazu finde?
Wie gesagt ich bin mehr der Softwaremensch. Aber ich glaube es geht darum das du aus

Was ich bekomme:
1. Stufe: 8xxx
2. Stufe: 3xx
3. Stufe: 2xx
4. Stufe: 2xx
...
nicht schlau wirst oder?
Was ich nicht ganz verstehe ist, was du damit meinst:

Was ich habe:
1. Stufe: 0000 0000 0001
2. Stufe: 1000 0000 0001
3. Stufe: 0100 0000 0001
4. Stufe: 0010 0000 0001
...
Soll es sich dabei um die selben Werte handeln, wie oben? Weil dann müsste das ein mathematischen Problem sein. Vielleicht handelt es sich um Hexa-Dezimal Zahlen, oder sogar "echte" Dezimal-Zahlen.

Gruß, Jan.

P.S.: Für die Dummheit dieses Beitrags übernimmt der Autor keine Haftung. (Falls er was nich ganz gecheckt hat)

Stoneman
03.03.2005, 14:20
Der Com-Port liest über das RS232 Protokoll ein:
Wikipedia hilft hier weiter, und Google ist eh dein Freund :D
Also hier das wichtige aus Wikipedia:


Da es keine Taktleitung gibt, die die Übertragung synchronisiert, muss auf beiden Seiten der Übertragungs-Strecke dieselbe Übertragungsgeschwindigkeit (in Baud) eingestellt sein, damit die Übertragung klappt.
Pro übertragenem Datensatz (Byte) wird die Übertragung mittels des Startbits eingeleitet. Serielle Übertragungen funktionieren grundsätzlich aber auch ohne Startbit.
Darauf folgen 5-8 Datenbits (Nutzdaten) mit dem niederwerigsten Bit (LSB) zuerst, wahlweise ein Parity-Bit und schließlich ein oder zwei Stoppbits.
Da alle diese Variationen in den Standards nicht festgelegt sind, müssen bei beiden Geräten, die an der Kommunikation beteiligt sind, die Parameter gleich eingestellt sein, bevor eine erfolgreiche Kommunikation zustande kommen kann.

Das ist das was JAVA kann....
Wenn du was anderes machen willst, musst du eventuell den sehr großen Umweg über C oder C++ oder ähnliches machen aber davon habe ich auch nur mal gehört und es mal ausprobiert, mach es nicht, der Aufwand lohnt sich nur, wenn du es wirklich brauchst. Dann müsstest du dir eine DLL schreiben und die in JAVA einbinden.

MfG

Stoneman[/quote]

DavidN
04.03.2005, 11:05
mist jetzt bin ich auf ignorieren gekommen!
wie mach man das wieder rückgängig?

@ stoneman Ja, genau dass wollt ich wissen, wisst ihr denn wie lang der startbit/stopbit ist und was wird bei den Baud angegeben.

das komische daoben von mir ist ein Bild, das ich gezeichnet habe, da sind nur die Leerzeichen nicht angezeigt und sieht deswegen komisch aus.
ich zeichne das ganze nochmal neu, hab jetzt aber wenig zeit.

Stoneman
04.03.2005, 12:51
Soweit ich mich erinnere hat das Startbit eine Länge von (oh Wunder) einem Bit, deshalb heißt es ja auch ein Bit, das Stoppbit hat auch eine Länge von einem Bit, aber Angaben ohne Gewähr, aber ich denke Google wird dir das Bestätigen.

DavidN
08.03.2005, 10:09
wo dus sagst, irgendwie logisch #-o

äähh... , noch letzte Frage(glaube ich):
wie lang ist denn ein bit? kann man rechnen bit=sekunde/baud?

Stoneman
08.03.2005, 14:27
nimm einfach den Kehrwert von der Bauszahl, dann hast du die Zeit für ein bit, wenn ich mich nicht verrechnet habe, denn 1baud = 1 bit/1 sekunde

DavidN
09.03.2005, 08:21
danke, ich das war alles was ich wissen wollte \:D/

David