串口转USB与健康设备的Andr​​oid应用程序 [英] Serial to USB Android application with health device

查看:298
本文介绍了串口转USB与健康设备的Andr​​oid应用程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建一个Android应用程序,让沟通我的银河平板与健康设备,通过串行到USB连接。

I am creating an Android application to let communicate my Galaxy Tablet with an health device, via serial to USB connection.

在code,我实现不起作用!无论是OUT也不在通信启动

The code I implemented does not work! neither the OUT nor IN communication starts

是否有人有任何想法?

public void recordData(View _view){
    text = (TextView)findViewById(R.id.textView1);





    manager=(UsbManager) getSystemService(Context.USB_SERVICE);

    PendingIntent mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
    IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
    registerReceiver(mUsbReceiver, filter);


    HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
    Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
    while(deviceIterator.hasNext()){
        UsbDevice device = deviceIterator.next();
        manager.requestPermission(device, mPermissionIntent);
        text.setText(text.getText()+"\n"+device.getDeviceName());
    }


}


private UsbManager manager=null;

private boolean forceClaim = true;
private UsbDeviceConnection connection;
private UsbEndpoint input = null,output=null; 
private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
    private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {

        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (ACTION_USB_PERMISSION.equals(action)) {
                synchronized (this) {
                    isRecording=true;
                    UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);

                    if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                        if(device != null){
                          //call method to set up device communication
                            UsbInterface intf = device.getInterface(0);
                            connection = manager.openDevice(device); 
                            connection.claimInterface(intf, forceClaim);

                            //connection settings
                            int op= connection.controlTransfer(0x40, 0, 0, 0, null, 0, 0);// reset   //0x40
                            int op2= connection.controlTransfer(0x40, 0, 1, 0, null, 0, 0);//clear Rx  
                            int op3= connection.controlTransfer(0x40, 0, 2, 0, null, 0, 0);// clear Tx
                            int op3b=  connection.controlTransfer(0x40, 0x02, 0x0000, 0, null, 0, 0);//control flow

                            int op4= connection.controlTransfer(0x40, 0x03, 0x001A, 0, null, 0, 0);// baud rate 115200
                            int op5= connection.controlTransfer(0x40, 0x04, 0x0008, 0, null, 0, 0);//8 bit

                            int endPts = intf.getEndpointCount();

                            for(int e = 0; e < endPts; e++){
                                UsbEndpoint endpoint = intf.getEndpoint(e);
                                endpoint.getAttributes();

                                if( endpoint.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK){
                                    if(endpoint.getDirection() == UsbConstants.USB_DIR_IN){
                                        input = endpoint;
                                        Log.d("Endpoint", "Got input");

                                    }else if(endpoint.getDirection() == UsbConstants.USB_DIR_OUT){
                                        output = endpoint;
                                        Log.d("Endpoint", "Got output");
                                    }                       
                                }
                            }



                            text.setText(text.getText()+"\nOut= "+String.valueOf(output.getEndpointNumber()));
                            text.setText(text.getText()+"\nIn= "+String.valueOf(input.getEndpointNumber()));


                            byte [] buffer = {77}; // M\n in ascii
                            for (int i = 0; i < buffer.length; ++i)
                            {
                                connection.bulkTransfer(output, new byte[] {buffer[i]}, 1, 0);
                            }



                            read();

                       }
                    } 
                    else {
                        //error
                    }
                }
            }
        }
    };

//read thread
    private void read() {
        Runnable r = new Runnable() {
            byte[] buffer = new byte[64];
            byte[] buffer2;
            public void run() {
                while (isRecording) {
                    {
                        int op = connection.bulkTransfer(input, buffer, 64, 0);

                        if (op > 2) {
                            buffer2 = new byte[op];
                            for (int i = 0; i < op - 2; ++i) {
                                buffer2[i] = buffer[i+2];
                                text.setText(text.getText()+"\n"+String.valueOf(buffer2[i]));
                            }

                        }
                    }

                }
            }
        };
        Thread t = new Thread(r);
        t.start();

非常感谢你!

推荐答案

尝试发送你必须先控制事务的字节前:

Before trying to send the bytes you have to control the transaction first:

使用:

// for writing to USB with 9600 baudrate
connection.controlTransfer(0x00000000, 0x03, 0x4138, 0, null, 0, 0);

// for reading from USB with 9600 baudrate
connection.controlTransfer(0x00000080, 0x03, 0x4138, 0, null, 0, 0);

参考:

  • http://developer.android.com/guide/topics/connectivity/usb/host.html
  • http://developer.android.com/reference/android/hardware/usb/UsbConstants.html

这篇关于串口转USB与健康设备的Andr​​oid应用程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆