android 使用 arduino 开发

android development with arduino

所以我是 Java 和 android 开发的新手。到目前为止,我一直在创建一个能够与 arduino 连接和交互的应用程序。我有一种方法能够从 arduino 中读取数据(以字节为单位),然后将数据打印为 UTF-8 中的字符串....但是,我只是希望这种方法能够读取和解释数据,并具有解释的数据可以从另一个方法调用,比如来自 android 的按钮。以下是读取数据的代码。

public class MainActivity extends AppCompatActivity {
    public final String Action_USB_Permission = "com.example.myapplication.USB_PERMISSION";
    UsbManager usbManager;
    UsbDevice device;
    UsbSerialDevice serial;
    UsbDeviceConnection connection;
    String data;
    String adata;
    TextView textView;
    Button tempButton

    UsbSerialInterface.UsbReadCallback mCallback = new UsbSerialInterface.UsbReadCallback() {
        @Override
        public void onReceivedData(byte[] arg0) {
            try {
                data = new String(arg0, "UTF-8"); //edit (removed String in "String data =" )


            } catch (UnsupportedEncodingException e) {
                e.getStackTrace();
            }
        }
    };

    // Serial codes and commands
    public void pushcmd(String command) { //command for serial
        serial.write(command.getBytes());
    }

    public void gettemp() {
        pushcmd("T\n");
        serial.read(mCallback);
        adata = data;
    }

    //This is for the app creation i think
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        usbManager = (UsbManager) getSystemService(this.USB_SERVICE);
        tempButton = (Button) findViewById(R.id.buttontemp);
    }

    public void onClickTemp(View view) { //This is the command to print data
        gettemp();
        tvAppend(textView, "\n Measured temperature \n" + adata);
    }

    private void tvAppend(TextView tv, CharSequence text) {
        final TextView ftv = tv;
        final CharSequence ftext = text;

        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                ftv.append(ftext);
            }
        });
    }
}

tvAppend 是一种在屏幕上的文本视图上打印字符串的方法。 我从 https://github.com/felHR85/UsbSerial 获得了库,它说只需用

引用它

serial.read(mcallback),我试过这个命令,但我收到一个 "measured temperaturenull",然后打印测量值,它来自 onReceivedData 方法。如果我不清楚,请提出任何建议 appreciated.Or,让我知道,我会尽力解决更多问题。

编辑:我添加了我的 tvAppend 方法,定义了一个文本视图字段和一个按钮。我还指出我没有包含整个程序,我遵循了所有关于电路的实现 http://www.allaboutcircuits.com/projects/communicate-with-your-arduino-through-android/ 再次感谢您的反馈

关于编辑的评论:当代码更改为上面的样子时。没有显示 adata,只有 "Measured temperature"。

我认为您对此处的数据流感到困惑。

  1. 您单击应用程序上的按钮
  2. 它调用 pushcmd 到 Arduino
  3. Arduino 会在未来的某个未知时间发回一些数据
  4. 您读取该数据并更新 TextView

现在,有了这个逻辑,代码的结构就可以像这样了。 (随意重新组织回您的应用程序)。

public void onClickTemp(View view) {
    gettemp();
    // No value of "adata" or "data" is guaranteed here
}

public void gettemp() {
    pushcmd("T\n");
    serial.read(mCallback); // asynchronous callback
    // No value of "adata" or "data" is guaranteed here, either
}

UsbSerialInterface.UsbReadCallback mCallback = new UsbSerialInterface.UsbReadCallback() {
    @Override
    public void onReceivedData(byte[] arg0) {
        try {
            // Here, you are guaranteed some data
            String data = new String(arg0, "UTF-8");
            tvAppend(textView, "\n Measured temperature \n" + data);
        } catch (UnsupportedEncodingException e) {
            e.getStackTrace();
        }
    }
};

或者,如果您想将所有这些都折叠成一个方法,那么

public void onClickTemp(View view) {
    pushcmd("T\n");

    serial.read(new UsbSerialInterface.UsbReadCallback() {
        @Override
        public void onReceivedData(byte[] arg0) {
            try {
                // Here, you are guaranteed some data
                String data = new String(arg0, "UTF-8");
                tvAppend(textView, "\n Measured temperature \n" + data);
            } catch (UnsupportedEncodingException e) {
                e.getStackTrace();
            }
        }
    });
}