我正在尝试编写一个Android应用程序,该应用程序可以通过On-The-Go(OTG)适配器连接到Arduino开发板的串行数据。我正在使用usb-serial-for-android库。我正在设置Arduino,所以如果它收到字符串“T”,那么它会发回字符串“T”。 Android的设置使它可以做同样的事情,但是如果字符串变量dataToSend不是空的,那么它会将值和“T”一起发送。我基本上希望这两个来回发送数据。这个项目的Arduino方面工作得很好,每当它接收到数据时,它就会将所有内容记录到SD卡中,如果它检测到“T”,它会发回一个“T”以告诉Android它可以再次发送。使用Android和Arduino发送和接收数据
这里是我的代码,遗憾的长度,但我觉得可能有多个地方,可能是这个问题:
public class MainActivity extends Activity {
private boolean canSend;
private boolean notInit;
private String dataToSend;
private UsbManager manager;
private SerialInputOutputManager serialIoManager;
private static UsbSerialDriver sendDriver;
private static UsbSerialDriver recDriver;
private TextView outputText;
private ExecutorService mExecutor = Executors.newSingleThreadExecutor();
private SerialInputOutputManager.Listener mListener = new SerialInputOutputManager.Listener() {
@Override
public void onRunError(Exception e) { }
@Override
public void onNewData(final byte[] data) {
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
try {
MainActivity.this.updateReceivedData(data);
} catch (IOException e) { e.printStackTrace(); }
}
});
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dataToSend = "";
notInit = true;
canSend = true;
outputText = (TextView) findViewById(R.id.textView1);
}
@Override
protected void onPause() {
super.onPause();
stopIoManager();
if (recDriver != null) {
try {
recDriver.close();
} catch (IOException e) {
// Ignore.
}
recDriver = null;
}
finish();
}
@Override
protected void onResume() {
super.onResume();
manager = (UsbManager) getSystemService(Context.USB_SERVICE);
recDriver = UsbSerialProber.acquire(manager);
if (recDriver == null) {
} else {
try {
recDriver.open();
recDriver.setBaudRate(9600);
} catch (IOException e) {
try {
recDriver.close();
} catch (IOException e2) {
// Ignore.
}
recDriver = null;
return;
}
recDriver.getClass().getSimpleName());
}
onDeviceStateChange();
}
private void stopIoManager() {
// Get UsbManager from Android.
manager = (UsbManager) getSystemService(Context.USB_SERVICE);
// Find the first available driver.
recDriver = UsbSerialProber.acquire(manager);
if (serialIoManager != null) {
Log.i("Device", "Stopping io manager ..");
serialIoManager.stop();
serialIoManager = null;
} else {
Log.d("Device", "recDriver NULL");
}
}
private void startIoManager() {
// Get UsbManager from Android.
manager = (UsbManager) getSystemService(Context.USB_SERVICE);
// Find the first available driver.
recDriver = UsbSerialProber.acquire(manager);
if (recDriver != null) {
Log.i("Device", "Starting io manager ..");
serialIoManager = new SerialInputOutputManager(recDriver, mListener);
mExecutor.submit(serialIoManager);
} else {
Log.d("Device", "recDriver NULL");
}
}
private void onDeviceStateChange() {
stopIoManager();
startIoManager();
}
protected void updateReceivedData(byte[] data) throws IOException {
//use the data
Log.d("Device", "is updating");
final String dataIn = HexDump.dumpHexString(data);
outputText.setText(dataIn);
canSend = checkForSend(dataIn);
if (canSend) {
sendData();
}
}
private boolean checkForSend (String in) {
String cur;
int len = in.length();
for (int i = 0; i < len; i++) {
cur = in.substring(i, i + 1);
if (cur.equals("T")) {
return true;
}
}
return false;
}
static void show(Context context, UsbSerialDriver driver) {
recDriver = driver;
final Intent intent = new Intent(context, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY);
context.startActivity(intent);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void requestSend(View v) {
dataToSend = "9375644603\n";
if (notInit) {
try {
sendData();
} catch (IOException e) {
e.printStackTrace();
}
}
notInit = false;
}
private void sendData() throws IOException {
// Get UsbManager from Android.
manager = (UsbManager) getSystemService(Context.USB_SERVICE);
// Find the first available driver.
sendDriver = UsbSerialProber.acquire(manager);
if (sendDriver != null) {
sendDriver.open();
try {
sendDriver.setBaudRate(9600);
dataToSend = "2345\n";
if (!dataToSend.equals("")) {
byte [] byteToSend = dataToSend.getBytes();
sendDriver.write(byteToSend, 1000);
}
dataToSend = "";
byte[] terminator = "T\n".getBytes();
sendDriver.write(terminator, 1000);
} catch (IOException e) {
// Deal with error.
} finally {
sendDriver.close();
}
}
// Get UsbManager from Android.
manager = (UsbManager) getSystemService(Context.USB_SERVICE);
// Find the first available driver.
sendDriver = UsbSerialProber.acquire(manager);
}
}
请注意,我想使用两个单独的驱动程序中相同的I/O经理。我不确定这是否会对它产生负面影响。我能够将数据发送给Arduino,而Arduino的TX发送器发送,所以我知道发送了一些东西。当SerialInputOutputManager侦听器检测到传入数据时触发的onNewData方法从不会被运行。所以我认为经理听众的驱动程序没有被正确地初始化或什么东西。
如果任何人有更好的方法通过双向USB串口在Android和Arduino之间通话,请让我知道它是什么。试图使其发挥作用,我遇到了很多麻烦。
能否请你分享我包括arduino项目在内的整个项目源代码,我试图与Android设备沟通Arduino-MegaADK。我在初学者水平。 – vicky