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 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(" "); } } } }