iT邦幫忙

DAY 22
1

x86 android 設備與外部硬體溝通研究系列 第 22

x86 android 設備與外部硬體溝通研究 - ArduinoFirmata.java (22/30)

  • 分享至 

  • xImage
  •  

昨天提到調用 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 中測試,發現:

  1. 紀錄下來的訊息只有 write event , 沒有 read event
  2. 代表從啟動 firmata 後來沒有自 arduino 收到任何資料....
  3. 仔細檢查 arduino broad 上的 RX/TX LED 燈號,跟上述的狀況相符,送出控制板子的 write 資料RX 會閃爍,TX 很安靜完全沒有動作

綜合以上觀察,可以得知在android app 中的 usb serial port 是正常工作無誤,但是 arduino 不知道為什麼沒有回傳資料動作 ?

明天我們回頭來看 arduino 的 Firmata.cpp / StandaFirmata.cpp 看看「究竟什麼時候arduino才會藉由 firmata送出資料」

我們明天見


上一篇
x86 android 設備與外部硬體溝通研究 - Android USB ? (21/30)
下一篇
x86 android 設備與外部硬體溝通研究 - StandaFrimata.cpp (23/30)
系列文
x86 android 設備與外部硬體溝通研究30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言