Soru & Cevap

Android USB iletişimi ...

01.10.2015 - 02:46

Merhaba arkadaşlar,

 

Android uygulamamda RS232 cihazı ile USB bağlantısı kurmaya çalışıyorum. Örnek koduma göre bağlantıyı kurup veri alışverişi yapabiliyorum. Fakat koddaki gibi date, time ve date-time okuma işlemi yapmak istediğimde; date, time verilerini doğru bir şekilde ayrı ayrı okuyabilirken date-time verisini bazen doğru bir şekilde okuyamıyorum. Geri döndürülen değer;

 

1 96 0 0 0....  gibi birşey oluyor. Bazen doğru okuyup bazen bu değeri okumasının nedeni ne olabilir?


 




 //Getting usb manager, it tells all devices that are connected
        um=(UsbManager) getSystemService(Context.USB_SERVICE);


            //hashmap will tel list of connected usb's
            myDeviceList = um.getDeviceList();


            //Iterator is made of usbDevices.. It one by one iterates through the list of usb in loop
            myIterator = myDeviceList.values().iterator();

            while (myIterator.hasNext()) {
                device = myIterator.next();

                //showing name of usb
                Toast.makeText(this, "NAME OF MY USB IS:" + device.getDeviceName(), Toast.LENGTH_SHORT).show();
            }

            //OR SIMPLY GET
            UsbDevice myDevice = myDeviceList.get("/dev/bus/usb/001/002");

        if(myDevice!=null)
              tv_dvc.setText(myDevice.getDeviceName());


            final BroadcastReceiver abcd = new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent myIntent) {
                    String myPermission = myIntent.getAction();


                    if (permission.equals(myPermission)) {
                        synchronized (this) {
                            final UsbDevice myDevice = (UsbDevice) myIntent.getParcelableExtra(um.EXTRA_DEVICE);

                            //Permission given
                            if (myIntent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                                if (myDevice != null) {

                                    //Communication or data is being transferred

                                    //desired interface for desired device
                                    ui = myDevice.getInterface(0);


                                /*  Interface 0
                                    Endpoint 0: Inbound, type- bulk, max packet size- 64

                                    Endpoint 1: Outbound, type- bulk, max packet size- 64*/

                                    epOut = ui.getEndpoint(1);
                                    epIn = ui.getEndpoint(0);

                                    //desired connection
                                    con = um.openDevice(myDevice);
                                    con.claimInterface(ui, true);

                                    setPort(con);



                                    btn_get_buzzer.setOnClickListener(onClick);
                                    btn_get_date_time.setOnClickListener(onClick);
                                    btn_get_date.setOnClickListener(onClick);
                                    btn_get_time.setOnClickListener(onClick);


                                }
                            }

                        }
                    }

                }
            };

            //now in order to register broadcast receiver this is syntax
            PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, new Intent(permission), 0);
            IntentFilter intentFilter = new IntentFilter(permission);
            registerReceiver(abcd, intentFilter);

            if (myDevice != null)
                um.requestPermission(myDevice, pendingIntent);




    }








public int sendCommand(UsbDeviceConnection con, UsbEndpoint epOut, UsbEndpoint epIn, byte cmd, int adr, int cnt, byte[] data) {


        setPort(con);

        int sent = 0; //count of bytes sent
        byte add = 0; //simple chksum
        int unsigned_cmd;


        byte[] header = {0x23};

        unsigned_cmd = unsigned_int(cmd);

        byte[] cmd_array = {(byte) unsigned_cmd};


        byte[] address = {(byte) (adr >> 8), (byte) (adr & 0xFF)};


        byte[] count = {(byte) (cnt >> 8), (byte) (cnt & 0xFF)};


        con.bulkTransfer(epOut, header, header.length, 0);  //send header  #, 0x23
        sent++;
        add += 0x23;


        con.bulkTransfer(epOut, cmd_array, 1, 0);  //send cmd byte
        sent++;
        add += cmd;

        con.bulkTransfer(epOut, address, address.length, 0);  //send address, msb first
        sent += address.length;
        add += (byte) ((adr >> 8) & 0xFF);
        add += (byte) (adr & 0xFF);


        con.bulkTransfer(epOut, count, count.length, 0);  //send count, msb first
        add += (byte) ((cnt >> 8) & 0xFF);
        add += (byte) (cnt & 0xFF);
        sent += count.length;


        //  if(cmd==(byte)0x80)
        if ((unsigned_cmd > 127) && (cnt > 0)) { //if it is a write command
            con.bulkTransfer(epOut, data, cnt, 0);  //send data, if it is a write command

        }
        add += adder(data, cnt);
        sent += cnt;

        con.bulkTransfer(epOut, new byte[]{add}, 1, 0);  //send chksum


        return sent;
    }





 public void setPort(UsbDeviceConnection con) {
        con.controlTransfer(0x40, 0, 0, 0, null, 0, 0);//reset
        con.controlTransfer(0x40, 0, 1, 0, null, 0, 0);//clear Rx
        con.controlTransfer(0x40, 0, 2, 0, null, 0, 0);//clear Tx
        con.controlTransfer(0x40, 0x03, 0x001A, 0, null, 0, 0);//baudrate
        con.controlTransfer(0x40, 0x02, 0x0000, 0, null, 0, 0);//flow control none
        con.controlTransfer(0x40, 0x04, 0x0008, 0, null, 0, 0); //data bit 8, parity none, stop bit 1, tx off
        // 1st parameter - 0x40 -request to set or get control data
        // 2nd parameter - 0x04 -type of data to be set or get
        // 3rd parameter - 0x0008- data bit 8, parity none, stop bit 1, tx off
    }

 

18 Görüntülenme

1 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

Profile picture for user serifeozdamarlar
serifeozdamarlar
06.10.2015 - 09:55

Arkadaşlar sorumun cevabını buldum;

 

BulkTransfer çok hızlı bir şekilde iletim sağladığı için 50 ms'lik bir delay gerekiyormuş. sendCommand() methoduna delay koyduğumda problem ortadan kalktı.