一、串口通信原理
串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节。
串口用于ASCII码字符的传输。通信使用3根线完成,分别是地线(GND)、发送(TX)、接收(RX)。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须和通讯协议保持一致;
二、串口通信实现
1.项目配置
SerialPort 包名必须一致
启动串口
public static SerialConnection getInstance() {
return instance;
}
public void register(Handler mHander) {
this.mHandler = mHander;
}
/**
* 启动串口接受信息
*/
public void startSerial(int rate) {
lodg("[startSerial]......rate===>" + rate);
try {
//三个参数 1.哪个口 2.波特率 3.校验方式
mSerialPort = new SerialPort(new File("/dev/ttyS1"), rate, 'o');
} catch (Exception e) {
lodg("[startSerial]......e===>" + e.toString());
}
if (mSerialPort != null) {
mInputStream = mSerialPort.getInputStream();
mOutputStream = mSerialPort.getOutputStream();
}
mRecvThread = new RecvThread();
mRecvThread.start();
}
class RecvThread extends Thread {
private boolean mExit = false;
@Override
public void run() {
while (!mExit) {
receiveSerial();
}
}
public void exit() {
mExit = true;
}
}
/**
* 接受串口信息
*/
private void receiveSerial() {
try {
if (mInputStream != null) {
int len = mInputStream.read(mUartReadBuffer);
if (len > 0) {
String serialStr = byte2String(mUartReadBuffer, len);
lodg("serialStr: ===>" + serialStr);
if (serialStr.length() > 0 && !serialStr.equals("00")) {
dispatchCmds(serialStr);
}
}
}
} catch (Exception e) {
lodg("[receiveSerial]......e===>" + e.toString());
}
}
发送串口信息
/**
* 发送串口信息
*
* @param cmd
*/
public void sendSerial(final String cmd) {
lodg("[sendSerial].....cmd===>" + cmd);
new Thread() {
@Override
public void run() {
super.run();
byte[] test = hexStringToBytes(cmd);
try {
if (mOutputStream != null) {
mOutputStream.write(test);
mOutputStream.flush();
}
} catch (Exception e1) {
e1.printStackTrace();
}
}
}.start();
}
电脑调试串口工具
所需文件以及串口调试工具下载