昨天提到調用 readDigital / readAnalog 後,我們不知道為什麼讀不到資料。
從今天起我們一起來追 ArduinoFrimata 這個package 的sourcecode , 嘗試找出為什麼。
我們先在ArduinoFirmata.java中加入以下片段
private int MsgLogCnt =0;
public String MsgLog="";
public String GetLog(){
return MsgLog;
}
public void SetLog(String Msg) {
MsgLogCnt++;
MsgLog += "\n" + MsgLogCnt + ":" + Msg;
if (MsgLogCnt >= 100) { // 超過 100 筆就清空
MsgLogCnt = 0;
MsgLog = "";
}
}
// 目的是能夠紀錄由USB SERIAL PORT READ / WRITE 動作的所有數據
// 然後我們到 connect() method 中 processInput() 後面加入以下這段
//我們希望在 usb.read 後的資料能夠紀錄到 msg stack 中,方便外面的 UI 撈出來看
int size = usb.read(buf, 100);
if (size > 0) {
for (int i = 0; i < size; i++) {
processInput(buf[i]);
SetLog("Read:"+String.valueOf(buf[i])); // 加這行
}
}
Thread.sleep(10);
//然後修改 write method
public void write(byte[] writeData) {
try {
if (this.isOpen()){
int size;
size = writeData.length;
String TempStr="";
for(int i=0;i<size;i++){
TempStr += Byte.toString(writeData[i]);
}
SetLog("Write:"+TempStr);
// 把傳入的 byte array , 依序轉為 string 並黏接起來丟到 msg stack 中,標記為 write event,
this.usb.write(writeData, 100);
}
} catch (IOException e) {
this.close();
if (handler != null)
handler.onClose();
}
}
添加上述 code 之後我們回到我們的 sensor app project
記得要把上面的 ArduinoFrimata project 用我們好幾週前教的技巧 export 封裝為 JAR library 並丟到原本 app 專案的 ./lib 資料夾中取代原本的ArduinoFrimata.jar檔案
回到 MainActivity.java 中,我們試著把剛剛儲存的READ/WRITE資訊印出來
USBMSG = (TextView) this.findViewById(R.id.USBMSG);
// 在原本的 Thread 中修改
Thread.sleep(100);
handler.post(new Runnable() {
public void run() {
USBMSG.setText(ThreadCount +" : "+ arduino.GetLog()); // 添加這段,把資料印出來
int analog_value = arduino.analogRead(0);
boolean digital_value = arduino.digitalRead(7);
Variable_resistor.setText(ThreadCount +" : analogRead(0) = "+ String.valueOf(analog_value));
Variable_resistor.setTextSize(10 + (float) analog_value / 10);
Variable_resistor2.setText(ThreadCount +" : digitalRead(7) = "+ String.valueOf(digital_value));
}
});
在 activity_main.xml 中添加下面的資訊
//activity_main.xml
<ScrollView
android:id="@+id/scrollView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/seekBar1"
android:layout_below="@+id/Variable_resistor2">
<TextView
android:id="@+id/USBMSG"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="" />
</ScrollView>
做了上列的修改後,我們把APP丟到android 中測試,發現:
綜合以上觀察,可以得知在android app 中的 usb serial port 是正常工作無誤,但是 arduino 不知道為什麼沒有回傳資料動作 ?
明天我們回頭來看 arduino 的 Firmata.cpp / StandaFirmata.cpp 看看「究竟什麼時候arduino才會藉由 firmata送出資料」
我們明天見