#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)*/
Если это не сработает, разумно сначала проверить эту передачу данных с помощью компьютерной программы, например, или проанализировать входящие «неправильные» данные.