我必须使用android读取和写入设备的COM端口数据,我正在使用javax.comm包但是当我安装apk文件时,它没有显示设备的任何端口所以是否有任何我需要在清单文件中添加的权限?
答案 0 :(得分:18)
您的问题与操作系统有关。 Android runs Linux under the hood,Linux对待串行端口的方式与Windows不同。 javax.comm
还包含win32com.dll
,driver file,您将无法在Android设备上安装。如果您确实找到了实现目标的方法,那么您实际上无法在Linux环境中查找“COM”端口。串口将使用不同的名称。
Windows Com Port Linux equivalent
COM 1 /dev/ttyS0
COM 2 /dev/ttyS1
COM 3 /dev/ttyS2
所以,假设,如果你的想法有效,你必须寻找这些名字。
幸运的是,Android确实有与USB设备连接的规定(我假设你要连接到它,而不是并行或RS-232端口)。为此,您需要将设备设置为USB Host.以下是您要执行的操作:
USBManager
. USBInterface
和USBEndpoint
。这是我对你如何做到这一点的粗略估计。当然,您的代码将采用更成熟的方式。
String YOUR_DEVICE_NAME;
byte[] DATA;
int TIMEOUT;
USBManager manager = getApplicationContext().getSystemService(Context.USB_SERVICE);
Map<String, USBDevice> devices = manager.getDeviceList();
USBDevice mDevice = devices.get(YOUR_DEVICE_NAME);
USBDeviceConnection connection = manager.openDevice(mDevice);
USBEndpoint endpoint = device.getInterface(0).getEndpoint(0);
connection.claimInterface(device.getInterface(0), true);
connection.bulkTransfer(endpoint, DATA, DATA.length, TIMEOUT);
额外的阅读材料:http://developer.android.com/guide/topics/connectivity/usb/host.html
答案 1 :(得分:0)
我不是专家,但是对于所有想要连接串行RS-232端口或打开串行端口而无法通过UsbManager找到其设备的人,您可以使用这种方法找到所有设备
mDrivers = new Vector<Driver>();
LineNumberReader r = new LineNumberReader(new FileReader("/proc/tty/drivers"));
String l;
while ((l = r.readLine()) != null) {
String drivername = l.substring(0, 0x15).trim();
String[] w = l.split(" +");
if ((w.length >= 5) && (w[w.length - 1].equals("serial"))) {
mDrivers.add(new Driver(drivername, w[w.length - 4]));
}
}
找到所有驱动程序后,遍历所有驱动程序以获取所有设备,例如
mDevices = new Vector<File>();
File dev = new File("/dev");
File[] files = dev.listFiles();
if (files != null) {
int i;
for (i = 0; i < files.length; i++) {
if (files[i].getAbsolutePath().startsWith(mDeviceRoot)) {
Log.d(TAG, "Found new device: " + files[i]);
mDevices.add(files[i]);
}
}
}
这里是具有两个成员变量的Driver Class构造函数
public Driver(String name, String root) {
mDriverName = name;
mDeviceRoot = root;
}
打开串行端口您可以使用Android串行端口Api只需在设备上打开串行端口并编写(您必须知道设备路径和波特率,我的设备是ttyMt2,波特率96000)
int baurate = Integer.parseInt("9600");
mSerialPort = new SerialPort(mDevice.getPath(), baurate, 0);
mOutputStream = mSerialPort.getOutputStream();
byte[] bytes = hexStr2bytes("31CE");
mOutputStream.write(bytes);
下载整个项目,而不必浪费时间在这段代码上