안드로이드 태블릿과 다른 디바이스가 usb로 연결되있을시 태블릿상에서 현재 시스템에 연결된 serial port number 얻는 방법
작성자박태근작성시간14.11.02조회수868 목록 댓글 4※ 본 카페의 공지사항에 개인/회사 프로젝트의 일환으로 질문을 건건히 올리지 말라는 관리자님께서 작성하신 내용이 있습니다.
저 또한 그런 의도로 작성하는 것은 아니닙니다.
단지 제가 질문하는 내용에 대해서 근 2주동안 혼자서 정말 끙끙 앓으면서 usb 시리얼 통신 관련 소스를 분석하면서 코딩도 해보면서 문제를 해결하려고 했지만 비정상적으로 시간이 많이 걸려서 전문가분들의 도움을 받고자 카페에 들렀습니다.
본 질문에 대해서 문제가 해결이 되면 이 또한 내용을 깔끔하게 정리하여 본 카페에 올려서 다른 분들에게 내용을 공유할 예정입니다.
혹시나 관리자님이나 다른 분들께서도 제가 불순한 의도로 카페를 이용한다는 오해는 안하셨으면 좋겠습니다^^
안녕하세요?
현재 안드로이드 태블릿상에서 로봇을 제어할 수 있는 안드로이드 App을 만들고 있는 학생이라고 합니다.
C#의 라이브러리중에는 System.IO.Ports.SerialPort.GetPortNames()라는 함수를 제공하여 현재 시스템에 연결된 usb serial port number를 직접적으로 얻어올 수 있는 기능을 제공하고 있습니다.(예 : COM1 ... COM16)
제가 C#의 GetPortNames() 함수를 먼저 말씀드린 이유는 기존 현업에서 로봇의 시스템 정보 수정 및 관리를 윈도우즈 C#기반의 응용 프로그램에서 직/간접적으로 제어를 하였기 때문입니다. 그래서 기존의 C#으로 작성된 프로그램을 대체하는 안드로이드 기반 태블릿 PC에서 동작하는 응용 어플리케이션을 개발하려고 하고 있습니다.
이런 과정들을 통해서 안드로이드 기반 태블릿에서 usb serial 통신을 구현하면서 현재 태블릿에 연결된 usb serial port에 대해서 port number(COM1, COM2, ... COM16)를 얻어올 수 있는 방법을 여러가지로 찾아보았지만 ANR 혹은 제가 의도하는 방향으로 USB 시리얼 통신이 구현이 되지않아 부득이하게 글을 남기게 되었습니다.
현재 구글링과 StackOverflow 해외 사이트등을 통해서 양 기기간에 usb 통신을 하기 위해서 필요로 하는 함수들은 다음과 같이 있다는 것을 파악하였습니다.
▶ UsbManager manager = (UsbManager) getSystemService(Context.USB_SERIVCE); // Get UsbManager from Android
▶ UsbSerialDriver driver = UsbSerialProber.acquire(manager); // Find the first available driver
▶ List<UsbSerialDriver> availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager);
그리고 아래와 같이 usb통신에 필요한 라이브러리를 사용하기 위해 import를 한 뒤에, 현재 태블릿에 연결된 usb serial port number를 얻어오기 위해서 아래와 같이 코딩을 한뒤, 안드로이드 태블릿<->로봇제어기를 연결하여 태블릿에서 usb serial port number를 정상적으로 얻어오는지 확인하였지만 ANR이 뜨는 바람에 어디서 제가 잘못했는지 잘 모르겠습니다.
List<UsbSerialDriver> availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager);
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbInterface;
import android.hardware.usb.UsbManager;
안드로이드 교재나 인터넷상에서 C#의 System.IO.Ports.SerialPort.GetPortNames()와 같은 기능을 담당하는 함수를 찾아본뒤에 코딩도 해보고 실행도 해보았지만 계속 에러가 떠서 혹시나 안드로이드에서 GetPortNames()의 기능을 하는 함수나 라이브러리가 있는지 궁금합니다^^
※ 제가 현재 안드로이드 초보 개발자라 질문 내용도 많이 조잡하고 핵심이 없는 점은 이해해주셨으면 합니다.
댓글
댓글 리스트-
작성자슈퍼성근 작성시간 14.11.03 안녕하세요. ^^
질문하나 올리시는데 이렇게까지 고민하고 올리시라고
공지사항을 제공한 것은 아닙니다.
(프로젝트를 진행하면서 무분별하게 질문을 많이 하시는 분이 계셔서.. ^^;;)
ANR부터 해결하셔야 겠네요.
ANR은 메인스레드에서 5초, 10초, 20초(컴포넌트마다 ANR 시간이 다름)
의 긴작업을 수행할 때 발생됩니다.
이런 작업은 작업 스레드를 생성해서 하셔야 겠지요.
USB의 경우 대기 시간이 긴 작업에 해당합니다.
혹시 어떤 컴포넌트에서 작업 중이신간요?(액티비티, 서비스, 리시버)
그리고 혹시 메인스레드에 대해서 모르신다면
책의 14장을 참조하시거나
-
작성자슈퍼성근 작성시간 14.11.03 카페의 "안드로이드 기본 강좌 - ANR, 서비스"를 참조하시기 바랍니다.
안드로이드 앱을 개발하시려면
메인 스레드, 핸들러, 메세지큐 등의 개념을 꼭 이해하셔야 하거든요.
수고하세요. -
답댓글 작성자박태근 작성자 본인 여부 작성자 작성시간 14.11.03 일하시느라 바쁘실텐데 소중한 시간 내어서 답변 주셔서 너무 감사합니다. 지적해주신 ANR부분과 3가지 주요 챕터에 대해서 다시 한 번 정독해보겠습니다.
제가 질문하고자 하는 내용은 usb 시리얼 통신 구현중에서 ' C#의 GetPortNames() 함수처럼, 안드로이드 기반의 태블릿 디바이스에는 usb 포트가 연결되었을 때, 시스템에 연결된 직렬 포트를 얻어오는 함수가 어떤 라이브러리에 있는지 여부' 입니다. 하지만 성근님께서 쉽게 파악할 수 없는 형태로 작성한 것 같아 좀 더 성의있게 적었어야 하는 아쉬움이 남습니다. -
답댓글 작성자슈퍼성근 작성시간 14.11.04 박태근 앗 죄송합니다. 늦게 보았네요. ^^
이미 답을 찾으셨을 것 같습니다.
위에
List<UsbSerialDriver> availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager);
소스에서
UsbSerialDriver 클래스를 이용하시면
getDeviceName () 등과 같은 함수들이 제공됩니다.
사실 저도 USB 관련된 프로젝트 등을 수행한 적은 없어
정확히 원하는 답을 드리긴 어렵네요. ^^;
그리고 박태근 님께서 쓰신 글의 내용이라면 매우 훌륭합니다.
이해하기도 쉬웠고 쉽게 파악할 수 있었습니다. 감사합니다.
오히려 제가 잘 몰라서 문제였네요. ^^;