在工业平板中,串口是经常可以见到的,也是在工业控制中用的比较多的接口,通常就是一个工业平板通过串口连接设备进行数据的传输,所以今天我们就来学习如何在微嵌的安卓平板上实现串口的使用
串口的通信比较简单,一般设置好对应的参数即可,数据的接收是通过开启一个接收线程来实现,因为是编写一个测试程序,所以发送数据可选择单次发送和循环发送,同时也可以对接受和发送的数据进行统计,就是一个计时功能
布局和布局的代码如下,作为测试程序,页面布局比较简单,注重实用性,计时功能是在按下循环发送时即可自动计时
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<RelativeLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" >
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:weightSum="8">
<TextView
android:id="@+id/comNameText1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_marginStart="10dp"
android:text="串 口:"
android:gravity="center_vertical"
android:textSize="30sp" />
<TextView
android:id="@+id/baudText"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_marginStart="10dp"
android:text="波特率:"
android:gravity="center_vertical"
android:textSize="30sp" />
<TextView
android:id="@+id/dataText"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_marginStart="10dp"
android:text="数据位:"
android:gravity="center_vertical"
android:textSize="30sp" />
<TextView
android:id="@+id/parityText"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_marginStart="10dp"
android:text="校验位:"
android:gravity="center_vertical"
android:textSize="30sp" />
<TextView
android:id="@+id/stopText"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_marginStart="10dp"
android:text="停止位:"
android:gravity="center_vertical"
android:textSize="30sp" />
<Button
android:id="@+id/openButton"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_marginStart="10dp"
android:text="打 开"
android:textSize="30sp" />
<TextView
android:id="@+id/interval"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_marginStart="10dp"
android:text="间隔 (ms)"
android:gravity="center_vertical"
android:textSize="30sp" />
</LinearLayout>
</RelativeLayout>
<RelativeLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" >
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:weightSum="8">
<Spinner
android:id="@+id/nameSpinner"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:entries="@array/portname" />
<Spinner
android:id="@+id/baudSpinner"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:entries="@array/baud" />
<Spinner
android:id="@+id/dataSpinner"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:entries="@array/databits" />
<Spinner
android:id="@+id/paritySpinner"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:entries="@array/parity" />
<Spinner
android:id="@+id/stopSpinner"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:entries="@array/stopbits" />
<Button
android:id="@+id/closeButton"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="关 闭"
android:textSize="30sp" />
<EditText
android:id="@+id/timeEdit"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="1000"
android:textSize="25sp" />
</LinearLayout>
</RelativeLayout>
<RelativeLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="4" >
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:weightSum="8">
<EditText
android:id="@+id/receiveText"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="4"
android:editable="false"
android:scrollbars="vertical"
android:textSize="25sp" />
<EditText
android:id="@+id/sendText"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:editable="false"
android:scrollbars="vertical"
android:textSize="25sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal" >
<Button
android:id="@+id/startButton"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="循环发送"
android:textSize="28sp" />
<Button
android:id="@+id/stopButton"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="停止发送"
android:textSize="28sp" />
<Button
android:id="@+id/sendButton"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="单次发送"
android:textSize="28sp" />
<Button
android:id="@+id/clearButton"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="清 除"
android:textSize="28sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal">
<TextView
android:id="@+id/reText"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="S:0"
android:gravity="center_vertical"
android:textSize="30sp" />
<TextView
android:id="@+id/seText"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="R:0"
android:gravity="center_vertical"
android:textSize="30sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal">
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="计时:"
android:textSize="30sp"
android:gravity="center_vertical" />
<TextView
android:id="@+id/time_text"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="0时0分0秒"
android:textSize="30sp"
android:gravity="center_vertical" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
</LinearLayout>
SerialPort类的定义
public class SerialPort {
private int mFd;
public SerialPort() {
mFd = -1;
}
public void open(String path, int baud, int databits, String parity, int stopbits) {
mFd = HardwareControl.OpenSerialPort(path, baud, databits, parity, stopbits);
}
public void close() {
HardwareControl.CloseSerialPort(mFd);
}
public int read(byte[] buff, int count) {
return HardwareControl.ReadSerialPort(mFd, buff, count);
}
public int write(byte[] buff, int count) {
return HardwareControl.WriteSerialPort(mFd, buff, count);
}
}
串口打开操作
case R.id.openButton:
{
mReadThread = new ReadThread();
mReadThread.start();
readflag = true;
openBut.setEnabled(false);
closeBut.setEnabled(true);
sendBut.setEnabled(true);
startBut.setEnabled(true);
int baud = Integer.parseInt(baudSpinner.getSelectedItem().toString());
int databits = Integer.parseInt(dataSpinner.getSelectedItem().toString());
int stopbits = Integer.parseInt(stopSpinner.getSelectedItem().toString());
String parity = paritySpinner.getSelectedItem().toString();
serialPort.open(nameSpinner.getSelectedItem().toString(), baud, databits, parity, stopbits);
}
单次发送数据
case R.id.sendButton:
{
int n = sendString(sendEdit.getText().toString());
if(n > 0) {
seN += n;
onDataSent();
}
}
循环发送
case R.id.startButton:
{
stopBut.setEnabled(true);
mSendThread = new SendThread();
flag = true;
timeflag = true;
startBut.setEnabled(false);
mTimeThread = new TimeThread();
mSendThread.start();
mTimeThread.start();
}
接收数据线程
private class ReadThread extends Thread {
@Override
public void run() {
super.run();
byte[] buff = new byte[64];
while(readflag){
int n = serialPort.read(buff, buff.length);
if (n > 0) {
reN += n;
onDataReceived(buff);
}
}
}
}
循环发送数据线程
private class SendThread extends Thread {
@Override
public void run() {
super.run();
while(flag)
{
int n = sendString(sendEdit.getText().toString());
if(n > 0) {
seN += n;
onDataSent();
}
try {
SendThread.sleep(Integer.parseInt(timeEdit.getText().toString()));
} catch (NumberFormatException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
}
界面的数据不能直接在线程改
protected void onDataReceived(byte[] buffer) {
final String nbuffer = new String(buffer);
runOnUiThread(new Runnable() {
public void run() {
if (reText != null) {
reText.setText("R:" + reN);
receiveEdit.append(nbuffer);
receiveEdit.append("\r\n");
}
if (receiveEdit.getLineCount() == 50) {
receiveEdit.setText("");
}
}
});
}
protected void onDataSent() {
runOnUiThread(new Runnable() {
public void run() {
if (seText != null) {
seText.setText("S:" + seN);
}
}
});
}
串口关闭
case R.id.closeButton:
{
receiveEdit.setText("");
openBut.setEnabled(true);
closeBut.setEnabled(false);
sendBut.setEnabled(false);
stopBut.setEnabled(false);
startBut.setEnabled(false);
timeflag = false;
readflag = false;
timeM = 0;
timeH = 0;
timeS = 0;
serialPort.close();
if (mReadThread != null)
mReadThread.interrupt();
}
至此在安卓系统上是使用串口通信的基本的功能就以实现
---------------------
作者:WQFAE01
来源:CSDN
原文:https://blog.csdn.net/WQFAE01/article/details/86597386
版权声明:本文为博主原创文章,转载请附上博文链接!