在android中如何将usb串行数据连续传输到外部设备?
我正在设计一个usb接口的应用程序,我有一个usb cdc设备,我想用我的android funbook p280进行通信。。我以前成功地制作了一个应用程序,使用按钮传输数据来完成上述任务。。但现在,当我尝试对连续传输执行相同操作时,我的应用程序崩溃了。我尝试过使用单独的线程,现在是异步的,但一切都失败了。。我正在使用在中找到的cdc库 我的代码如下:在android中如何将usb串行数据连续传输到外部设备?,android,serial-port,usb,data-transfer,Android,Serial Port,Usb,Data Transfer,我正在设计一个usb接口的应用程序,我有一个usb cdc设备,我想用我的android funbook p280进行通信。。我以前成功地制作了一个应用程序,使用按钮传输数据来完成上述任务。。但现在,当我尝试对连续传输执行相同操作时,我的应用程序崩溃了。我尝试过使用单独的线程,现在是异步的,但一切都失败了。。我正在使用在中找到的cdc库 我的代码如下: package com.example.dds; import com.hoho.android.usbserial.driver.CdcA
package com.example.dds;
import com.hoho.android.usbserial.driver.CdcAcmSerialDriver;
import com.hoho.android.usbserial.driver.UsbSerialDriver;
import android.graphics.Typeface;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.animation.RotateAnimation;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Iterator;
public class DDS extends Activity {
RelativeLayout astep,fstep,aknob,fknob;
UsbManager manager;
ImageView amstep,fqstep,ampknob,freqknob;
String str= "SET:WAVE:SIN\n";
Iterator<UsbDevice> deviceIterator;
UsbDevice dev;
UsbSerialDriver driver;
double mPrevAngle=0,mCurrAngle=0;
TextView freqdisp,ampdisp;
float x=0,y=0,startAngle=0,stopAngle=250;
Thread th;
asyncrun a;
IntentFilter usbattach,usbdetach;
//My Broadcast Receiver to detect usb
BroadcastReceiver usbbr =new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent)
{
if(intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_ATTACHED))
{
//Normal Usb Enumeration
manager = (UsbManager) getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
deviceIterator = deviceList.values().iterator();
while(deviceIterator.hasNext())
{
dev = deviceIterator.next();
}
if(dev.getProductId()==64905)
{
Toast t=Toast.makeText(getBaseContext(),"Device Connected",1000);
t.show();
Object params = 0;
a.doInBackground(params);
}
}
else if(intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_DETACHED))
{
dev=null;
Toast t=Toast.makeText(getBaseContext(),"Device Not Connected",1000);
t.show();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//IntentFilters for attach and detach action
usbattach = new IntentFilter(UsbManager.ACTION_USB_DEVICE_ATTACHED);
usbdetach = new IntentFilter(UsbManager.ACTION_USB_DEVICE_DETACHED);
}
@Override
protected void onPause()
{
super.onPause();
this.unregisterReceiver(usbbr);
}
@Override
protected void onResume()
{
super.onResume();
//Registering IntentFilters for Usb attach and detach
this.registerReceiver(usbbr, usbattach);
this.registerReceiver(usbbr, usbdetach);
}
//My AsyncTask subclass
public class asyncrun extends AsyncTask{
@Override
protected Object doInBackground(Object... params) {
//Transferring data to usb, These functions below work fine for an OnClick
//but for Continous transfer like async they crash..
try
{
driver.open();
driver.setBaudRate(115200);
byte[] buffer = encodeUTF8(str);
byte[] buff = new byte[160];
driver.read(buff,100);
driver.write(buffer,100);
str = "";
while(driver.read(buff,100)> 0)
{
str = str + decodeUTF8(buff);
}
ampdisp.setText(""+str);
} catch(IOException e)
{
e.printStackTrace();
}
return null;
}
}
package com.example.dds;
导入com.hoho.android.usbserial.driver.CdcAcmSerialDriver;
导入com.hoho.android.usbserial.driver.UsbSerialDriver;
导入android.graphics.Typeface;
导入android.hardware.usb.UsbDevice;
导入android.hardware.usb.UsbDeviceConnection;
导入android.hardware.usb.UsbManager;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.view.MotionEvent;
导入android.view.view;
导入android.view.Window;
导入android.view.animation.RotateAnimation;
导入android.widget.Button;
导入android.widget.EditText;
导入android.widget.ImageView;
导入android.widget.RelativeLayout;
导入android.widget.TextView;
导入android.widget.Toast;
导入android.app.Activity;
导入android.content.BroadcastReceiver;
导入android.content.Context;
导入android.content.Intent;
导入android.content.IntentFilter;
导入java.io.IOException;
导入java.nio.charset.charset;
导入java.util.HashMap;
导入java.util.Iterator;
公共类DDS扩展活动{
相对的astep、fstep、aknob、fknob;
美国海军陆战队经理;
ImageView amstep、fqstep、AMP旋钮、FREQ旋钮;
String str=“SET:WAVE:SIN\n”;
迭代器设备迭代器;
usbdevicedev;
美国航空驾驶员;
双MPREVERANGLE=0,mCurrAngle=0;
TextView freqdisp,ampdisp;
浮点数x=0,y=0,星形角=0,停止角=250;
螺纹th;
异步运行a;
意向过滤器usbattach、usbdetach;
//我的广播接收器可以检测usb
BroadcastReceiver usbbr=新的BroadcastReceiver(){
@凌驾
公共void onReceive(上下文、意图)
{
if(intent.getAction().equals(UsbManager.ACTION\u USB\u设备\u已连接))
{
//普通Usb枚举
manager=(UsbManager)getSystemService(Context.USB_服务);
HashMap deviceList=manager.getDeviceList();
deviceIterator=deviceList.values().iterator();
while(deviceIterator.hasNext())
{
dev=deviceIterator.next();
}
if(dev.getProductId()==64905)
{
Toast t=Toast.makeText(getBaseContext(),“设备已连接”,1000);
t、 show();
对象参数=0;
a、 doInBackground(params);
}
}
else if(intent.getAction().equals(UsbManager.ACTION\u USB\u DEVICE\u分离))
{
dev=null;
Toast t=Toast.makeText(getBaseContext(),“设备未连接”,1000);
t、 show();
}
}
};
@凌驾
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//用于附加和分离操作的IntentFilter
usbattach=新的IntentFilter(已连接UsbManager.ACTION\u USB\u设备);
usbdetach=新的意向过滤器(UsbManager.ACTION\u USB\u DEVICE\u已分离);
}
@凌驾
受保护的void onPause()
{
super.onPause();
这是未注册接收人(usbbr);
}
@凌驾
受保护的void onResume()
{
super.onResume();
//注册用于Usb连接和分离的IntentFilter
这是注册接收者(usbbr、usbattach);
本注册接收服务器(usbbr、usbdetach);
}
//我的AsyncTask子类
公共类asyncrun扩展了AsyncTask{
@凌驾
受保护对象doInBackground(对象…参数){
//将数据传输到usb,以下这些功能在OnClick中运行良好
//但是对于像异步这样的连续传输,它们会崩溃。。
尝试
{
driver.open();
驾驶人的死亡率(115200);
字节[]缓冲区=编码UTF8(str);
字节[]buff=新字节[160];
驱动程序读取(buff,100);
驱动程序写入(缓冲区,100);
str=“”;
while(驱动程序读取(buff,100)>0)
{
str=str+decodeUTF8(buff);
}
ampdisp.setText(“+str”);
}捕获(IOE异常)
{
e、 printStackTrace();
}
返回null;
}
}
查看AsyncTask的其他示例我认为您不应该通过从活动中调用a.doInBackground()来启动AsyncTask。相反,请尝试a.execute();如下所述: