FTDI Android — создать новое действие

#android #multithreading #hardware #ftdi

#Android #многопоточность #аппаратное обеспечение #ftdi

Вопрос:

Этот код способен превратить устройство Android в USB-хост для аппаратной модели. Он также может правильно считывать данные с оборудования в основной деятельности. Однако, как только я переместил его в другое действие, все по-прежнему работает, но чтение данных неверно. Например, я пытаюсь записать прочитанные данные в файл. Первое действие — ввести имя файла и просто нажать кнопку для отправки в другое действие. Приведенный ниже код относится ко второму действию

 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 %dn", 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();
}
 

Настройка должна быть в порядке, поскольку она считывает данные с оборудования, но считываемые данные неверны.
Кроме того, мне интересно, зачем нам нужно создавать новый поток при чтении данных. Я пытался не создавать новый поток, и это не сработало, но до сих пор не понимаю, почему? Я попытался связаться с человеком, который написал код для чтения данных, но ответа не получил.
Любая помощь была бы очень признательна 🙂

Ответ №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)*/
 

Если это не сработает, разумно сначала проверить эту передачу данных с помощью компьютерной программы, например, или проанализировать входящие «неправильные» данные.