【AndroidStudio】【App开发】【上位机串口通信】FriendlyARM安卓app开发经验——如何实现上位机(安卓屏)的串口通信
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库
首先在执行串口任务的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值,在此处省略。
更多推荐
所有评论(0)