如何使用适用于Android的usb串行接口从连接到Android的CDC设备读取数据?
我用它从Feather 32u4设备发送和接收数据。当端口打开时,羽毛发送一些固定数据,然后回显发送给它的内容 我在理解如何使用适用于Android的usb串行接口从连接到Android的CDC设备读取数据?,android,usbserial,adafruit,Android,Usbserial,Adafruit,我用它从Feather 32u4设备发送和接收数据。当端口打开时,羽毛发送一些固定数据,然后回显发送给它的内容 我在理解read和write方法在库中的工作方式时遇到问题。我很确定我正确地使用了write,但我不知道read。使用read时返回的长度始终为0,并且我使用的是正确的波特率。我只是不太确定该怎么用。我仍在尝试找出事件驱动的选项 private void DoTheThing () { String textMessage = ""; UsbManager
read
和write
方法在库中的工作方式时遇到问题。我很确定我正确地使用了write
,但我不知道read
。使用read
时返回的长度始终为0,并且我使用的是正确的波特率。我只是不太确定该怎么用。我仍在尝试找出事件驱动的选项
private void DoTheThing () {
String textMessage = "";
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
// Find available drivers for Feather board.
ProbeTable customTable = new ProbeTable();
customTable.addProduct(0x239a, 0x800c, CdcAcmSerialDriver.class);
UsbSerialProber prober = new UsbSerialProber(customTable);
List<UsbSerialDriver> drivers = prober.findAllDrivers(manager);
if (drivers.isEmpty()) {
textMessage += "Could not find any drivers.\n";
m_textView.setText(textMessage);
return;
}
textMessage += "Driver found\n";
m_textView.setText(textMessage);
UsbDeviceConnection connection = null;
UsbSerialDriver driver = drivers.get(0);
PendingIntent usbPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(INTENT_ACTION_GRANT_USB), 0);
manager.requestPermission(driver.getDevice(), usbPermissionIntent);
try {
connection = manager.openDevice(driver.getDevice());
} catch (Exception e) {
textMessage += e + "\n";
m_textView.setText(textMessage);
}
if (connection == null) {
// add UsbManager.requestPermission(driver.getDevice(), ..) handling here
textMessage += "Could not open device.\n";
m_textView.setText(textMessage);
return;
}
textMessage += "Device opened\n";
m_textView.setText(textMessage);
UsbSerialPort port = driver.getPorts().get(0);
// Most devices have just one port (port 0)
try {
port.open(connection);
port.setParameters(115200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);
} catch (IOException e) {
textMessage += e + "\n";
m_textView.setText(textMessage);
return;
}
textMessage += "Connection established\n";
m_textView.setText(textMessage);
// Get received data on connection.
int length = -2;
byte[] receivedData = new byte[64];
try {
length = port.read(receivedData, 2000);
} catch (Exception e) {
textMessage += "Oops: " + e + "\n";
m_textView.setText(textMessage);
}
String data = new String(receivedData);
textMessage += "Data recieved: " + length + " " + data + "\n";
m_textView.setText(textMessage);
// Send canned data.
length = -2;
try {
length = port.write("a".getBytes(), 2000);
} catch (Exception e) {
textMessage += "Oops: " + e + "\n";
m_textView.setText(textMessage);
}
textMessage += "Data sent " + length + "\n";
m_textView.setText(textMessage);
// Get received data.
length = -2;
receivedData = new byte[64];
try {
length = port.read(receivedData, 2000);
} catch (Exception e) {
textMessage += "Oops: " + e + "\n";
m_textView.setText(textMessage);
}
data = new String(receivedData);
textMessage += "Data recieved: " + length + " " + data;
m_textView.setText(textMessage);
}
private void DoTheThing(){
字符串textMessage=“”;
UsbManager manager=(UsbManager)getSystemService(Context.USB_服务);
//查找羽毛板的可用驱动程序。
ProbeTable customTable=新的ProbeTable();
addProduct(0x239a,0x800c,CdcAcmSerialDriver.class);
UsbSerialProber prober=新的UsbSerialProber(自定义表);
列出驱动程序=prober.findAllDrivers(管理器);
if(drivers.isEmpty()){
textMessage+=“找不到任何驱动程序。\n”;
m_textView.setText(textMessage);
返回;
}
textMessage+=“找到驱动程序\n”;
m_textView.setText(textMessage);
UsbDeviceConnection连接=null;
UsbSerialDriver driver=drivers.get(0);
pendingent usbPermissionIntent=pendingent.getBroadcast(this,0,newintent(Intent\u ACTION\u GRANT\u USB),0);
requestPermission(driver.getDevice(),usbPermissionIntent);
试一试{
connection=manager.openDevice(driver.getDevice());
}捕获(例外e){
textMessage+=e+“\n”;
m_textView.setText(textMessage);
}
if(连接==null){
//在此处添加UsbManager.requestPermission(driver.getDevice(),…)处理
textMessage+=“无法打开设备。\n”;
m_textView.setText(textMessage);
返回;
}
textMessage+=“设备已打开\n”;
m_textView.setText(textMessage);
UsbSerialPort port=driver.getPorts().get(0);
//大多数设备只有一个端口(端口0)
试一试{
端口。打开(连接);
端口设置参数(115200,8,UsbSerialPort.STOPPITS_1,UsbSerialPort.奇偶校验_无);
}捕获(IOE异常){
textMessage+=e+“\n”;
m_textView.setText(textMessage);
返回;
}
textMessage+=“已建立连接\n”;
m_textView.setText(textMessage);
//获取连接上接收到的数据。
整数长度=-2;
字节[]接收数据=新字节[64];
试一试{
长度=端口读取(receivedData,2000);
}捕获(例外e){
textMessage+=“Oops:+e+”\n”;
m_textView.setText(textMessage);
}
字符串数据=新字符串(接收数据);
textMessage+=“接收到的数据:“+length+”“+Data+”\n”;
m_textView.setText(textMessage);
//发送屏蔽数据。
长度=-2;
试一试{
长度=port.write(“a”.getBytes(),2000);
}捕获(例外e){
textMessage+=“Oops:+e+”\n”;
m_textView.setText(textMessage);
}
text消息+=“已发送数据”+长度+“\n”;
m_textView.setText(textMessage);
//获取接收到的数据。
长度=-2;
receivedData=新字节[64];
试一试{
长度=端口读取(receivedData,2000);
}捕获(例外e){
textMessage+=“Oops:+e+”\n”;
m_textView.setText(textMessage);
}
数据=新字符串(接收数据);
textMessage+=“接收到的数据:”+长度+“”+数据;
m_textView.setText(textMessage);
}
编辑
当我在我的端口上将DTR标志设置为true时,发生了严重崩溃
m_port = driver.getPorts().get(0);
// Most devices have just one port (port 0)
try {
m_port.setDTR(true); // <-- hard crash
m_port.open(connection);
m_port.setParameters(115200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);
} catch (IOException e) {
m_textMessage += e + "\n";
m_textView.setText(m_textMessage);
return;
}
m_port=driver.getPorts().get(0);
//大多数设备只有一个端口(端口0)
试一试{
m_port.setDTR(true);//在2000毫秒超时内未收到任何内容时,长度为0
对于像32u4这样的CDC设备,当在2000毫秒超时内没有收到任何信息时,通常必须将DTR线路设置为所述长度为0
对于像32u4这样的CDC设备,您通常必须如上所述设置DTR线路。当我设置该标志时,我会遇到硬崩溃。请参阅OP edit.Derp。setDTR
需要在端口打开后出现。当我设置该标志时,我会遇到硬崩溃。请参阅OP edit.Derp。setDTR
需要在端口打开后出现。