Цель проекта получить приложение которое будет отображать текущее местоположение (ноутбук Windows с подключенным arduino)
Закупившись всем необходимым обнаружил досадную вещь отстутствие проводов мама-папа, так что Вам я думаю удастся соденить более удачно.
Подключение - Мануал по GPS bee Подключение как на фото VCC - 3.3V, TX - 3, RX - 4, GND - GND.
Далее если не стоит: драйвер Arduino, java Development Kit, NetBeans 7.3 бибилиотека для java RXTXcomm
Подключаем Arduino UNO R3. Создаем новый проект в NetBeans, бросаем кнопки, текстовое поле, подключаем библиотеку с последнем могут возникнуть сложности.
Я в папке с проектом создал подпапку lib, туда бросил rxtxcomm.jar и добавил его в библиотеку. А папку lib в исходные файла проекты (в свойствах проекта). dll бросил в папку с Java C:\Program Files\Java\jre7\bin
код:
package GPSinfo;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.CommPort;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.UnsupportedCommOperationException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DateFormat;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.Date;
import java.text.SimpleDateFormat;
import java.util.Enumeration;
import java.util.TimeZone;
public class GUI_gps extends javax.swing.JFrame {
public GUI_gps() {
initComponents();
}
private void initComponents() {
jButton1 = new javax.swing.JButton();
jButton2 = new javax.swing.JButton();
choice1 = new java.awt.Choice();
jScrollPane1 = new javax.swing.JScrollPane();
jTextPane1 = new javax.swing.JTextPane();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowOpened(java.awt.event.WindowEvent evt) {
formWindowOpened(evt);
}
});
jButton1.setText("выход");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
jButton2.setText("старт");
jButton2.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton2ActionPerformed(evt);
}
});
Enumeration CommID = CommPortIdentifier.getPortIdentifiers();
while(CommID.hasMoreElements()){
CommPortIdentifier CurrComm = (CommPortIdentifier)CommID.nextElement();
if(CurrComm.getPortType() == CommPortIdentifier.PORT_SERIAL){
choice1.add(CurrComm.getName());
}
}
jTextPane1.setText("Выберете COM порт к которму подключено устройство");
jScrollPane1.setViewportView(jTextPane1);
org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.addContainerGap(38, Short.MAX_VALUE)
.add(choice1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(22, 22, 22)
.add(jButton2)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(jButton1)
.addContainerGap())
.add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
.add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 58, Short.MAX_VALUE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(jButton1)
.add(jButton2))
.add(choice1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.addContainerGap())
);
pack();
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
System.exit(0);
}
private void formWindowOpened(java.awt.event.WindowEvent evt) {
}
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
try {
jTextPane1.setText("загружаем");
String portName=choice1.getSelectedItem();
jTextPane1.setText("Подключение к порту "+portName);
CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
jTextPane1.setText("подключено");
if ( portIdentifier.isCurrentlyOwned() )
{
jTextPane1.setText("Ошибка: порт занят.");
}
else
{
jTextPane1.setText("ожидаем ответа от устройства.");
CommPort commPort = null;
try {
commPort = portIdentifier.open(this.getClass().getName(),2000);
} catch (PortInUseException ex) {
jTextPane1.setText("Ошибка: порт не найден [PortInUseException].");
Logger.getLogger(GUI_gps.class.getName()).log(Level.SEVERE, null, ex);
}
if ( commPort instanceof SerialPort )
{
SerialPort serialPort = (SerialPort) commPort;
try {
serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
} catch (UnsupportedCommOperationException ex) {
jTextPane1.setText("Ошибка: порт не найден [UnsupportedCommOperationException].");
Logger.getLogger(GUI_gps.class.getName()).log(Level.SEVERE, null, ex);
}
InputStream in = null;
try {
in = serialPort.getInputStream();
} catch (IOException ex) {
jTextPane1.setText("Ошибка: порт не найден [IOException].");
Logger.getLogger(GUI_gps.class.getName()).log(Level.SEVERE, null, ex);
}
(new Thread(new SerialReader(in))).start();
}
else
{
System.out.println("Ошибка: Порт не является COM.");
}
}
} catch (NoSuchPortException ex) {
jTextPane1.setText("Ошибка: порт не найден.");
Logger.getLogger(GUI_gps.class.getName()).log(Level.SEVERE, null, ex);
}
}
public class SerialReader implements Runnable
{
InputStream in;
public SerialReader ( InputStream in )
{
this.in = in;
}
@Override
public void run ()
{
byte[] buffer = new byte[1024];
int len;
String GPSstr="";
String tmpstr;
int status = 0; // 0 - ожидание $ 1 - ожидание $GPRMC 2 - ожидание конца строки
try
{
Date d = new Date();
DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
df.setTimeZone(TimeZone.getTimeZone("EAT"));
String customerDate = df.format(d);
FileOutputStream output;
output = new FileOutputStream("log"+customerDate+".txt");
jTextPane1.setText("Создан лог файл: \r\n log"+customerDate+".txt");
while (( len = this.in.read(buffer)) > -1 )
{
tmpstr = new String(buffer,0,len);
if (status==0) {
if (tmpstr.indexOf("$")>0) {
status=1;
}
}
if (status==1) { // если есть $ начинаем сохранять строку
GPSstr = GPSstr + tmpstr;
if (GPSstr.length() > 5000){status = 0; GPSstr=""; continue;}
if (GPSstr.indexOf("$GPRMC")>0) { // если строка начинается с $GPRMC или содержит обрубаем ее
GPSstr = GPSstr.substring(GPSstr.indexOf("$GPRMC"),GPSstr.length());
status = 2;
tmpstr = "";
}
}
if (status==2) {
GPSstr = GPSstr + tmpstr; // продолжаем набирать строку из СОМ порта
if (GPSstr.length() > 5000){status = 0; GPSstr=""; continue;}
if (GPSstr.indexOf("\r\n")>0) {
GPSstr = GPSstr.substring(0,GPSstr.indexOf("\r\n")-1);
String[] arrGPS = GPSstr.split(",");
String time;
time = arrGPS[1];
if (time.length()>0){
String hh = time.substring(0,2);
String mm = time.substring(2,4);
String ss = time.substring(4,6);
String Ncoord = arrGPS[3];
String Ecoord = arrGPS[5];
String InfoGPS = "Время: "+ hh +":"+ mm +":"+ ss + " \r\n координаты \r\n " + Ncoord + " N, " + Ecoord + " E";
String logGPS = "Время: "+ hh +":"+ mm +":"+ ss + " координаты " + Ncoord + " N, " + Ecoord + " E \r\n";
jTextPane1.setText(InfoGPS);
output.write(logGPS.getBytes());
GPSstr="";
status=0;
}else{
jTextPane1.setText("Нет соединения со спутниками.");
GPSstr="";
status=0;
}
}
}
}
output.close();
} catch (Exception ex) {
jTextPane1.setText("Ошибка: не удается создать лог файл.");
Logger.getLogger(GUI_gps.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void String(byte[] buffer, int i, int len) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}
/** */
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
GUI_gps gui = new GUI_gps();
gui.setVisible(true);
}
});
}
// Variables declaration - do not modify
private java.awt.Choice choice1;
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextPane jTextPane1;
// End of variables declaration
}
Компилируем собираем, получаем следущий результат:
П.С. Крайне понравились статьи на сайте Трезвого практика.