import库

首先在执行串口任务的MainActivity中import如下库

import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ScrollView;
import android.widget.TextView;
import android.util.Log;
import android.text.Html;
import android.widget.Toast;
import java.util.Timer;
import java.util.TimerTask;
import com.friendlyarm.FriendlyThings.HardwareControler;
import com.friendlyarm.FriendlyThings.BoardType;
import android.os.Handler;
import android.os.Message;
import android.content.Context;
import android.content.Intent;

以上为常用的必要库,其他库(如imagebutton)根据需要自行添加。


串口配置

然后在主类onCreate方法外进行串口设置的配置,如下:

//串口配置
    private String devName = "/dev/ttyAMA3";  //devName串口名 //更改为ttyAMA3:串口3(UART3)
    private int speed = 115200;   //speed波特率
    private int dataBits = 8;
    private int stopBits = 1;
    private int devfd = -1;    //devfd用于检测串口是否收发

【说明:博主使用二代friendlyARM屏,串口设置为ttyAMA3,使用其他设备请读者具体查看手册等资料了解后修改】

不妨在后头写一个关闭串口的方法:

@Override //关闭串口
    public void onDestroy() {
        timer.cancel();
        if (devfd != -1) {
            HardwareControler.close(devfd);
            devfd = -1;
        }
        super.onDestroy();
    }

串口线程

下面书写串口线程,是重点:

/*
        串口线程()
    */
    private final int BUFSIZE = 512;
    private byte[] buf = new byte[BUFSIZE];
    private Timer timer = new Timer();
    private Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 1:
                    if (HardwareControler.select(devfd, 0, 0) == 1) {
                        int retSize = HardwareControler.read(devfd, buf, BUFSIZE);
                        if (retSize > 0) {
                            /*
                                str是串口接受到的数据
                            */
                            String str = new String(buf, 0, retSize);
							/*
								在这里将str赋值给全局变量,后续可以通过这个全局变量实现串口数据的显示
							*/
                        }
                    }
                    break;
            }
            super.handleMessage(msg);
        }
    };
    private TimerTask task = new TimerTask() {
        public void run() {
            Message message = new Message();
            message.what = 1;
            handler.sendMessage(message);
        }
    };

打开串口

接下来在onCreate方法中打开串口,写:

/*
    HardwareControler.openSerialPort  打开串口
    HardwareControler.write(devfd设备名,要发送的数据);  串口发送
*/
devfd = HardwareControler.openSerialPort( devName, speed, dataBits, stopBits );

注意:

不能只写一句HardwareControler.openSerialPort( devName, speed, dataBits,
stopBits ); 必须赋值给devfd。否则devfd一直表示设备串口离线,而后面通过串口进行的收发函数均需要传入devfd参数检测设备串口是否打开。


串口发送数据

使用HardwareControler.write方法,具体如下:

String senddata = "3";
HardwareControler.write(devfd,senddata.getBytes());

实例操作

以上初步实现了串口通信,即可以通过安卓屏获取串口发来的消息,也可以使用安卓屏通过串口发送数据。

接下来,博主在这里给出项目中使用的实例,通过按钮触发显示串口接受的值

 String  str_temp;
 String  str_weet;
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_temperature);

        /*
            HardwareControler.openSerialPort  打开串口
            HardwareControler.write(devfd设备名,要发送的数据);  串口发送
        */
        HardwareControler.openSerialPort( devName, speed, dataBits, stopBits );


        Button btn_back = (Button) findViewById(R.id.temp_back_btn);   //返回按键
        btn_back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivityTemperature.this,MainActivityChoose.class);
                startActivity(intent);
            }
        });

        //按钮(触发)获取温度
        Button tempget_btn = (Button)findViewById(R.id.tempgetbtn);
        tempget_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                /*
                    动态修改Textview值,显示温度
                */
                TextView txv_temp = (TextView) findViewById(R.id.temprecieve);
                txv_temp.setText(str_temp);
            }
        });

        //按钮(触发)获取湿度
        Button weetget_btn = (Button)findViewById(R.id.weetgetbtn);
        weetget_btn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                /*
                    动态修改Textview值,显示湿度
                */
                TextView txv_weet = (TextView) findViewById(R.id.weetrecieve);
                txv_weet.setText(str_weet);
            }
        });

    }

注意:

①本程序中通过id访问(findViewById)的按钮和文本均在activity对应的xml文件中配置好。
②str_temp和str_weet需要在串口线程中赋予str值,在此处省略。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐