gpt4 book ai didi

android - 如何将 Linux C USB 读取转换为 Android?

转载 作者:行者123 更新时间:2023-11-30 03:05:39 24 4
gpt4 key购买 nike

我有插入 USB 的轮胎压力管理系统 (TPMS) 适配器 (http://store.mp3car.com/USB_TPMS_Version_2_20_4_Sensor_Kit_p/com-090.htm)。我让它与原始 Windows 软件以及 Linux C 代码一起使用,以读取轮胎压力和温度。我现在正尝试在 Android 上使用此适配器,但遇到了一些困难。我可以很好地检测到设备,但无论我尝试什么,我的读取都返回 -1 字节读取。这是我要转换的 C 代码:

int TpmsPlugin::readUsbSensor(int sid, unsigned char *buf)
{
int r, transferred;

buf[0] = 0x20 + sid;
r = libusb_interrupt_transfer(mDeviceHandle, ENDPOINT_OUT, buf, 1, &transferred, INTR_TIMEOUT);
if (r < 0) {
DebugOut() << "TPMS: USB write interrupt failed, code " << r << endl;
}

r = libusb_interrupt_transfer(mDeviceHandle, ENDPOINT_IN, buf, 4, &transferred, INTR_TIMEOUT);
if (r < 0) {
DebugOut() << "TPMS: USB read interrupt failed, code " << r << endl;
}

return r;

sid 的值是 1、2、3 或 4,具体取决于轮子。然后使用以下方法提取值:

    lfPressure = ((float)buf[0]-40) * PRESSURE_SCALE * KPA_MULTIPLIER;
lfTemperature = (float)buf[1]-40;

您也可以在此处查看此驱动程序的完整实现:​​https://github.com/otcshare/automotive-message-broker/blob/master/plugins/tpms/tpmsplugin.cpp

我的 Android 版本能够找到 USB 设备,获得使用它的权限,连接到它,获取 UsbEndpoints(它列出了两个),但无论是 bulkTransfer() 还是 controlTransfer(),我都尝试过,但都失败了。特别是,我根据我能找到的所有文档尝试了很多不同的 controlTransfer 值。这是我试过的一些代码:

UsbInterface intf = TpmsSectionFragment.device.getInterface(0);
UsbEndpoint endpoint_in = null, endpoint_out = null;
for (int i = 0; i < intf.getEndpointCount(); i++) {
UsbEndpoint ep = intf.getEndpoint(i);
if (ep.getDirection() == UsbConstants.USB_DIR_IN)
endpoint_in = ep;
else if (ep.getDirection() == UsbConstants.USB_DIR_OUT)
endpoint_out = ep;
}

UsbDeviceConnection connection = gUsbManager.openDevice(TpmsSectionFragment.device);
connection.claimInterface(intf, false);
int timeout = 1000;
int length = 4;

while (true) {
for (int sensorId = 1; sensorId <= 4 && mReadThreadActive; sensorId++) {

byte[] tpmsRaw = new byte[length];
tpmsRaw[0] = (byte) (0x20 + sensorId);
int out_len = connection.bulkTransfer(endpoint_out, tpmsRaw, 1, timeout);
int in_len = connection.bulkTransfer(endpoint_in, tpmsRaw, 4, timeout);
//int out_len = connection.controlTransfer(0x42, 0x0, 0x100, 0, tpmsRaw, tpmsRaw.length, timeout);
//int in_len = connection.controlTransfer(0x41, 0x0, 0x100, 0, tpmsRaw, tpmsRaw.length, timeout);

非常感谢任何关于我可能做错的想法。如果您有任何建议,我很乐意尝试一些不同的方法来进一步调试。

谢谢!

最佳答案

这是基于 Chris 帮助的解决方案。我将调用转换为队列/请求等待:

ByteBuffer buf = ByteBuffer.allocate(4);
buf.put(0, (byte) (0x20 + sensorId));

UsbRequest send = new UsbRequest();
send.initialize(connection, endpoint_out);
Boolean sent = send.queue(buf, 1);
UsbRequest r1 = connection.requestWait();

send.initialize(connection, endpoint_in);
send.queue(buf, 4);
UsbRequest r2 = connection.requestWait();

我需要调整的另一件事是这个调用并将第二个参数设置为 true:

connection.claimInterface(intf, true);

就是这样。完毕。感谢您的帮助!

关于android - 如何将 Linux C USB 读取转换为 Android?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21864633/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com