RXTX i Java
RXTX i Java
Jag är nybörjare på java och försöker på något enkelt sätt skriva till en serieport med RXTX.
Jag har googlat som en galning och har fått igång något exempel-program som kan läsa från serieporten, men att skriva får jag inte till det på något enkelt sätt. Är det någon här som skulle kunna tänka sig att dela med sig av en exempelkod både för att skriva och ta emot data till/från serieport?
Jag hittade en class som heter SerialHelper som känns användbar, men jag vet inte hur jag skall använda den?
Jag började med att försöka få alla serieportar i en array, men jag kommer inte på hur jag skall anropa listSerialPorts() för att det skall bli rätt.
Kan någon hjälpa mig att peka mig i rätt riktning??
Jag använder NetBeans som IDE på en MAC.
Jag har googlat som en galning och har fått igång något exempel-program som kan läsa från serieporten, men att skriva får jag inte till det på något enkelt sätt. Är det någon här som skulle kunna tänka sig att dela med sig av en exempelkod både för att skriva och ta emot data till/från serieport?
Jag hittade en class som heter SerialHelper som känns användbar, men jag vet inte hur jag skall använda den?
Jag började med att försöka få alla serieportar i en array, men jag kommer inte på hur jag skall anropa listSerialPorts() för att det skall bli rätt.
Kan någon hjälpa mig att peka mig i rätt riktning??
Jag använder NetBeans som IDE på en MAC.
Re: RXTX i Java
Har själv aldrig testat men jag har samlat på mig en hel del info.
Det är inte så svårt att söka och hitta något.
http://www.oracle.com/technetwork/java/ ... 41752.html
http://www.javaworld.com/javaworld/jw-0 ... vadev.html
Det är inte så svårt att söka och hitta något.
http://www.oracle.com/technetwork/java/ ... 41752.html
http://www.javaworld.com/javaworld/jw-0 ... vadev.html
Re: RXTX i Java
Tack så mycket för länkarna, dom har jag också hittat, och labbat lite med, men kommer inte så mycket längre. Dessa länkarna är ju inte för RXTX utan för javax.comm, men det skulle väl också vara ok om jag nu skulle få det att fungera.
Protokollet jag skall följa är RS232 om inte detta redan var underförstått
Protokollet jag skall följa är RS232 om inte detta redan var underförstått

Re: RXTX i Java
Nä, den killen fick ju inte själva RXTX biblioteket att funka, men det har jag inget problem med vad jag vet....
Re: RXTX i Java
Kolla om du kan hitta alla portar först.
Kan du lista dom med en programsnutt?
Här är massa projekt med RXTX: http://rxtx.qbang.org/wiki/index.php/Projects
Kan du lista dom med en programsnutt?
Här är massa projekt med RXTX: http://rxtx.qbang.org/wiki/index.php/Projects
Re: RXTX i Java
Jag har använt rxtx och det funkar finfint. Här får du min kod för att skriva och läsa till en serieport. Det finns ingen kod med för
att lista vilka portar som finns men det går väl också på nåt vis antar jag. Läsningen sker "automatiskt" i en egen tråd som lägger in det mottagna
i en LinkedBlockingQueue<String>. Vill man skriva är det bara att anropa write eller writeChar. Tror jag hittade mycket av koden på rxtx hemsida
eller rent av i exempel som var med när jag laddade ner det. Jag kör eclipse numera. Trivs bättre i den än i netbeans faktiskt men jag har å andra
sidan inte jättemycket erfarenhet av någon av dem. Jag bytte när jag skulle testa att programmera lite för android.
Så här gör jag när jag sätter igång porten. Sen kan man skriva med t.ex serial.write("Lite text")
att lista vilka portar som finns men det går väl också på nåt vis antar jag. Läsningen sker "automatiskt" i en egen tråd som lägger in det mottagna
i en LinkedBlockingQueue<String>. Vill man skriva är det bara att anropa write eller writeChar. Tror jag hittade mycket av koden på rxtx hemsida
eller rent av i exempel som var med när jag laddade ner det. Jag kör eclipse numera. Trivs bättre i den än i netbeans faktiskt men jag har å andra
sidan inte jättemycket erfarenhet av någon av dem. Jag bytte när jag skulle testa att programmera lite för android.
Kod: Markera allt
import gnu.io.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.logging.Level;
import java.util.logging.Logger;
public class SerialComm {
private static BlockingQueue<String> serialReceivingQ = new LinkedBlockingQueue<String>();
CommPort commPort;
private static int waitCtr = 0;
private static int statusFlag = 0;
private static String newtxt = "";
public synchronized static int getStatusFlag() {
return statusFlag;
}
public synchronized static void setStatusFlag(int statusFlag) {
SerialComm.statusFlag = statusFlag;
}
void connect(String portName) throws Exception {
CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
if (portIdentifier.isCurrentlyOwned()) {
System.out.println("Error: Port is currently in use");
} else {
commPort = portIdentifier.open(this.getClass().getName(), 2000);
if (commPort instanceof SerialPort) {
SerialPort serialPort = (SerialPort) commPort;
serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
serialPort.enableReceiveTimeout(200);
InputStream in = serialPort.getInputStream();
//OutputStream out = serialPort.getOutputStream();
System.out.println("connect normal");
(new Thread(new SerialReader(in))).start();
//(new Thread(new SerialWriter(out))).start();
} else {
System.out.println("Error: Only serial ports are handled.");
}
}
}
static void setTextReceiver(BlockingQueue<String> receiveQ) {
serialReceivingQ = receiveQ;
}
BlockingQueue<String> getTextReceiver() {
return serialReceivingQ;
}
public static class SerialReader implements Runnable {
InputStream in;
boolean startFlush = true;
int startCtr = 0;
public SerialReader(InputStream in) {
this.in = in;
}
public void run() {
while (XThread.delay(100)) {
int nextchar = 0;
if (startFlush) {
startCtr++;
if (startCtr >= 10) startFlush = false;
}
if (waitCtr>0) waitCtr--;
try {
nextchar = this.in.read();
if (startFlush) nextchar = -1; // Throw away characters when starting up
// System.out.println("nc: "+nextchar);
while (nextchar != -1) {
if ( nextchar == '\n') {
//newtxt += (char) nextchar;
serialReceivingQ.add(newtxt);
System.out.println(newtxt);
newtxt = "";
} else if (nextchar != '\r') {
newtxt += (char) nextchar;
}
nextchar = this.in.read();
if (startFlush) nextchar = -1; // Throw away characters when starting up
}
} catch (IOException ex) {
Logger.getLogger(SerialComm.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
void writeChar(char c) {
if (commPort instanceof SerialPort) {
try {
OutputStream out = commPort.getOutputStream();
out.write(c);
} catch (IOException ex) {
Logger.getLogger(SerialComm.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
void write(String s) {
System.out.println("serial.write "+s);
int l = s.length();
for (int i = 0; i < l; i++) {
writeChar(s.charAt(i));
}
}
public boolean isConnected() {
return commPort instanceof SerialPort;
}
public String getFromQueue() {
return serialReceivingQ.poll();
}
// Wait for response from serial port in timeout seconds. Return null if timeout
public String waitForResponse(int timeout) {
boolean hasTimeout = true;
if (!isConnected()) return null;
if (timeout == 0) hasTimeout = false;
waitCtr = timeout * 10;
do {
if ((waitCtr == 0) && hasTimeout) return null; // Maximum time has passed. Timeout
String s = getFromQueue();
if (s != null) {
waitCtr = 0;
return s;
}
XThread.delay(100);
if (hasTimeout) waitCtr--;
} while (true);
}
}
Kod: Markera allt
serial = new SerialComm();
try {
serial.connect(serialPort);
controllerStatus.connected = true;
} catch (Exception ex) {
System.out.println(serialPort + " kan inte öppnas");
}
Re: RXTX i Java
Tack så mycket för exemplet. Jag har inte testat koden än, utan jag har bara läst igenom och försöker förstå. Men LinkedBlockingQueue<String> är något jag inte har använt innan.
Hur kollar jag om det finns någon seriell data i kön?
Hur hämtar jag den seriella datan?
Hur kollar jag om det finns någon seriell data i kön?
Hur hämtar jag den seriella datan?
Re: RXTX i Java
Anropa bara getFromQueue så får du en sträng tillbaka om det finns nåt att hämta. Annars kommer null. Men du behöver inte använda
linkedblockingqueue heller. Du kan göra så som de har gjort i SerialHelper. Det är bara att ta bort SerialReader-tråden.
linkedblockingqueue heller. Du kan göra så som de har gjort i SerialHelper. Det är bara att ta bort SerialReader-tråden.
Re: RXTX i Java
Va tvungen att jobba hela dagen (sitter på jobbet nu) så jag har inte hunnit att kolla på det mer....
Re: RXTX i Java
Det känns som jag kanske måste öva lite mer på java innnan jag får det att funka... Detdär med trådar "hoppade jag nästan över" när jag läste om Java.... Men jag försöker java just för att jag vill få igång ett program för att communicera med rs232 (arduino i detta fallet) 

Re: RXTX i Java
Det är arduino jag har kommunicerat med också. Tydligen så använder arduinomiljön också rxtxbiblioteket för sin kommunikation. Och som sagt, trådar behöver du inte för kommunikationen. Men jag måste säga att det är väldigt användbart när man kommunicerar med en arduino t.ex. Det kräver lite tänkande iofs men det är ju bara roligt.
Re: RXTX i Java
JAAAA, nu funkar det... men nu har jag stött på ett nytt problem, men det kanske jag kan få hjälp med här också 
Jag vill testa och skicka serial.write("Test") genom att trycka på en knapp. På arduinon har jag ett program som skickar tillbaka vad jag har skickat till den.
I NetBeans skapar jag en Desktop Application som jag kallar för "SerialSwing".
I Main i SerialSwingApp.java så lägger jag in följande kod för att starta porten:
Sedan gör jag en knapp i SerialSwingView.java som heter jButton1 och i jButton1ActionPerformed försöker jag med:
men det funkar inte. "Can't find the Symbol serial" får jag till svar 
Hur anropar jag serial från SerialSwingView.java?

Jag vill testa och skicka serial.write("Test") genom att trycka på en knapp. På arduinon har jag ett program som skickar tillbaka vad jag har skickat till den.
I NetBeans skapar jag en Desktop Application som jag kallar för "SerialSwing".
I Main i SerialSwingApp.java så lägger jag in följande kod för att starta porten:
Kod: Markera allt
SerialComm serial = new SerialComm();
String serialPort="/dev/tty.usbserial-A600bLJg";
try {
serial.connect(serialPort);
} catch (Exception ex) {
System.out.println(serialPort + " kan inte öppnas");
}
Kod: Markera allt
serial.write("Test");

Hur anropar jag serial från SerialSwingView.java?