Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在android中如何将usb串行数据连续传输到外部设备?_Android_Serial Port_Usb_Data Transfer - Fatal编程技术网

在android中如何将usb串行数据连续传输到外部设备?

在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

我正在设计一个usb接口的应用程序,我有一个usb cdc设备,我想用我的android funbook p280进行通信。。我以前成功地制作了一个应用程序,使用按钮传输数据来完成上述任务。。但现在,当我尝试对连续传输执行相同操作时,我的应用程序崩溃了。我尝试过使用单独的线程,现在是异步的,但一切都失败了。。我正在使用在中找到的cdc库

我的代码如下:

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();如下所述: