Android USB 직렬 통신 개발 사례 상세 설명
오랫동안 글 을 쓰 지 않 았 습 니 다.몇 년 전에 회사 에서 새로운 프로젝트 를 개 설 했 습 니 다.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 외부 설 치 된 데 이 터 를 받 는 방법 은 다른 것 이 있어 야 합 니 다.부족 한 점 은 지적 해 주 십시오.읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.