안 드 로 이 드 USB 직렬 통신 개발 기본 프로 세 스 상세 설명

5704 단어 androidusb
오랫동안 글 을 쓰 지 않 았 습 니 다.몇 년 전에 회사 에서 새로운 프로젝트 를 개 설 했 습 니 다.usb 직렬 통신 과 관련 된 것 입 니 다.수 요 는 안 드 로 이 드 태 블 릿 으로 usb 를 통 해 연결 한 후에 여러 외부 장치 와 통신 하 는 것 입 니 다.최근 에 야 천천히 한가 해 졌 습 니 다.이번 주말 에 바 쁘 지 않 을 때 usb 직렬 통신 개발 의 기본 절 차 를 기록 하 는 것 입 니 다.
우리 가 개발 한 것 은 usb 호스트 모델,즉 안 드 로 이 드 태 블 릿 을 호스트 로 하고 usb 외부 설 치 를 컴퓨터 에서 데이터 통신 을 하 는 것 이다.전체 개발 절 차 는 다음 과 같은 몇 가지 로 요약 할 수 있다.
1.장치 발견

UsbManager usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
Map<String, UsbDevice> usbList = usbManager.getDeviceList();
UsbManager 라 는 시스템 이 제공 하 는 클래스 를 통 해 우 리 는 현재 연 결 된 모든 usb 장 치 를 들 수 있 습 니 다.우 리 는 주로 UsbDevice 대상 이 필요 합 니 다.UsbDevice 라 는 클래스 에 대해 공식 적 으로 이렇게 설명 합 니 다.
This class represents a USB device attached to the android device with the android device
acting as the USB host.
예,이 종 류 는 안 드 로 이 드 가 연 결 된 usb 장 치 를 대표 합 니 다.
2.장치 열기
그 다음 에 우 리 는 방금 검색 한 usb 장 치 를 열 어야 합 니 다.우 리 는 태 블 릿 과 usb 외부 장치 간 의 연결 을 하나의 통로 로 상상 할 수 있 습 니 다.채널 의 문 을 열 어야 양쪽 이 통신 할 수 있 습 니 다.
일반적으로 맞 춤 형 안 드 로 이 드 장치 에서 usb 장 치 를 처음 방문 할 때 기본적으로 접근 권한 이 없 기 때문에 현재 열 려 있 는 usb Device 에 접근 권한 이 있 는 지 판단 해 야 합 니 다.

if (!usbManager.hasPermission(usbDevice)) {
    usbPermissionReceiver = new UsbPermissionReceiver();
    //    
    Intent intent = new Intent(ACTION_DEVICE_PERMISSION);
    PendingIntent mPermissionIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
    IntentFilter permissionFilter = new IntentFilter(ACTION_DEVICE_PERMISSION);
    context.registerReceiver(usbPermissionReceiver, permissionFilter);
    usbManager.requestPermission(usbDevice, mPermissionIntent);
    }
여기 서 우 리 는 라디오 UsbPermission Receiver 를 성명 합 니 다.권한 을 수 여 받 은 성공 적 인 방송 을 받 은 후에 다른 처 리 를 합 니 다. 

 private class UsbPermissionReceiver extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
      String action = intent.getAction();
      if (ACTION_DEVICE_PERMISSION.equals(action)) {
        synchronized (this) {
          UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
          if (device.getDeviceName().equals(usbDevice.getDeviceName()) {
            if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
             //    ,           
            } else {
             //    
            }
          }
        }
      }
    }
  }
그 다음 에 우 리 는 데이터 전송 기능 을 가 진 인터페이스 UsbInterface 를 찾 아야 한다.그 안에서 데이터 입력 과 출력 포트 UsbEndpoint 를 찾 아야 한다.일반적인 상황 에서 하나의 usb Device 는 여러 개의 UsbInterface 가 있 는데 우리 가 필요 로 하 는 것 은 보통 첫 번 째 이다.그래서:

usbInterface=usbDevice.getInterface(0);
마찬가지 로 하나의 usb 인터페이스 에는 여러 개의 UsbEndpoint 가 있 고 제어 포트 와 데이터 포트 등 이 있 기 때문에 우 리 는 유형 과 데이터 흐름 에 따라 우리 가 필요 로 하 는 데이터 입력 과 출력 두 개의 포트 를 찾 아야 한다.

for (int index = 0; index < usbInterface.getEndpointCount(); index++) {
        UsbEndpoint point = usbInterface.getEndpoint(index);
        if (point.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
          if (point.getDirection() == UsbConstants.USB_DIR_IN) {
            usbEndpointIn = point;
          } else if (point.getDirection() == UsbConstants.USB_DIR_OUT) {
            usbEndpointOut = point;
          }
        }
      }
마지막 으로 usb 장 치 를 진정 으로 켜 는 것 입 니 다.우 리 는 usb 외부 장치 와 Usb DeviceConnection 을 구축 해 야 합 니 다.그의 설명 은 그 용 도 를 간략하게 설명 합 니 다.
This class is used for sending and receiving data and control messages to a USB device.
코드 한 마디 만 가 져 오 는 것 도 간단 합 니 다.

usbDeviceConnection = usbManager.openDevice(usbDevice);
여기까지 이론 적 으로 태 블 릿 과 usb 외부 장치 간 의 연결 이 이미 구축 되 었 고 첫 번 째 데 이 터 를 사용 할 수 있 습 니 다.그러나 우 리 는 대부분 상황 에서 usb 직렬 포트 에 대해 설정 을 해 야 합 니 다.예 를 들 어 포트 율,정지 위치,데이터 제어 등 이 있 습 니 다.그렇지 않 으 면 양쪽 설정 이 다 르 고 받 은 데 이 터 는 혼 란 스 러 울 수 있 습 니 다.구체 적 으로 어떻게 배치 하 는 지 는 당신 이 사용 하 는 직렬 칩 이 무엇 인지 에 달 려 있 습 니 다.현재 유행 하 는 것 은 pl 2303,ch 340 등 이 있 습 니 다.편폭 문제 로 직렬 코드 를 구체 적 으로 설정 해 야 하 는 친 구 는 스스로 찾 아 보 세 요.
3.데이터 전송
여기까지 우 리 는 usb 외부 장치 와 데 이 터 를 전송 할 수 있 습 니 다.먼저 usb 장치 에 데 이 터 를 어떻게 보 내 는 지 보 겠 습 니 다.
 1.usb 외부 장치 에 데이터 보 내기
두 번 째 단계 에서 우 리 는 데이터 의 출력 포트 usb Endpointin 을 가 져 왔 습 니 다.우 리 는 외부 에 데 이 터 를 보 내 는 것 이 바로 이 포트 를 통 해 이 루어 진 것 입 니 다.어떻게 사용 하 는 지 보기:

int ret = usbDeviceConnection.bulkTransfer(usbEndpointOut, data, data.length, DEFAULT_TIMEOUT);
bulkTransfer 이 함 수 는 주어진 포트 에서 데이터 전송 을 하 는 데 사 용 됩 니 다.첫 번 째 매개 변 수 는 이번 전송 포트 입 니 다.여기 서 우리 가 사용 하 는 출력 포트 입 니 다.두 번 째 매개 변 수 는 보 낼 데이터 입 니 다.유형 은 바이트 배열 이 고 세 번 째 매개 변 수 는 보 낼 데이터 길 이 를 대표 합 니 다.마지막 매개 변 수 는 시간 초과 입 니 다.반환 값 은 성공 적 인 바이트 수 를 대표 합 니 다.만약 에-1 로 돌아 가면...발송 실패 입 니 다.
2.usb 외부 장치 에서 보 내 온 데 이 터 를 받 습 니 다.
마찬가지 로 우 리 는 데이터 입력 포트 usb Endpointin 을 찾 았 습 니 다.데이터 의 입력 이 비정 기적 이기 때문에 우 리 는 따로 스 레 드 를 열 어 데 이 터 를 받 아들 일 수 있 습 니 다.데 이 터 를 받 아들 이 는 코드 는 다음 과 같 습 니 다.

int inMax = inEndpoint.getMaxPacketSize(); 
ByteBuffer byteBuffer = ByteBuffer.allocate(inMax); 
UsbRequest usbRequest = new UsbRequest(); 
usbRequest.initialize(connection, inEndpoint); 
usbRequest.queue(byteBuffer, inMax); 
if(connection.requestWait() == usbRequest){ 
  byte[] retData = byteBuffer.array(); 
  for(Byte byte1 : retData){ 
    System.err.println(byte1); 
  } 
}
이상 은 usb 직렬 통신 의 기본 절차 입 니 다.어떤 부분 은 전면적 이지 않 습 니 다.예 를 들 어 usb 외부 설 치 된 데 이 터 를 받 는 방법 은 다른 것 이 있어 야 합 니 다.부족 한 점 은 지적 해 주 십시오.많은 응원 부 탁 드 리 겠 습 니 다.

좋은 웹페이지 즐겨찾기