Skip to content

Commit 31131a2

Browse files
committed
增加可配置数据位、校验位、停止位
1 parent f8db3c6 commit 31131a2

File tree

15 files changed

+394
-202
lines changed

15 files changed

+394
-202
lines changed

README.md

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ allprojects {
2525
}
2626
2727
dependencies {
28-
implementation 'com.github.licheedev:Modbus4Android:1.0.1'
28+
implementation 'com.github.licheedev:Modbus4Android:2.0.0'
2929
}
3030
3131
```
@@ -67,8 +67,34 @@ public class ModbusManager extends ModbusWorker {
6767

6868
### 开启设备
6969
```java
70-
ModbusParam serialParam =
71-
SerialParam.create(devicePath, baudrate).setTimeout(1000).setRetries(0); // 不重试
70+
ModbusParam param;
71+
72+
if (mMode == MODE_SERIAL) {
73+
// 串口
74+
String path = mDevicePaths[mDeviceIndex];
75+
int baudrate = mBaudrates[mBaudrateIndex];
76+
77+
mDeviceConfig.updateSerialConfig(path, baudrate);
78+
param = SerialParam.create(path, baudrate) // 串口地址和波特率
79+
.setDataBits(mDataBits) // 数据位
80+
.setParity(mParity) // 校验位
81+
.setStopBits(mStopBits) // 停止位
82+
.setTimeout(1000).setRetries(0); // 不重试
83+
} else {
84+
// TCP
85+
String host = mEtHost.getText().toString().trim();
86+
int port = 0;
87+
try {
88+
port = Integer.parseInt(mEtPort.getText().toString().trim());
89+
} catch (NumberFormatException e) {
90+
//e.printStackTrace();
91+
}
92+
param = TcpParam.create(host, port)
93+
.setTimeout(1000)
94+
.setRetries(0)
95+
.setEncapsulated(false)
96+
.setKeepAlive(true);
97+
}
7298

7399
ModbusManager.get().closeModbusMaster(); // 先关闭一下
74100
ModbusManager.get().init(serialParam, new ModbusCallback<ModbusMaster>() {

app/build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ dependencies {
3939
// rx
4040
implementation 'com.trello.rxlifecycle2:rxlifecycle-components:2.1.0'
4141

42+
// 屏幕适配
43+
implementation 'com.github.licheedev:AdaptScreen:1.0.0'
44+
4245

4346
// 黄油刀
4447
implementation 'com.jakewharton:butterknife:8.8.1'

app/src/main/java/com/licheedev/demo/App.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.licheedev.demo;
22

33
import android.app.Application;
4-
import com.licheedev.demo.base.AdaptScreenUtils;
4+
import com.licheedev.adaptscreen.AdaptScreenEx;
55
import com.licheedev.demo.base.PrefUtil;
66
import com.serotonin.modbus4j.ModbusConfig;
77

@@ -13,7 +13,8 @@ public class App extends Application {
1313
public void onCreate() {
1414
super.onCreate();
1515
sInstance = this;
16-
AdaptScreenUtils.init(this);
16+
// 屏幕适配
17+
AdaptScreenEx.init(this);
1718
PrefUtil.init(this);
1819

1920
configModbus();

app/src/main/java/com/licheedev/demo/MainActivity.java

Lines changed: 128 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import android.widget.Button;
1010
import android.widget.CheckBox;
1111
import android.widget.EditText;
12+
import android.widget.ImageButton;
1213
import android.widget.LinearLayout;
1314
import android.widget.RadioButton;
1415
import android.widget.TextView;
@@ -53,8 +54,8 @@ public class MainActivity extends BaseActivity {
5354
NiceSpinner mSpinnerBaudrate;
5455
@BindView(R.id.btn_switch)
5556
Button mBtnSwitch;
56-
@BindView(R.id.area_device)
57-
LinearLayout mAreaDevice;
57+
@BindView(R.id.area_serial)
58+
LinearLayout mAreaSerial;
5859
@BindView(R.id.label_fun)
5960
TextView mLabelFun;
6061
@BindView(R.id.rb_func01)
@@ -113,6 +114,17 @@ public class MainActivity extends BaseActivity {
113114
Button mBtnSwitchTcp;
114115
@BindView(R.id.area_tcp)
115116
LinearLayout mAreaTcp;
117+
@BindView(R.id.spinner_databits)
118+
NiceSpinner mSpinnerDatabits;
119+
@BindView(R.id.spinner_parity)
120+
NiceSpinner mSpinnerParity;
121+
@BindView(R.id.spinner_stopbits)
122+
NiceSpinner mSpinnerStopbits;
123+
@BindView(R.id.area_serial2)
124+
LinearLayout mAreaSerial2;
125+
@BindView(R.id.btn_more_params)
126+
ImageButton mBtnMoreParams;
127+
116128
private String[] mDevicePaths;
117129
private String[] mBaudrateStrs;
118130
private DeviceConfig mDeviceConfig;
@@ -129,6 +141,9 @@ public class MainActivity extends BaseActivity {
129141
public static final int MODE_SERIAL = 1;
130142
public static final int MODE_TCP = 2;
131143
private int mMode;
144+
private int mDataBits;
145+
private int mParity;
146+
private int mStopBits;
132147

133148
@IntDef({
134149
MODE_SERIAL, MODE_TCP
@@ -160,17 +175,23 @@ public void onCheckedChanged(XRadioGroup xRadioGroup, int i) {
160175

161176
onRadioGroupUpdate(mRgFunc.getCheckedRadioButtonId());
162177

178+
initSerialWidgets();
179+
180+
updateDeviceSwitchButton();
181+
updateMoreParamsButtonImage();
182+
}
183+
184+
/**
185+
* 初始化串口相关的控件
186+
*/
187+
private void initSerialWidgets() {
163188
mDeviceConfig = DeviceConfig.get();
164189
mDevicePaths = mDeviceConfig.getDevicePaths();
165190
mBaudrateStrs = mDeviceConfig.getBaudrateStrs();
166191
mBaudrates = mDeviceConfig.getBaudrates();
167192

193+
// 串口地址选择
168194
mSpinnerDevices.attachDataSource(Arrays.asList(mDevicePaths));
169-
mSpinnerBaudrate.attachDataSource(Arrays.asList(mBaudrateStrs));
170-
171-
mDeviceIndex = mDeviceConfig.findDeviceIndex(mDeviceConfig.getDevice());
172-
mBaudrateIndex = mDeviceConfig.findBaudrateIndex(mDeviceConfig.getBaudrate());
173-
174195
mSpinnerDevices.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
175196
@Override
176197
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
@@ -182,7 +203,11 @@ public void onNothingSelected(AdapterView<?> parent) {
182203

183204
}
184205
});
206+
mDeviceIndex = mDeviceConfig.findDeviceIndex(mDeviceConfig.getDevice());
207+
mSpinnerDevices.setSelectedIndex(mDeviceIndex);
185208

209+
// 波特率选择
210+
mSpinnerBaudrate.attachDataSource(Arrays.asList(mBaudrateStrs));
186211
mSpinnerBaudrate.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
187212
@Override
188213
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
@@ -194,29 +219,83 @@ public void onNothingSelected(AdapterView<?> parent) {
194219

195220
}
196221
});
197-
198-
mSpinnerDevices.setSelectedIndex(mDeviceIndex);
222+
mBaudrateIndex = mDeviceConfig.findBaudrateIndex(mDeviceConfig.getBaudrate());
199223
mSpinnerBaudrate.setSelectedIndex(mBaudrateIndex);
200224

201-
updateDeviceSwitchButton();
225+
// 数据位
226+
final int[] dataBitsArray = { 5, 6, 7, 8 };
227+
mSpinnerDatabits.attachDataSource(Arrays.asList("5", "6", "7", "8"));
228+
mSpinnerDatabits.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
229+
@Override
230+
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
231+
mDataBits = dataBitsArray[position];
232+
}
233+
234+
@Override
235+
public void onNothingSelected(AdapterView<?> parent) {
236+
237+
}
238+
});
239+
mDataBits = dataBitsArray[3];
240+
mSpinnerDatabits.setSelectedIndex(3);
241+
242+
// 校验位
243+
final int[] parityArray = { 0, 1, 2 };
244+
mSpinnerParity.attachDataSource(Arrays.asList("0 (NONE)", "1 (ODD)", "2 (EVEN)"));
245+
mSpinnerParity.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
246+
@Override
247+
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
248+
mParity = parityArray[position];
249+
}
250+
251+
@Override
252+
public void onNothingSelected(AdapterView<?> parent) {
253+
254+
}
255+
});
256+
mParity = parityArray[0];
257+
mSpinnerParity.setSelectedIndex(0);
258+
259+
// 停止位
260+
final int[] stopBitsArray = { 1, 2 };
261+
mSpinnerStopbits.attachDataSource(Arrays.asList("1", "2"));
262+
mSpinnerStopbits.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
263+
@Override
264+
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
265+
mStopBits = stopBitsArray[position];
266+
}
267+
268+
@Override
269+
public void onNothingSelected(AdapterView<?> parent) {
270+
271+
}
272+
});
273+
mStopBits = stopBitsArray[0];
274+
mSpinnerStopbits.setSelectedIndex(0);
202275
}
203276

204277
private void resolveIntent(Bundle savedInstanceState) {
205278
Intent intent = getIntent();
206279
mMode = intent.getIntExtra("mode", MODE_SERIAL);
207280
if (savedInstanceState != null) {
208281
mMode = savedInstanceState.getInt("mode", MODE_SERIAL);
282+
//mDataBits = savedInstanceState.getInt("dataBits", 8);
283+
//mParity = savedInstanceState.getInt("parity", 0);
284+
//mStopBits = savedInstanceState.getInt("stopBits", 1);
209285
}
210286

211287
LogPlus.e("mode=" + mMode);
212288

213-
mAreaDevice.setVisibility(mMode == MODE_SERIAL ? View.VISIBLE : View.GONE);
289+
mAreaSerial.setVisibility(mMode == MODE_SERIAL ? View.VISIBLE : View.GONE);
214290
mAreaTcp.setVisibility(mMode == MODE_TCP ? View.VISIBLE : View.GONE);
215291
}
216292

217293
@Override
218294
protected void onSaveInstanceState(Bundle outState) {
219295
outState.putInt("mode", mMode);
296+
//outState.putInt("dataBits", mDataBits);
297+
//outState.putInt("parity", mParity);
298+
//outState.putInt("stopBits", mStopBits);
220299
super.onSaveInstanceState(outState);
221300
}
222301

@@ -227,10 +306,22 @@ protected void onDestroy() {
227306
}
228307

229308
@OnClick({
230-
R.id.btn_switch, R.id.btn_send, R.id.btn_clear_record, R.id.btn_switch_tcp
309+
R.id.btn_switch, R.id.btn_send, R.id.btn_clear_record, R.id.btn_switch_tcp,
310+
R.id.btn_more_params
231311
})
232312
public void onClick(View view) {
233313
switch (view.getId()) {
314+
case R.id.btn_more_params: {
315+
316+
if (mAreaSerial2.getVisibility() == View.VISIBLE) {
317+
mAreaSerial2.setVisibility(View.GONE);
318+
} else {
319+
mAreaSerial2.setVisibility(View.VISIBLE);
320+
}
321+
322+
updateMoreParamsButtonImage();
323+
break;
324+
}
234325
case R.id.btn_switch:
235326
case R.id.btn_switch_tcp:
236327
openDevice();
@@ -244,6 +335,15 @@ public void onClick(View view) {
244335
}
245336
}
246337

338+
/**
339+
* 更新更多参数按钮的图标
340+
*/
341+
private void updateMoreParamsButtonImage() {
342+
mBtnMoreParams.setImageResource(mAreaSerial2.getVisibility() == View.VISIBLE
343+
? R.drawable.ic_keyboard_arrow_up_black_32dp
344+
: R.drawable.ic_keyboard_arrow_down_black_32dp);
345+
}
346+
247347
/**
248348
* 打开设备
249349
*/
@@ -263,7 +363,11 @@ private void openDevice() {
263363
int baudrate = mBaudrates[mBaudrateIndex];
264364

265365
mDeviceConfig.updateSerialConfig(path, baudrate);
266-
param = SerialParam.create(path, baudrate).setTimeout(1000).setRetries(0); // 不重试
366+
param = SerialParam.create(path, baudrate) // 串口地址和波特率
367+
.setDataBits(mDataBits) // 数据位
368+
.setParity(mParity) // 校验位
369+
.setStopBits(mStopBits) // 停止位
370+
.setTimeout(1000).setRetries(0); // 不重试
267371
} else {
268372
// TCP
269373
String host = mEtHost.getText().toString().trim();
@@ -303,10 +407,16 @@ public void onFinally() {
303407
* 切换界面状态
304408
*/
305409
private void updateDeviceSwitchButton() {
306-
if (ModbusManager.get().isModbusOpened()) {
410+
boolean modbusOpened = ModbusManager.get().isModbusOpened();
411+
412+
if (modbusOpened) {
307413
mBtnSwitch.setText("断开");
308414
mSpinnerDevices.setEnabled(false);
309415
mSpinnerBaudrate.setEnabled(false);
416+
mAreaSerial2.setEnabled(false);
417+
mSpinnerDatabits.setEnabled(false);
418+
mSpinnerParity.setEnabled(false);
419+
mSpinnerStopbits.setEnabled(false);
310420

311421
mBtnSwitchTcp.setText("断开");
312422
mEtHost.setEnabled(false);
@@ -317,6 +427,10 @@ private void updateDeviceSwitchButton() {
317427
mBtnSwitch.setText("连接");
318428
mSpinnerDevices.setEnabled(true);
319429
mSpinnerBaudrate.setEnabled(true);
430+
mAreaSerial2.setEnabled(true);
431+
mSpinnerDatabits.setEnabled(true);
432+
mSpinnerParity.setEnabled(true);
433+
mSpinnerStopbits.setEnabled(true);
320434

321435
mBtnSwitchTcp.setText("连接");
322436
mEtHost.setEnabled(true);
@@ -373,7 +487,6 @@ private void appendError(String func, Throwable tr) {
373487
private void appendText(String text) {
374488
mTvConsole.append(text);
375489
}
376-
377490

378491
private void send01() {
379492

0 commit comments

Comments
 (0)