У нас есть устройство для измерения артериального давления, которое мы хотим настроить через Android-устройство, и это USB-порт.Кроме того, я написал код для Windows (для каждой WinUSB), который взаимодействует с устройством, и, насколько я видел, API Android и WinUSB (конечно) имеют довольно много общего, и он должен работать довольно хорошо.Я также могу открыть устройство на Android и получить конечные точки (массовые конечные точки).Устройство поддерживает конечные точки прерывания и массового чтения / записи.
Я также могу успешно записать команду через controlTransfer на устройство, например,
private void tryGetDescriptor() {
byte[] buffer = new byte[18];
// https://www.beyondlogic.org/usbnutshell/usb6.shtml#SetupPacket standard device requests
int retVal = m_devCon.controlTransfer(0x80, 0x06, 0x0100, 0, buffer, 0x12, TIMEOUT);
if(retVal < 0) {
Debug("something failed");
} else {
Debug( "check buffer " + String.valueOf( retVal ) + " arr: " + Arrays.toString(buffer) );
}
}
или один controlTransfer, который мой ссылочный кодв Delphi:
private void startPeripheral() {
int retVal = m_devCon.controlTransfer(0x40, 2, 0, m_readPkgSize, null, 0, 0);
if(retVal < 0) {
Debug("StartPeripheral failed!");
} else {
Debug("Control Transfer returned " + String.valueOf(retVal));
}
}
Теперь я сталкиваюсь с проблемой, что в соответствии с конечной точкой записи я могу отправить команду устройству, но не получаю обратно (устройство должно по крайней мере эхокоманда)
здесь поток, который обрабатывает это (я знаю, что синхронизация на самом деле не Java, так что, пожалуйста, будьте терпеливы со мной ...)
private UsbDeviceConnection m_devCon;
private UsbEndpoint m_epRead;
private UsbEndpoint m_epWrite;
private String m_command = "";
private boolean terminated = false;
public void sigTerminate(){
terminated = true;
m_command = "";
}
public void init( UsbDeviceConnection devCon, UsbEndpoint readEP, UsbEndpoint writeEP ) {
this.m_devCon = devCon;
this.m_epRead = readEP;
this.m_epWrite = writeEP;
}
public void asyncSendCmd( String cmd ) {
Debug("AsyncSendCmd: " + cmd);
m_command = new String(cmd);
}
private void sendRec() {
Debug("Run thread");
byte[] buffer = new byte[m_readPkgSize];
try {
//while( req.queue( rBuf ) ) {
while (true) {
try {
while (m_command == "" && !terminated)
sleep(10);
Debug("Something found" + m_command);
} catch (InterruptedException f) {
Thread.currentThread().interrupt();
Debug("Thread interruped: " + f.getMessage());
}
String cpyCmd = new String(BR102_RESET );
m_command = "";
if (!terminated && isConnected()) {
// not threadsave but what shels
Debug("Writing command: " + cpyCmd);
byte[] writeBuf = cpyCmd.getBytes();
//int lenWrite = m_devCon.bulkTransfer(m_epWrite, writeBuf, writeBuf.length, TIMEOUT);
//if (lenWrite != writeBuf.length)
// throw new IOException("Write failed with len: " + String.valueOf(lenWrite));
// sleep(48);
UsbRequest wreq = new UsbRequest();
wreq.initialize( m_devCon, m_epWrite);
ByteBuffer wBuf = ByteBuffer.wrap(writeBuf);
wreq.queue( wBuf );
final UsbRequest responsew = m_devCon.requestWait( TIMEOUT );
if(responsew == null) {
Debug("no write response");
break;
}
int lenWrite = wBuf.position();
Debug("Wrote: " + String.valueOf(lenWrite));
wreq.close();
UsbRequest req = new UsbRequest();
req.initialize(m_devCon, m_epRead);
ByteBuffer rBuf = ByteBuffer.wrap( buffer );
req.queue( rBuf );
//int lenRead = m_devCon.bulkTransfer(m_epRead, buffer, m_readPkgSize, TIMEOUT);
final UsbRequest response = m_devCon.requestWait(TIMEOUT);
if(response == null) {
Debug("No Resonse");
break;
}
int lenRead = rBuf.position();
if (lenRead > 0) Debug("lenRead: " + String.valueOf(lenRead));
else Debug("lenRead: " + String.valueOf(lenRead));
req.close();
}
//rBuf.rewind();
//req.close();
}
} catch (Exception e) {
Debug("Error in usb read thread: " + e.toString());// e.getMessage());
}
}
@Override
public void run() {
sendRec();
}
}
Как можно видеть, яперепробовал несколько вещей.И это самое сложное, что я придумал.По сути, моя первая попытка была более или менее массовым переносом, который ведет себя одинаково ...
Обратите внимание, что команду "Сброс \ n" можно отправить 2 раза, а затем даже сбой записи ...
для полноты здесь приведена процедура инициализации usb:
private void startUSB(UsbDevice device) throws IllegalArgumentException {
UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
if(!usbManager.hasPermission( device )) {
usbManager.requestPermission( device, m_permissionIntent );
return;
}
try {
if( usbReader != null) {
Debug("WTF usbReader already started!!!!");
usbReader.sigTerminate();
usbReader.join();
usbReader = null;
}
// ########################################################
// #### we the permission -> get the interfaces and check for the endpoints
m_device = device;
int numInterfaces = m_device.getInterfaceCount();
if(numInterfaces > 0) {
Debug("Number of interfaces: " + String.valueOf(numInterfaces));
m_devIntf = m_device.getInterface(0);
Debug(String.valueOf(m_devIntf.getInterfaceProtocol()));
Debug("Number of endpoints: " + m_devIntf.getEndpointCount());
m_epRead = null;
m_epWrite = null;
for (int i = 0; i < m_devIntf.getEndpointCount(); i++) {
UsbEndpoint endPoint = m_devIntf.getEndpoint(i);
Debug(String.valueOf(i + 1) + ": Endpoint " + endPoint.toString());
if (endPoint.getDirection() == UsbConstants.USB_DIR_IN && endPoint.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
m_epRead = endPoint;
}
if (endPoint.getDirection() == UsbConstants.USB_DIR_OUT && endPoint.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
m_epWrite = endPoint;
}
}
if (m_epRead == null || m_epWrite == null)
throw new IllegalArgumentException("No bulk read or write endpoint found");
Debug("Got endpoints");
// ############################################################################
// okidoki we have endpoints and we have an interface -> open the device
m_devCon = usbManager.openDevice(m_device);
Debug("Got device");
if (m_devCon == null)
throw new IllegalArgumentException("No Deviceconnection?!");
if (!m_devCon.claimInterface(m_devIntf, false))
throw new IllegalArgumentException("Claim failed");
Debug("All fine - now we can start the conversation");
m_readPkgSize = m_epRead.getMaxPacketSize();
m_writePkgSize = m_epWrite.getMaxPacketSize();
tryGetDescriptor();
// ############################################################################
// ### init reading and wrinting
usbReader = new UsbReadThread();
usbReader.init( m_devCon, m_epRead, m_epWrite );
usbReader.start();
startPeripheral();
} else {
Debug("No interfaces");
}
} catch(Exception e)
{
Debug( "Device connection failed with " + e.getMessage() );
// release
closeUSB();
return;
}
}