Laddar jag hem och installerar drivrutiner för min FTDI-adapter fås 2 drivrutiner.
Windows plockar VCP-drivrutinen och sammanbinder den med en inställbar port i enhetshanteraren.
Avmarkeras VCP så kommer fortfarande D2XX.drivrutinen att vara i funktion och då den enda som finna om jag förstår det hela riktigt.
"FTDI provides DLL and virtual COM port (VCP) application interfaces to its drivers."
Så jag håller på med att koda ett program för att ta reda på mer och som kanske mynnar ut i något användbart.
Som synes fås -1 som resultat när ansluten COM-port skrivs ut då VCP är inaktiverad.
D2XX är typ en direktkontakt med chippet på något sätt.
https://www.ftdichip.com/Support/Docume ... 00071).pdf
VCP_Active_D2XX_EH.jpg
VCP_Active_D2XX.jpg
VCP_Not_Active_D2XX_EH.jpg
VCP_Not_Active_D2XX.jpg
Och här är java-programmet....
GUI
Kod: Markera allt
package start;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import d2xx.D2XX;
import net.sf.yad2xx.FTDIException;
import java.awt.Font;
import java.awt.Color;
import javax.swing.border.BevelBorder;
import threadController.ThreadController;
import javax.swing.JTextArea;
import java.awt.Dimension;
public class D2XXGUI {
private static final int NUMBEROFTHREADS = 1; // Antalet objekt som ska köras som en tråd
private JFrame frmDxxFtrSoftware;
private JPanel panel;
private JButton btnExitButton;
private JButton btnCloseDxxDevice;
private JButton btnOpenDxxDevice;
private Object tc0 = null; // objekt som ska köras av trådkontrollern
private static ThreadController[] threadController; // varje tråd har en trådkontroller
private static Thread[] threadControllerThread; // varje trådkontroller körs som en tråd
private static JTextArea textArea_0;
private JButton btnStart;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
D2XXGUI window = new D2XXGUI(); // Ett fönsterbaserat GUI
window.frmDxxFtrSoftware.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
* @throws InterruptedException
*/
public D2XXGUI() throws InterruptedException {
initialize(); // Konstruera GUI
setUpThreadControllers();
}
private void setUpThreadControllers() {
tc0 = new D2XX(); // skapa ett objekt
threadController = new ThreadController[D2XXGUI.NUMBEROFTHREADS]; // skapa en array att hålla ett antal trådkontroller
threadControllerThread = new Thread[D2XXGUI.NUMBEROFTHREADS]; // skapa en array som håller ett antal trådar
threadController[0] = new ThreadController(tc0); // skapa en trådkontrollerobjekt för objektet EchoD2xx
// threadControllerThread[0] = new Thread (threadController[0]); // skapa en tråd av varje trådkontroller
// threadControllerThread[0] håller nu en tråd av en trådkontroller som ännu inte startats
}
/*
* Tar emot text att addera till en textarea
*/
public static void addTextTA(String text) {
textArea_0.append(text + "\n");
}
/*
* Tömmer textarean på innehåll
*/
public static void eraseTextFromTextArea() {
textArea_0.setText(null);
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frmDxxFtrSoftware = new JFrame();
frmDxxFtrSoftware.setMaximumSize(new Dimension(800, 600));
frmDxxFtrSoftware.setFont(new Font("BankGothic Md BT", Font.BOLD, 12));
frmDxxFtrSoftware.setTitle("D2XX FT232R SOFTWARE");
frmDxxFtrSoftware.setResizable(false);
frmDxxFtrSoftware.setBackground(new Color(0, 0, 0));
frmDxxFtrSoftware.getContentPane().setBackground(new Color(0, 0, 0));
frmDxxFtrSoftware.getContentPane().setForeground(new Color(254, 254, 0));
frmDxxFtrSoftware.setBounds(100, 100, 707, 545);
frmDxxFtrSoftware.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frmDxxFtrSoftware.getContentPane().setLayout(null);
panel = new JPanel();
panel.setBackground(new Color(47, 79, 79));
panel.setBounds(10, 415, 671, 79);
panel.setLayout(null);
frmDxxFtrSoftware.getContentPane().add(panel);
//====================================================================================================== START-knapp
btnStart = new JButton("START");
btnStart.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) { // status = true om objektets run() körs = objektet tråd har startats
if(!((D2XX)tc0).getStatus()) { // om ingen tråd ännu startats av trådkontrollern så
threadControllerThread[0] = new Thread (threadController[0]); // skapa en tråd utav trådkontrollern och
threadControllerThread[0].start(); // starta den trådkontrollern
} // den här trådkontrollern körs nu som en tråd
}
});
btnStart.setFont(new Font("Trebuchet MS", Font.PLAIN, 15));
btnStart.setBorder(new BevelBorder(BevelBorder.RAISED, null, null, null, null));
btnStart.setBackground(Color.WHITE);
btnStart.setBounds(10, 11, 120, 23);
panel.add(btnStart);
//====================================================================================================== OPEN D2xxx Device-knapp
// Hittar D2XX ansluten enheten till COM-port och öppnar enheten för datatrafik
btnOpenDxxDevice = new JButton("OPEN D2XX Device");
btnOpenDxxDevice.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
if(((D2XX)tc0).getStatus()) {
try {
((D2XX)tc0).D2xxSetUp();
} catch (FTDIException e1) {
e1.printStackTrace();
}
}
}
});
btnOpenDxxDevice.setFont(new Font("Trebuchet MS", Font.PLAIN, 15));
btnOpenDxxDevice.setBorder(new BevelBorder(BevelBorder.RAISED, null, null, null, null));
btnOpenDxxDevice.setBackground(Color.WHITE);
btnOpenDxxDevice.setBounds(140, 11, 167, 23);
panel.add(btnOpenDxxDevice);
//====================================================================================================== CLOSE D2xxx Device-knapp
// Stänger öppnad anslutning
btnCloseDxxDevice = new JButton("CLOSE D2XX Device");
btnCloseDxxDevice.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
if(((D2XX)tc0).getStatus()) {
((D2XX)tc0).closeD2xx();
}
}
});
btnCloseDxxDevice.setFont(new Font("Trebuchet MS", Font.PLAIN, 15));
btnCloseDxxDevice.setBorder(new BevelBorder(BevelBorder.RAISED, null, null, null, null));
btnCloseDxxDevice.setBackground(Color.WHITE);
btnCloseDxxDevice.setBounds(140, 48, 167, 23);
panel.add(btnCloseDxxDevice);
//====================================================================================================== EXIT-knapp
// Avslutar programmet
btnExitButton = new JButton("EXIT");
btnExitButton.setBorder(new BevelBorder(BevelBorder.RAISED, null, null, null, null));
btnExitButton.setBackground(new Color(255, 255, 255));
btnExitButton.setFont(new Font("Trebuchet MS", Font.PLAIN, 15));
btnExitButton.setBounds(10, 48, 120, 23);
btnExitButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
System.out.println("EXIT");
System.out.println("Avslutar " + threadController[0].toString());
System.exit(0);
}
});
panel.add(btnExitButton);
//========================================================================== Textarea att printa info i
textArea_0 = new JTextArea();
textArea_0.setBackground(new Color(253, 245, 230));
textArea_0.setForeground(new Color(0, 0, 0));
textArea_0.setFont(new Font("Monospaced", Font.ITALIC, 14));
textArea_0.setRows(50);
textArea_0.setBounds(10, 11, 671, 393);
frmDxxFtrSoftware.getContentPane().add(textArea_0);
}
}
Koden som utför uppkoppling och utskrift...
Kod: Markera allt
package d2xx;
import static net.sf.yad2xx.FTDIConstants.*;
import net.sf.yad2xx.Device;
import net.sf.yad2xx.FTDIException;
import net.sf.yad2xx.FTDIInterface;
import start.D2XXGUI;
/*
* Om COM-porten där FTDI-adaptern är ansluten är konfigurerad med D2XX så
* är den dold i windows
*/
public class D2XX implements Runnable {
private boolean stopSignal;
private volatile static boolean status;
// Get available FTDI Devices
private Device dev;
/*
* Konstruktor
*/
public D2XX() {
D2XX.status = false;
this.stopSignal = false;
dev= null;
}
/*
* Ett objekt av klassen Echo2xx kör som tråd och när tråden startas
* startar run()
*/
public void run() {
D2XX.status = true;
D2XXGUI.addTextTA(" ========================================================");
D2XXGUI.addTextTA(" Programmet har startat");
D2XXGUI.addTextTA(" ========================================================");
System.out.println(this.getStatus());
}
public boolean getStatus() {
return D2XX.status;
}
public void D2xxSetUp() throws FTDIException {
dev = FTDIInterface.getDevices()[0];
D2XXGUI.eraseTextFromTextArea();
if (!dev.isOpen()) {
// rensa textArea
D2XXGUI.addTextTA(" ========================================================");
D2XXGUI.addTextTA(" Opening device ---> " + dev.getDescription());
D2XXGUI.addTextTA(" ========================================================");
dev.open();
D2XXGUI.addTextTA(" Device connected to COM port: -> " + dev.getComPortNumber());
// dev.setTimeouts(2000, 2000);
D2XXGUI.addTextTA(" Setting -> Baudrate = " + FT_BAUD_9600);;
dev.setBaudRate(FT_BAUD_9600);
D2XXGUI.addTextTA(" Setting -> " + "data bits = " + FT_BITS_8 + ", stop bits = " + FT_STOP_BITS_1 + ", paritet = " + FT_PARITY_NONE);
dev.setDataCharacteristics(FT_BITS_8, FT_STOP_BITS_1, FT_PARITY_NONE);
D2XXGUI.addTextTA(" Setting -> flow control = " + FT_FLOW_NONE);
dev.setFlowControl(FT_FLOW_NONE, (char) 0, (char) 0);
D2XXGUI.addTextTA(" Device name description -> " + dev.getDescription());
D2XXGUI.addTextTA(" Device all description -> " + dev);
D2XXGUI.addTextTA(" Device connected to COM port: -> " + dev.getComPortNumber());
// 48 45 4C 4C 4F = HELLO
/* byte[] data = { (byte)0x48, (byte)0x45, (byte)0x4C, (byte)0x4C, (byte)0x4F };
System.out.println("Sending data");
for (int i = 0; i < 3; i++) {
System.out.println("Sending data");
dev.write(data);
try {
Thread.sleep(1000);
System.out.println("Antal mottagna bytes = " + dev.getStatus().getRxBytes());
}
catch (InterruptedException ie) {}
byte[] input = new byte[5];
dev.read(input);
System.out.println((char)input[0] + " " + (char)input[1]+ " " + (char)input[2]+ " " + (char)input[3]+ " " + (char)input[4]);
} */
}
else {
D2XXGUI.eraseTextFromTextArea();
D2XXGUI.addTextTA(" ========================================================");
D2XXGUI.addTextTA(" Unable to open device. Maybe already open");
D2XXGUI.addTextTA(" Closing it if already open. Try to open it again");
D2XXGUI.addTextTA(" ========================================================");
if(dev.isOpen())
dev.close();
}
}
/*
* Stänger öppnade portar. Kontrolleras ifrån GUI
*/
public void closeD2xx() {
if(dev.isOpen()) {
try {
D2XXGUI.eraseTextFromTextArea();
D2XXGUI.addTextTA(" ========================================================");
D2XXGUI.addTextTA(" Closing device ---> " + dev.getDescription());
D2XXGUI.addTextTA(" ========================================================");
dev.close();
} catch (FTDIException e) {
e.printStackTrace();
}
}
else {
D2XXGUI.eraseTextFromTextArea();
D2XXGUI.addTextTA(" ========================================================");
D2XXGUI.addTextTA(" Nothing to Close!");
D2XXGUI.addTextTA(" ========================================================");
}
}
public Device getDevice() {
return dev;
}
/*
* Metoden startas ifrån GUI.
* Ett försök utförs att skapa en datalinje till en uppkopplad serieport.
* En while-loop snurrar som utför aktiviteter baserat på vad som kontrolleras ifrån GUI.
* While-loopen kan avbrytas ifrån GUI för att koppla ned serieporten och sedan avsluta hela programmet.
*/
public void RunEcho() {
}
/*
* Vid tryck på knappen EXIT i GUI sätts denna stoppflagga
* för att avbryta while-loopen i metoden RunEcho
*/
public void setStopSignal() {
this.stopSignal = true;
}
public boolean getStopSignal() {
return this.stopSignal;
}
public String toString() {
return "EchoD2xx";
}
}
och så trådkontrollern...
Kod: Markera allt
package threadController;
public class ThreadController implements Runnable {
private Object obj;
private Thread objectThread;
private static final int TIMER_INTERVAL = 500;
/*
* Konstruktor
*/
public ThreadController(Object object) {
this.obj = object;
}
public void run() {
objectThread = new Thread( (Runnable) obj); // skapar en ny tråd
objectThread.start();
System.out.println("Trådkontrollern kör nu run");
while(true) {
try {
Thread.sleep(TIMER_INTERVAL);
}
catch(InterruptedException ie) {
objectThread.interrupt();
}
}
}
public String toString() {
return this.obj.toString();
}
}