我正在编写一个通过UART与传感器设备进行通信的android应用。设备根据以下格式的4字符ASCII命令将数据发送到电话:
“:” [char1] [char2] [Carriage_return](例如,“:AB \ r”)
我有两个活动,CalculationActivity和UartActivity。
CalculationActivity需要从UartActivity获取三个不同的传感器读数,并使用它们进行某些计算。例如,
CalculationActivity:
protected void onCreate(Bundle savedInstanceState){
// blah, blah, blah...
Intent i = new Intent(this, UartActivity.class);
startActivityForResult(i, DATA_REQUEST);
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == DATA_REQUEST) {
if (resultCode == RESULT_OK) {
string sensor_data_distance = data.getStringExtra("distance");
//need these also:
//string sensor_data_heading = data.getStringExtra("heading");
//string sensor_data_elevation = data.getStringExtra("elevation");
//...
//parse the strings and perform calculation
//...
}
}
}
}
UartActivity将命令发送到设备。接收到它们后,设备将回显请求的数据,而我的RX回显处理程序将其捕获。例如,
UartActivity:
protected void onCreate(Bundle savedInstanceState){
// setup and initialize UART
String get_distance_command = ":DI\r"; //command for distance
String get_heading_command = ":HE\r"; //command for heading
String get_elevation_command = ":EL\r"; //command for elevation
uartSendData(get_distance_command); //send command to TX handler
//want to be able to send these other two:
//uartSendData(get_heading_command);
//uartSendData(get_elevation_command);
}
@Override
public synchronized void onDataAvailable(){ //RX echo handler
//blah, blah, blah...
//get received bytes
final String result_string = bytesToText(bytes);
Intent i = new Intent();
i.putExtra("distance", result_string);
//want to be able to do this for the other two:
//i.putExtra("heading", result_string);
//i.putExtra("elevation", result_string);
setResult(UartActivity.RESULT_OK);
finish();
}
希望您可以从注释掉的代码行中推断出我要在此处完成的工作。请注意,我只能成功获得一个读数(在这种情况下为距离),但不能超过一个读数(在这种情况下为航向和海拔)。
我考虑过使用每个命令在三个不同的时间启动UartActivity,但我真的不喜欢这种解决方案。我宁愿只运行一次活动,发送三个命令,捕获所有回显响应,然后将它们传递回CalculationActivity。这有可能吗?
最佳答案
您在setResult中缺少returnIntent。
尝试更换
setResult(UartActivity.RESULT_OK);
与
setResult(UartActivity.RESULT_OK, i);