web-dev-qa-db-ja.com

AndroidでCOM /シリアルポートにデータを読み書きする方法は?

Androidを使用してデバイスのCOMポートにデータを読み書きする必要があります。そのためにjavax.commパッケージを使用していますが、apkファイルをインストールすると、デバイスのポートが表示されないため、許可が与えられます。マニフェストファイルに追加する必要がありますか?

13
piks

問題はオペレーティングシステムの問題です。 Androidは内部でLinuxを実行しており 、LinuxはシリアルポートをWindowsとは異なる方法で処理します。 javax.commには、Androidデバイスにインストールできないwin32com.dllドライバーファイル も含まれています。あなたがやろうとしていることを達成する方法を見つけた場合、Linux環境で実際に「COM」ポートを探すことはできません。シリアルポートは別の名前になります。

 Windows Com Port   Linux equivalent  
      COM 1           /dev/ttyS0  
      COM 2           /dev/ttyS1
      COM 3           /dev/ttyS2 

したがって、仮に、アイデアが機能する場合は、これらの名前を探す必要があります。

幸いにも、Androidには、USBデバイスとのインターフェースが用意されています(パラレルポートやRS-232ポートではなく、接続したいと思います)。これを行うには、デバイスを USBホストとしてセットアップします。 以下は、実行する操作です。

  1. USBManagerを取得します。
  2. デバイスを見つけます。
  3. USBInterface および USBEndpoint を取得します。
  4. 接続を開きます。
  5. データを転送します。

これがあなたのやり方の大まかな見積もりです。もちろん、あなたのコードは物事を行うためのより成熟した方法を持っています。

String YOUR_DEVICE_NAME;
byte[] DATA;
int TIMEOUT;

USBManager manager = getApplicationContext().getSystemService(Context.USB_SERVICE);
Map<String, USBDevice> devices = manager.getDeviceList();
USBDevice mDevice = devices.get(YOUR_DEVICE_NAME);
USBDeviceConnection connection = manager.openDevice(mDevice);
USBEndpoint endpoint = device.getInterface(0).getEndpoint(0);

connection.claimInterface(device.getInterface(0), true);
connection.bulkTransfer(endpoint, DATA, DATA.length, TIMEOUT);

読書を楽しむための追加資料: http://developer.Android.com/guide/topics/connectivity/usb/Host.html

21
gobernador

私は専門家ではありませんが、シリアルRS-232ポートを接続するか、シリアルポートを開き、UsbManagerを介してデバイスを見つけることができないすべての人にとって、このようなアプローチを使用してすべてのデバイスを見つけることができます

mDrivers = new Vector<Driver>();
LineNumberReader r = new LineNumberReader(new FileReader("/proc/tty/drivers"));
        String l;
        while ((l = r.readLine()) != null) {
            String drivername = l.substring(0, 0x15).trim();
            String[] w = l.split(" +");
            if ((w.length >= 5) && (w[w.length - 1].equals("serial"))) {
                mDrivers.add(new Driver(drivername, w[w.length - 4]));
            }
        }

すべてのドライバーを見つけた後、すべてのドライバーを繰り返してすべてのデバイスを取得します。

mDevices = new Vector<File>();
            File dev = new File("/dev");

            File[] files = dev.listFiles();

            if (files != null) {
                int i;
                for (i = 0; i < files.length; i++) {
                    if (files[i].getAbsolutePath().startsWith(mDeviceRoot)) {
                        Log.d(TAG, "Found new device: " + files[i]);
                        mDevices.add(files[i]);
                    }
                }
            }

これは、2つのメンバー変数を持つドライバークラスコンストラクターです。

public Driver(String name, String root) {
        mDriverName = name;
        mDeviceRoot = root;
    }

シリアルポートを開くにはAndroid Serial Port Apiを使用して、デバイスでシリアルポートを開いて書き込むことができます(デバイスパスとボーレートを知っている必要があります。デバイスはttyMt2で、ボーレートが必要です。 96000)

 int baurate = Integer.parseInt("9600");
 mSerialPort = new SerialPort(mDevice.getPath(), baurate, 0);
        mOutputStream = mSerialPort.getOutputStream();
        byte[] bytes = hexStr2bytes("31CE");
        mOutputStream.write(bytes);

このコードに時間を浪費する代わりに、プロジェクト全体を https://github.com/licheedev/Android-SerialPort-Tool からダウンロードできます。

1
Muhammad Ali