package com.example.serial;
|
|
import androidx.activity.EdgeToEdge;
|
import androidx.appcompat.app.AppCompatActivity;
|
|
import android.annotation.SuppressLint;
|
import android.graphics.Color;
|
import android.graphics.Paint;
|
import android.os.Bundle;
|
import android.text.method.ScrollingMovementMethod;
|
import android.util.Log;
|
import android.view.View;
|
import android.widget.AdapterView;
|
import android.widget.ArrayAdapter;
|
import android.widget.Button;
|
import android.widget.EditText;
|
import android.widget.Spinner;
|
import android.widget.TextView;
|
import android.widget.Toast;
|
|
import com.example.serial.databinding.ActivityMainBinding;
|
|
import java.text.SimpleDateFormat;
|
import java.util.Date;
|
import java.util.TimeZone;
|
|
|
public class AdcActivity extends AppCompatActivity {
|
|
// 与串口参数相关的组件
|
private ActivityMainBinding binding;
|
private Spinner mAdcSpBaud;
|
private Spinner mAdcSpSerial;
|
private Spinner mAdcSpData;
|
private Spinner mAdcSpStop;
|
private Spinner mAdcSpParity;
|
private Spinner mAdcSpFlow;
|
private Spinner mAdcSpOperate;
|
private Spinner mAdcSpChannel;
|
|
private Button mAdcBtnSend;
|
private Button mAdcBtnOpen;
|
private Button mAdcBtnClose;
|
private Button mAdcBtnRecv;
|
private TextView mAdcRecv;
|
|
// 设置串口的参数
|
private String serial = "/dev/ttyS6";
|
private long baudRate;
|
private int dataBits;
|
private double stopBits;
|
private int parity;
|
private int flowControl; // 0:None, 1:RTS/CTS, 2:XON/XOFF
|
private String operate; // 电流or电压
|
private String channel;
|
|
// 获取已经设定的值
|
String[] serialArray;
|
String[] baudArray;
|
String[] dataArray;
|
String[] stopArray;
|
String[] parityArray;
|
String[] flowArray;
|
String[] operateArray;
|
String[] channelArray;
|
private AdcControl adcControl;
|
|
private int len = 16;
|
private int timmout = 1000;
|
|
boolean turnFlag = false;
|
|
|
@Override
|
protected void onCreate(Bundle savedInstanceState) {
|
super.onCreate(savedInstanceState);
|
setContentView(R.layout.activity_adc);
|
|
adcControl = new AdcControl();
|
// 找到控件
|
mAdcSpSerial = findViewById(R.id.adc_sp_serial);
|
mAdcSpBaud = findViewById(R.id.adc_sp_baud);
|
mAdcSpData = findViewById(R.id.adc_sp_data);
|
mAdcSpStop = findViewById(R.id.adc_sp_stop);
|
mAdcSpParity = findViewById(R.id.adc_sp_parity);
|
mAdcSpFlow = findViewById(R.id.adc_sp_flow);
|
mAdcSpOperate = findViewById(R.id.adc_sp_operate);
|
mAdcSpChannel = findViewById(R.id.adc_sp_channel);
|
|
mAdcBtnSend = findViewById(R.id.adc_btn_send);
|
mAdcBtnOpen = findViewById(R.id.adc_btn_open);
|
mAdcBtnClose = findViewById(R.id.adc_btn_close);
|
mAdcBtnRecv = findViewById(R.id.adc_btn_recv);
|
mAdcRecv = findViewById(R.id.adc_txt_rev);
|
|
// 设置并监听下拉列表
|
setSpinner(mAdcSpSerial);
|
setSpinner(mAdcSpBaud);
|
setSpinner(mAdcSpData);
|
setSpinner(mAdcSpStop);
|
setSpinner(mAdcSpParity);
|
setSpinner(mAdcSpFlow);
|
setSpinner(mAdcSpOperate);
|
setSpinner(mAdcSpChannel);
|
|
// 监听所有的button
|
setListener();
|
mAdcRecv.setMovementMethod(ScrollingMovementMethod.getInstance());
|
|
}
|
|
@Override
|
protected void onDestroy() {
|
adcControl.closeComport();
|
super.onDestroy();
|
}
|
|
private void setSpinner(Spinner spinner){
|
ArrayAdapter<CharSequence> adapter;
|
int id = spinner.getId();
|
|
if (id == R.id.adc_sp_serial){
|
adapter = ArrayAdapter.createFromResource(getApplicationContext(), R.array.adc_serial_name, android.R.layout.simple_spinner_item);
|
}else if (id == R.id.adc_sp_baud) {
|
adapter = ArrayAdapter.createFromResource(getApplicationContext(), R.array.baud_rate, android.R.layout.simple_spinner_item);
|
} else if (id == R.id.adc_sp_data) {
|
adapter = ArrayAdapter.createFromResource(getApplicationContext(), R.array.data_bits, android.R.layout.simple_spinner_item);
|
} else if (id == R.id.adc_sp_stop) {
|
adapter = ArrayAdapter.createFromResource(getApplicationContext(), R.array.stop_bits, android.R.layout.simple_spinner_item);
|
} else if (id == R.id.adc_sp_parity) {
|
adapter = ArrayAdapter.createFromResource(getApplicationContext(), R.array.parity, android.R.layout.simple_spinner_item);
|
} else if (id == R.id.adc_sp_flow) {
|
adapter = ArrayAdapter.createFromResource(getApplicationContext(), R.array.flow_control, android.R.layout.simple_spinner_item);
|
} else if (id == R.id.adc_sp_operate) {
|
adapter = ArrayAdapter.createFromResource(getApplicationContext(), R.array.adc_operate, android.R.layout.simple_spinner_item);
|
} else if (id == R.id.adc_sp_channel){
|
adapter = ArrayAdapter.createFromResource(getApplicationContext(), R.array.adc_channel, android.R.layout.simple_spinner_item);
|
} else {
|
throw new IllegalStateException("Unexpected value: " + spinner.getId());
|
}
|
adapter.setDropDownViewResource(android.R.layout.simple_spinner_item);
|
spinner.setAdapter(adapter);
|
|
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
|
@Override
|
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
|
int spinnerId = spinner.getId();
|
|
if (spinnerId == R.id.adc_sp_serial) {
|
serialArray = getResources().getStringArray(R.array.adc_serial_name);
|
serial = serialArray[position];
|
} else if (spinnerId == R.id.adc_sp_baud) {
|
baudArray = getResources().getStringArray(R.array.baud_rate);
|
baudRate = Integer.parseInt(baudArray[position]);
|
} else if (spinnerId == R.id.adc_sp_data) {
|
dataArray = getResources().getStringArray(R.array.data_bits);
|
dataBits = Integer.parseInt(dataArray[position]);
|
} else if (spinnerId == R.id.adc_sp_stop) {
|
stopArray = getResources().getStringArray(R.array.stop_bits);
|
stopBits = Double.parseDouble(stopArray[position]);
|
} else if (spinnerId == R.id.adc_sp_parity) {
|
parityArray = getResources().getStringArray(R.array.parity);
|
if (parityArray[position].equals("偶校验"))
|
parity = 2;
|
else if (parityArray[position].equals("奇校验"))
|
parity = 1;
|
else if (parityArray[position].equals("None"))
|
parity = 0;
|
} else if (spinnerId == R.id.adc_sp_flow) {
|
flowArray = getResources().getStringArray(R.array.flow_control);
|
flowControl = position;
|
} else if (spinnerId == R.id.adc_sp_operate) {
|
operateArray = getResources().getStringArray(R.array.adc_operate);
|
operate = operateArray[position];
|
} else if (spinnerId == R.id.adc_sp_channel) {
|
channelArray = getResources().getStringArray(R.array.adc_channel);
|
channel = channelArray[position];
|
} else {
|
throw new IllegalStateException("Unexpected value: " + spinner.getId());
|
}
|
}
|
@Override
|
public void onNothingSelected(AdapterView<?> parent) {
|
}
|
});
|
}
|
|
private void setListener(){
|
OnClick onClick = new OnClick();
|
mAdcBtnSend.setOnClickListener(onClick);
|
mAdcBtnOpen.setOnClickListener(onClick);
|
mAdcBtnClose.setOnClickListener(onClick);
|
mAdcBtnRecv.setOnClickListener(onClick);
|
}
|
private class OnClick implements View.OnClickListener{
|
@Override
|
public void onClick(View v) {
|
int id = v.getId();
|
if (id == R.id.adc_btn_open) {
|
if (turnFlag) {
|
Toast.makeText(getApplicationContext(), "串口已打开, 不能重复打开", Toast.LENGTH_SHORT).show();
|
}else {
|
int rv = adcControl.openComport(serial, (int) baudRate, dataBits, parity, (int) stopBits, flowControl);
|
if(rv == 1){
|
Toast.makeText(getApplicationContext(), "请添加"+serial+"的权限", Toast.LENGTH_SHORT).show();
|
}else if (rv < 0) {
|
Toast.makeText(getApplicationContext(), "打开串口失败", Toast.LENGTH_SHORT).show();
|
} else {
|
turnFlag = true;
|
Toast.makeText(getApplicationContext(), "成功打开串口"+serial, Toast.LENGTH_SHORT).show();
|
}
|
}
|
} else if (id == R.id.adc_btn_close){
|
if (!turnFlag) {
|
Toast.makeText(getApplicationContext(), "串口已关闭,不能重复关闭", Toast.LENGTH_SHORT).show();
|
}else {
|
// 关闭串口
|
int rv = adcControl.closeComport();
|
if (rv < 0) {
|
Toast.makeText(getApplicationContext(), "关闭串口失败", Toast.LENGTH_SHORT).show();
|
} else {
|
turnFlag = false;
|
Toast.makeText(getApplicationContext(), "关闭串口", Toast.LENGTH_SHORT).show();
|
}
|
}
|
}else if (id == R.id.adc_btn_send) {
|
int rv = adcControl.sendToPort(operate, channel);
|
if (rv < 0) {
|
Toast.makeText(getApplicationContext(), "发送数据失败!", Toast.LENGTH_SHORT).show();
|
}
|
Toast.makeText(getApplicationContext(), "发送数据成功", Toast.LENGTH_SHORT).show();
|
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
df.setTimeZone(TimeZone.getTimeZone("GMT+8"));
|
String date = df.format(new Date());
|
String buf = adcControl.recvFromPort(len, timmout); // 超时时间设置为 1000 ms
|
if (buf != null) {
|
String revData = date + "\t"+ "Received: " + buf;
|
mAdcRecv.append("\n" + revData);
|
mAdcRecv.invalidate();
|
mAdcRecv.requestLayout();
|
}
|
} else if (id == R.id.adc_btn_recv) {
|
mAdcRecv.setText(" ");
|
}
|
}
|
}
|
}
|