Elnézést, lehet nem ide tartozik, de nem tudtam mihez forduljak a problémámmal.
Bluetoothon keresztül szeretném vezérelni az Arduino-m. Nem is volt semmi probléma. Az Arduinora egy egyszerű négy pin-es bluetooth panelt csatlakoztattam, a gépemre pedig bedugtam az usb sticket. Letöltöttem a TeraTerm 4.80-at amivel tökéletesen tudtam kezelni a robotot.
Most jön a de. A TeraTerm nem kezel egyszerre több billentyűlenyomást, így az autómmal (mert hogy távirányítású autóról van szó) nem tudtam egyszerre kanyarodni és gázt adni. Mivel Java-ban eléggé otthon vagyok elhatároztam, hogy csinálok egy saját programot. Ennek az az előnye is lenne, hogy ki tudnám jelezni az autó szenzorainak állapotát stb. Itt kezdődnek a problémák.
A Sun még régebben kivette az alap Java csomagból a soros kommunikáció támogatását, így külön kell letölteni hozzá egy könyvtárat. Mivel 64 bites Windows-ra úgy tudom csak az RxTx nevű könyvtár működik, ezért ezt töltöttem le. Pontosan a pre-release 2.2-es verzióját (a programom, futása elején kiírja, hogy a könyvtár csak 2.1-es, a native fájlok pedig 2.2-esek, pedig azt használom ami a letöltésben volt). A lentebb található Java programom USB-n keresztül tökéletesen működik. Kiírja az észlelt portokat, csatlakozik az Arduinohoz és mindkét irányban sikeres a kommunikáció. A problémám, hogy a program nem észleli a bluetooth portot. Az bluetooth stick portja COM8, ezt a program látja, vizsont az arduino bluetooth portját(COM7) nem látja. A TeraTerm mindkét portot tökéletesen látja és ha kapcsolódok vele az Arduino-hoz, az én programom is látja a COM7-es portot persze nem tud csatlakozni hozzá, mivel a TeraTerm már csatlakozott.
Remélem már találkozott valaki ugyanezzel a problémával és tud segíteni
Kód: Egész kijelölése
package fb.bluecom;
import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.UnsupportedCommOperationException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
public class BlueCom implements Runnable
{
public static BlueCom instance;
public static void main(String[] args)
{
new Thread(new BlueCom(), "BlueCom").start();
}
public static String translateCommPortType(int type)
{
switch(type)
{
case CommPortIdentifier.PORT_I2C:
return "I2C";
case CommPortIdentifier.PORT_PARALLEL:
return "Parallel";
case CommPortIdentifier.PORT_RAW:
return "Raw";
case CommPortIdentifier.PORT_RS485:
return "RS485";
case CommPortIdentifier.PORT_SERIAL:
return "Serial";
default:
return "unknown";
}
}
public List<String> names, owners, types;
public List<SerialStream> streams;
public boolean isRunning;
public Logger logger;
public BlueCom()
{
instance = this;
this.names = new ArrayList<String>();
this.owners = new ArrayList<String>();
this.types = new ArrayList<String>();
this.streams = new ArrayList<SerialStream>();
this.logger = new Logger();
}
public void discover()
{
this.logger.println("Discovering...");
Enumeration<CommPortIdentifier> portEnum = CommPortIdentifier.getPortIdentifiers();
this.names.clear();
this.owners.clear();
this.types.clear();
while(portEnum.hasMoreElements())
{
CommPortIdentifier identifier = portEnum.nextElement();
this.names.add(identifier.getName());
this.owners.add(identifier.getCurrentOwner());
this.types.add(translateCommPortType(identifier.getPortType()));
this.logger.println("Discovered device:");
this.logger.println("\tPort: "+this.names.get(this.names.size()-1));
this.logger.println("\tType: "+this.types.get(this.types.size()-1));
this.logger.println("\tOwner: "+this.owners.get(this.owners.size()-1));
}
this.logger.println("Discovering finished!");
}
public void connect(String name, int baudrate) throws PortInUseException, NoSuchPortException, UnsupportedCommOperationException
{
this.logger.println("Connecting to "+name+" with baud: "+baudrate);
this.streams.add(new SerialStream(name, baudrate));
this.logger.println("Connected!");
}
public void disconnect(int id)
{
this.logger.println("Disconnecting from "+this.streams.get(id).port.getName());
this.streams.get(id).port.close();
this.streams.remove(id);
this.logger.println("Disconnected!");
}
@Override
public void run()
{
try
{
this.isRunning = true;
this.discover();
this.connect("COM6", 9600);
new Thread("BlueComReceive")
{
@Override
public void run()
{
while(isRunning)
{
try
{
for(int i = 0; i < streams.size(); i++)
{
if(streams.get(i).available() > 0)
System.out.print(streams.get(i).readAll());
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
}.start();
while(this.isRunning)
{
while(System.in.available() == 0);
String str = "";
while(System.in.available() > 0)
str += (char)System.in.read();
for(int i = 0; i < this.streams.size(); i++)
this.streams.get(i).print(str);
if(str.contains("exit"))
this.isRunning = false;
}
this.disconnect(0);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}