【问题标题】:FTDI Android - create new activityFTDI Android - 创建新活动
【发布时间】:2014-06-27 18:20:10
【问题描述】:

此代码能够使 android 设备成为硬件模型的 USB 主机。它还可以在 Main Activity 中正确地从硬件读取数据。但是,一旦我将其移至另一个活动,一切仍然有效,但数据读取不正确。 例如,我正在尝试将读取的数据写入文件。第一个活动是输入文件名,只需一个按钮即可发送到另一个活动。下面的代码在第二个活动中

public class Temp extends Activity {
private FileOutputStream outputStream;

public static D2xxManager ftD2xx= null;

Handler mHandler = new Handler();

FT_Device ftDev = null;
int devCount = 0;
UsbDevice device = null;
TextView Text =null;
String temp = null;

_4DPoint P = null;

 int rd = 0;
byte[] byt = null;
byte[] Fdata = null;

String outp = "";
String From_Serial = "";
int Min = -1;

String fileName;
Context c;

final Runnable updateResults = new Runnable() {

    @Override
    public void run() {
        // TODO Auto-generated method stub
         Text.setText("" + Min + '\n' + temp);          
    }
};

public void getData(){
    try {

        outputStream = openFileOutput(fileName, Context.MODE_PRIVATE);
         byt = new byte[256];//{(byte)'a','b','c','d',};
         Toast.makeText(getBaseContext(), "start " + fileName , Toast.LENGTH_LONG).show();


        Text = (TextView)findViewById(R.id.test2);

        device = (UsbDevice) getIntent().getParcelableExtra("USB");
        ftD2xx = D2xxManager.getInstance(c);
        ftD2xx.addUsbDevice(device);


        devCount = ftD2xx.createDeviceInfoList(c);
            if (devCount > 0) {
                ftDev = ftD2xx.openByUsbDevice(c, device);
            }
            if( ftDev.isOpen() == true ) {
                ftDev.setBitMode((byte)0 , D2xxManager.FT_BITMODE_RESET);
                ftDev.setBaudRate(38400);
                ftDev.setDataCharacteristics(D2xxManager.FT_DATA_BITS_8, D2xxManager.FT_STOP_BITS_1, D2xxManager.FT_PARITY_NONE);
                ftDev.setFlowControl(D2xxManager.FT_FLOW_NONE, (byte) 0x0b, (byte) 0x0d);

                Thread t = new Thread() {
                    public void run() {

                        int i;
                        while(true){
                            rd=0;

                            while (rd==0){
                                    rd = ftDev.read(byt, 14);
                            }

                            for(i=0; i<rd; i++) 
                                outp += (char)byt[i];

                            From_Serial = new String(outp);
                            P = new _4DPoint(From_Serial);
                            temp = String.format("%s: %f %f %f %f %d\n", From_Serial, P.R, P.G, P.B, P.L, P.camera);
                            try {
                                outputStream.write(temp.getBytes());
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                            outp = "";

                            mHandler.post(updateResults);
                        }
                    }
                };

                t.start();
            }
    } catch (FileNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (D2xxException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }


}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_color);
    // Show the Up button in the action bar.
    setupActionBar();
    Intent intent = getIntent();
    fileName = intent.getStringExtra("File Name");
    c = this;
    getData();
}

设置应该没问题,因为它正在从硬件读取数据,但读取的数据不正确。 另外,我想知道为什么我们需要在读取数据时创建新线程。我尝试不创建新线程,但效果不佳,但仍然不知道为什么?我试图联系编写代码以读取数据但没有回复的人。 任何帮助将不胜感激:)

【问题讨论】:

    标签: android multithreading hardware ftdi


    【解决方案1】:

    您声明您收到数据,因此我认为您应该查看您的 ftDev 设置。例如尝试设置ftDev.setBaudRate(115200)(这对我有用)或尝试使用您的其他ftDev设置一点点。

    我在程序中使用的设置是:

    int baudRate = 115200;
    byte stopBit = 1; /*1:1stop bits, 2:2 stop bits*/
    byte dataBit = 8; /*8:8bit, 7: 7bit*/
    byte parity = 0;  /* 0: none, 1: odd, 2: even, 3: mark, 4: space*/
    byte flowControl = 1; /*0:none, 1: flow control(CTS,RTS)*/
    

    如果这不起作用,明智的做法是首先使用计算机程序检查此数据通信,例如或分析传入的“错误”数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多