Skip to content

Commit

Permalink
Merge pull request #1 from evision-ai/feat/set-read-delay-when-initia…
Browse files Browse the repository at this point in the history
…lizing-serial-port-manager

allow user to set read delay when initializing serial port manager
  • Loading branch information
sabrinachen321 authored Apr 13, 2021
2 parents 2943683 + a7076ab commit cc34b68
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,12 @@
import java.io.FileOutputStream;
import java.io.IOException;


/**
* Created by Kongqw on 2017/11/13.
* Updated by wenshuoc on 2021/04/13.
* SerialPortManager
*/

public class SerialPortManager extends SerialPort {

private static final String TAG = SerialPortManager.class.getSimpleName();
Expand All @@ -33,6 +34,16 @@ public class SerialPortManager extends SerialPort {
private Handler mSendingHandler;
private SerialPortReadThread mSerialPortReadThread;

private final int mReadDelay;

public SerialPortManager(int readDelay) {
mReadDelay = readDelay;
}

public SerialPortManager() {
this(0);
}

/**
* 打开串口
*
Expand Down Expand Up @@ -180,7 +191,7 @@ private void stopSendThread() {
* 开启接收消息的线程
*/
private void startReadThread() {
mSerialPortReadThread = new SerialPortReadThread(mFileInputStream) {
mSerialPortReadThread = new SerialPortReadThread(mFileInputStream, mReadDelay) {
@Override
public void onDataReceived(byte[] bytes) {
if (null != mOnSerialPortDataListener) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,30 @@
import java.io.IOException;
import java.io.InputStream;


/**
* Created by Kongqw on 2017/11/14.
* Updated by wenshuoc on 2021/04/13.
* 串口消息读取线程
*/

public abstract class SerialPortReadThread extends Thread {

public abstract void onDataReceived(byte[] bytes);

private static final String TAG = SerialPortReadThread.class.getSimpleName();
private InputStream mInputStream;
private byte[] mReadBuffer;
private final byte[] mReadBuffer;
private final int mReadDelay;

public SerialPortReadThread(InputStream inputStream) {
/**
* 初始化读串口的线程
* @param inputStream 串口文件的输入流
* @param readDelay 读取过程中的延迟(ms)
*/
public SerialPortReadThread(InputStream inputStream, int readDelay) {
mInputStream = inputStream;
mReadBuffer = new byte[1024];
mReadDelay = readDelay;
}

@Override
Expand All @@ -29,16 +37,24 @@ public void run() {

while (!isInterrupted()) {
try {
Log.i(TAG, "run: ");
while (mInputStream != null && mInputStream.available() == 0) {
// Do nothing
if (mInputStream != null && mInputStream.available() == 0) {
// 如果输入流有效但是没有输入值,便重新等待输入
continue;
}
if (null == mInputStream) {
// 输入流为null说明线程结束了,直接退出
return;
}
Thread.sleep(750);
int size = mInputStream.read(mReadBuffer);
// 输入流产生了输入值,可以开始读取

// 有的串口发送程序会产生一定的延迟,直接读取会导致串口消息分段
// 因此需要根据设置情况等待一段时间,保证发送端将消息发送完毕
if (mReadDelay > 0) {
Thread.sleep(mReadDelay);
}

// 读取串口输入
int size = mInputStream.read(mReadBuffer);
if (-1 == size || 0 >= size) {
return;
}
Expand All @@ -49,7 +65,6 @@ public void run() {

Log.i(TAG, "run: readBytes = " + new String(readBytes));
onDataReceived(readBytes);

} catch (IOException e) {
e.printStackTrace();
return;
Expand Down Expand Up @@ -78,6 +93,6 @@ public void release() {
e.printStackTrace();
}
}

}

}

0 comments on commit cc34b68

Please sign in to comment.