Как передать данные на последовательный порт? - PullRequest
9 голосов
/ 15 ноября 2011

Я знаю, что в J2ME CommConnection - это соединение, используемое при работе с serial port.Я знаю, что есть методы openInputStream и openOutputStream, но на самом деле я не знаю, как передать данные из моего MIDLet в COM-порт (USB-порт, в который вставлен кабель телефона, телефон Alcatel OT-806D).Например, я хочу отправить текст «Hello world».Как этого добиться?

Вот коды:

J2ME:

import java.io.IOException;
import java.io.OutputStream;
import javax.microedition.io.CommConnection;
import javax.microedition.io.Connector;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.midlet.*;

public class SerialPortMidlet extends MIDlet implements CommandListener, Runnable {
    private Command upload = new Command("upload", Command.SCREEN, 0);
    private Command exit = new Command("exit", Command.SCREEN, 1);
    private Form f = new Form("test serial port");
    private Thread uploadThread;
    private CommConnection com;
    private OutputStream os;
    public SerialPortMidlet()
    {
        f.addCommand(upload);
        f.addCommand(exit);
        f.setCommandListener(this);
        uploadThread = new Thread(this);
    }
    public void startApp() {
        Display.getDisplay(this).setCurrent(f);
    }
    public void pauseApp() {
    }
    public void destroyApp(boolean unconditional) {
        notifyDestroyed();
    }
    public void commandAction(Command c, Displayable d) {
        if (c == upload)
        {
            uploadThread.start();
            f.removeCommand(upload);
        }
        else if (c == exit)
        {
            if (uploadThread.isAlive())
            {
                uploadThread.interrupt();
                try {
                    uploadThread.join();
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
            }
            destroyApp(true);
        }
    }
    public void run() {
        try
        {
            String s = new String("andrana mandefa lavaka");
            com = (CommConnection) Connector.open("comm:COM4");
            os = com.openOutputStream();
            os.write(s.getBytes());
            os.close();
        } 
        catch (IOException ex)
        {
            ex.printStackTrace();
        }
    }
}

J2SE: (Eclipse)

import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class TwoWaySerialComm 
{
    public TwoWaySerialComm()
    {
        super();
    }
    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 commPort = portIdentifier.open(this.getClass().getName(),2000);

            if ( commPort instanceof SerialPort )
            {
                SerialPort serialPort = (SerialPort) commPort;
                serialPort.setSerialPortParams(57600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);

                InputStream in = serialPort.getInputStream();
                OutputStream out = serialPort.getOutputStream();

                (new Thread(new SerialWriter(out))).start();

                serialPort.addEventListener(new SerialReader(in));
                serialPort.notifyOnDataAvailable(true);

            }
            else
            {
                System.out.println("Error: Only serial ports are handled by this example.");
            }
        }     
    }
    public static class SerialReader implements SerialPortEventListener 
    {
        private InputStream in;
        private byte[] buffer = new byte[1024];

        public SerialReader ( InputStream in )
        {
            this.in = in;
        }

        public void serialEvent(SerialPortEvent arg0) {
            int data;

            try
            {
                int len = 0;
                while ( ( data = in.read()) > -1 )
                {
                    if ( data == '\n' ) {
                        break;
                    }
                    buffer[len++] = (byte) data;
                }
                System.out.print(new String(buffer,0,len));
            }
            catch ( IOException e )
            {
                e.printStackTrace();
                System.exit(-1);
            }             
        }

    }
    public static class SerialWriter implements Runnable 
    {
        OutputStream out;

        public SerialWriter ( OutputStream out )
        {
            this.out = out;
        }

        public void run ()
        {
            try
            {                
                int c = 0;
                while ( ( c = System.in.read()) > -1 )
                {
                    this.out.write(c);
                }                
            }
            catch ( IOException e )
            {
                e.printStackTrace();
                System.exit(-1);
            }            
        }
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try
        {
            (new TwoWaySerialComm()).connect("COM1");
        }
        catch ( Exception e )
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

Я запускаю программу J2SE, вставил кабель мобильного телефона в компьютер (в разъем USB), щелкнул команду upload в приложении J2ME, но на экране вывода ничего нетзатмения!

Так в чем же проблема?

Я запускаю этот код J2SE, чтобы определить порт, к которому подключен кабель телефона:

import gnu.io.*;
public class SerialPortLister {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        listPorts();
    }
    private static void listPorts()
    {
        @SuppressWarnings("unchecked")
        java.util.Enumeration<CommPortIdentifier> portEnum = CommPortIdentifier.getPortIdentifiers();
        while ( portEnum.hasMoreElements() ) 
        {
            CommPortIdentifier portIdentifier = portEnum.nextElement();
            System.out.println(portIdentifier.getName()  +  " - " +  getPortTypeName(portIdentifier.getPortType()) );
        }        
    }
    private static String getPortTypeName ( int portType )
    {
        switch ( portType )
        {
            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 type";
        }
    }
}

И он показывает COM4потому что когда я отсоединяю кабель, отображаются только COM1 и LPT1.

Так в чем проблема?

1 Ответ

1 голос
/ 16 ноября 2011

Ваш телефон, по-видимому, хорошо распознается компьютером, подключенным к виртуальному COM-порту 4. Однако для меня неясно, следует ли использовать протокол COM-порта на стороне телефона для связи с компьютером.Вполне возможно, что на телефоне просто есть буфер, который после заполнения будет доставлен через USB-порт.

Я не знаю ваш телефон, но я уже запрограммировал микроконтроллер.Там я никогда не использовал протокол COM-порта и мне удалось связаться с компьютером с драйвером виртуального COM-порта.

Чтобы лучше понять мою точку зрения, вы, вероятно, можете обратиться к документации по микроконтроллеру, имеющемуся на вашем телефоне.

...