Как узнать температуру на USB-устройстве с HIDAPI?
Я должен восстановить значение температуры с USB-устройства TEMPer, и я нашел код в этом посте:
import java.io.IOException;
import org.apache.log4j.Logger;
import com.codeminders.hidapi.HIDDevice;
import com.codeminders.hidapi.HIDManager;
public class Foo {
static final int VENDOR_ID = 3141;
static final int PRODUCT_ID = 29697;
static final int BUFSIZE = 2048;
static final long READ_UPDATE_DELAY_MS = 1000;
public static String myTemperature = "0.00";
private static Logger log = Logger.getLogger(Foo.class.getName());
static float raw_to_c(final int rawtemp) {
final float temp_c = rawtemp * (125.f / 32000.f);
return temp_c;
}
static float c_to_u(final float deg_c, final char unit) {
if (unit == 'F') {
return (deg_c * 1.8f) + 32.f;
} else if (unit == 'K') {
return (deg_c + 273.15f);
} else {
return deg_c;
}
}
public static void readDevice(final int vendorId, final int productId) {
System.out.println("In readDevice");
final HIDDevice dev;
try {
final HIDManager hid_mgr = HIDManager.getInstance();
log.debug("vendorId =" +vendorId + " productID =" + productId);
dev = hid_mgr.openById(vendorId, productId, null);
final byte[] temp = new byte[] { (byte) 0x01, (byte) 0x80, (byte) 0x33, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00 };
final int res = dev.write(temp);
try {
final byte[] buf = new byte[BUFSIZE];
final int n = dev.read(buf);
int rawtemp = (buf[3] & (byte) 0xFF) + (buf[2] << 8);
if ((buf[2] & 0x80) != 0) {
/* return the negative of magnitude of the temperature */
rawtemp = -((rawtemp ^ 0xffff) + 1);
}
System.out.println("temp = " + c_to_u(raw_to_c(rawtemp), 'C'));
myTemperature = Float.toString( c_to_u(raw_to_c(rawtemp), 'C'));
try {
Thread.sleep(READ_UPDATE_DELAY_MS);
} catch (final InterruptedException e) {
e.printStackTrace();
}
} finally {
dev.close();
hid_mgr.release();
}
} catch (final IOException e) {
e.printStackTrace();
}
}
}
Мой класс возвращает этот код ошибки:
com.codeminders.hidapi.HIDDeviceNotFoundException в com.codeminders.hidapi.HIDManager.openById(HIDManager.java:114) в Foo.readTempera (Foo.java:44) в StartApplication.main(StartApplication.java:96)
Я проверил, является ли мой USB-зонд устройством HID, и да.
Решение найдено! ==> Это мой Linux, который не видит USB-устройства, кроме классического ключа хранения. Так что теперь это работает!
У меня просто есть вторая проблема, в этом коде я никогда не пропускаю после
int n = dev.read(buf);
И эта линия необходима, чтобы иметь хороший результат. И операции с байтами не очень легки для меня...
Решение № 2 найдено! ==> Все, что мне нужно, это добавить следующую строку перед записью и чтением:
dev.disableBlocking();
Последняя проблема, я думаю: я не читаю байты, когда я делаю это:
int n = dev.read(buf);
n всегда равно 0...