Avatar billede majbom Novice
09. juni 2005 - 13:33 Der er 8 kommentarer og
1 løsning

seriel kommunikation

hejsa experter ;)

jeg sidder og skal skrive til og modtage fra en microprocessor via serielporten med at java-program...

jeg har fået lidt kode af en ven, men jeg kan ikke se mig ud af det, der er meget og jeg synes ikke at det giver ret meget mening. jeg er lidt inde i java, men ikke ret meget.

kræver det virkelig meget kode for at sende én enkelt karakter ud på serielporten?

evt nogle der har et lille eksempel, eller et link til en guide eller lignende?

på forhånd mange tak...
Avatar billede arne_v Ekspert
09. juni 2005 - 13:45 #1
Avatar billede majbom Novice
09. juni 2005 - 14:17 #2
kiggede i dokumentationen til API'en "comm" ;)
Avatar billede snoop_one Nybegynder
10. juni 2005 - 00:11 #3
Understående skulle kunne sende for dig...

public class SimpleWrite {
    static String SERIALPORT = "COM1";
    static byte data = 0x02;
    static Enumeration portList;
    static CommPortIdentifier portId;
    static SerialPort serialPort;
    static OutputStream outputStream;

    public static void main(String[] args) {
        portList = CommPortIdentifier.getPortIdentifiers();
        System.out.println("Serial Porte fundet:");
        while (portList.hasMoreElements()) {
            portId = (CommPortIdentifier) portList.nextElement();
            //check if we have a serial port
            if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
                System.out.println(portId.getName());
                //check if the serial port is the one we want
                if (portId.getName().equals(SERIALPORT)) {
                    try {
                        serialPort = (SerialPort) portId.open(
                                "SimpleWriteApp", 2000);
                        outputStream = serialPort.getOutputStream();
                       
                        //send the data
                        outputStream.write(data);
                        //close the port for other apps to use
                        outputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    } catch (PortInUseException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}
Avatar billede snoop_one Nybegynder
10. juni 2005 - 00:20 #4
Hvis du gerne vil sætte hastigheden op og paritet så skal du indsætte følgende over outputStream.write(data):
try {
    serialPort.setSerialPortParams(9600,
    SerialPort.DATABITS_8,
    SerialPort.STOPBITS_1,
    SerialPort.PARITY_NONE);
} catch (UnsupportedCommOperationException e) {
    e.printStackTrace();
}
Avatar billede snoop_one Nybegynder
10. juni 2005 - 00:40 #5
Understående kode kan du bruge til at modtage med... Den køre "interrupt" styret dvs. du behøver ikke at polle den hele tiden. Når data kommer ind på porten bliver serialEvent kaldt som tager sig af data'en.

public class SimpleRead implements SerialPortEventListener {
 
  private static final String SERIALPORT = "COM1";
 
  private CommPortIdentifier portId;
  private Enumeration portList;
  private InputStream inputStream;
  private SerialPort serialPort;
 
 
  public static void main(String[] args) {
      new SimpleRead();
    }
 
  public SimpleRead(){
      portList = CommPortIdentifier.getPortIdentifiers();
        while (portList.hasMoreElements()) {
            portId = (CommPortIdentifier) portList.nextElement();
            if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
                if (portId.getName().equals(SERIALPORT)) {
               
              try {
                    serialPort = (SerialPort) portId.open("SimpleReadApp", 2000);
               
                    inputStream = serialPort.getInputStream();
               
                    serialPort.addEventListener(this);
                    serialPort.notifyOnDataAvailable(true);
                    //set config.
                    serialPort.setSerialPortParams(9600,
                        SerialPort.DATABITS_8,
                        SerialPort.STOPBITS_1,
                        SerialPort.PARITY_NONE);
                } catch (Exception e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
                }
                }
            }
        }
  }
   
    public void serialEvent(SerialPortEvent event) {
        switch(event.getEventType()) {
        case SerialPortEvent.BI:
        case SerialPortEvent.OE:
        case SerialPortEvent.FE:
        case SerialPortEvent.PE:
        case SerialPortEvent.CD:
        case SerialPortEvent.CTS:
        case SerialPortEvent.DSR:
        case SerialPortEvent.RI:
        case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
            break;
        case SerialPortEvent.DATA_AVAILABLE:
           
        //data is available - read it!
        byte[] readBuffer = new byte[20];

            try {
                while (inputStream.available() > 0) {
                    int numBytes = inputStream.read(readBuffer);
                }
                System.out.print(new String(readBuffer));
            } catch (IOException e) {
            //TODO Auto-generated catch block
            e.printStackTrace();
            }
            break;
        }
    }
}
Avatar billede majbom Novice
13. juni 2005 - 10:04 #6
takker for svarene, men kan det ikke passe at det er det samme kode der står i dokumentationen til API'en "javax.comm"?
Avatar billede snoop_one Nybegynder
14. juni 2005 - 23:46 #7
Jo det skulle det vist være, er dog ikke helt sikker da jeg selv benytter rxtx serial parallel libs fra http://www.rxtx.org/
Avatar billede majbom Novice
15. juni 2005 - 12:41 #8
arne, vil du ikke have de 50p?
Avatar billede majbom Novice
22. juni 2005 - 14:35 #9
nå, så nupper jeg dem selv igen :P
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester