2016-09-06 3 views
0

응용 프로그램은 버튼을 누른 상태에서 USB 변환기 CP2102 UART를 통해 USB 포트에서 데이터를 수신합니다. USB 장치를 열어서 PID를 읽을 수 있지만 직렬 포트가 열려있는 코드 조각을 삽입하면 응용 프로그램이 충돌합니다. 누구는 문제가 뭔지 알고 있습니까? (CP2102 library used)CP2102 Android 응용 프로그램이 다운 됨

public class MainActivity extends AppCompatActivity { 

private ToggleButton toggle; 
private TextView textView; 
private Toolbar toolbar; 
private UsbSerialDevice serialPort; 
private UsbManager usbManager; 
private UsbDevice device; 
private UsbDeviceConnection connection; 


private UsbSerialInterface.UsbReadCallback mCallback = new UsbSerialInterface.UsbReadCallback() 
{ 
    @Override 
    public void onReceivedData(byte[] arg0) 
    { 
     // Code here 

    } 
}; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    textView =(TextView) findViewById(R.id.textView); 
    toggle = (ToggleButton) findViewById(R.id.toggleButton); 
    setSupportActionBar(toolbar); 


    usbManager = (UsbManager) getSystemService(Context.USB_SERVICE); 
    device = null; 
    connection = null; 
    HashMap<String, UsbDevice> usbDevices = usbManager.getDeviceList(); 

    if(!usbDevices.isEmpty()) 
    { 
     boolean keep = true; 
     for(Map.Entry<String, UsbDevice> entry : usbDevices.entrySet()) 
     { 
      device = entry.getValue(); 
      int deviceVID = 0; 
      deviceVID = device.getVendorId(); 
      int devicePID = device.getProductId(); 
      if(deviceVID != 0x1d6b || (devicePID != 0x0001 || devicePID != 0x0002 || devicePID != 0x0003)) 
      { 
       // We are supposing here there is only one device connected and it is our serial device 
       connection = usbManager.openDevice(device); 
       textView.append("\nConnected USB Device ID:"); 
       textView.append(Integer.toString(deviceVID)); 

       serialPort = UsbSerialDevice.createUsbSerialDevice(device, connection); 

       keep = false; 
      }else 
      { 
       connection = null; 
       device = null; 
      } 

      if(!keep) 
       break; 
     } 
    } 






    toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 

      if (isChecked) { 
       textView.append("\nLogging Started!\n"); 

       if(serialPort != null) 
       { 
        if(serialPort.open()) 
        { 
         // Devices are opened with default values, Usually 9600,8,1,None,OFF 
         // CDC driver default values 115200,8,1,None,OFF 

         textView.setText("Serial port opened"); 
         serialPort.setBaudRate(115200); 
         serialPort.setDataBits(UsbSerialInterface.DATA_BITS_8); 
         serialPort.setStopBits(UsbSerialInterface.STOP_BITS_1); 
         serialPort.setParity(UsbSerialInterface.PARITY_NONE); 
         serialPort.setFlowControl(UsbSerialInterface.FLOW_CONTROL_OFF); 
         serialPort.read(mCallback); 
        }else 
        { 
         // Serial port could not be opened, maybe an I/O error or it CDC driver was chosen it does not really fit 
         textView.setText("Could not open port"); 
        } 
       }else 
       { 
        // No driver for given device, even generic CDC driver could not be loaded 
        textView.setText("No driver"); 
       } 

      } else { 

       textView.append("Logging Stopped!"); 
      } 
     } 
    }); 

} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 

} 
+0

Android Studio의 Android 모니터는 무엇인가요? 어떤 Android 버전을 사용하십니까? 좀 더 많은 정보가 도움이 될 것입니다. – andred

+0

USB 케이블을 분리하고 CP2102를 연결해야하기 때문에 안드로이드 모니터가 무엇인지 알 수 없습니다. 6.0.1을 사용합니다. Android vesrion – Nikson

+0

장치와 개발 컴퓨터가 동일한 네트워크에있는 한 네트워크를 통해 adb를 연결할 수 있습니다. 이 내용은 http://stackoverflow.com/q/2604727/589216에 설명되어 있습니다. – andred

답변

0

문제는 권한 (안드로이드 6.0)을받지 못하고 있었다, 그러나 허가를받지 않고 CP2102의 제품 및 공급 업체 ID를 읽을 수 있었다 때문에 조금 오해의 소지가 있었다.

관련 문제