最近在开发一个安卓板子与设备通过串口连接实现设备数据接收及控制的项目。用安卓开发板上的3pin的TTL串口和仪器相连接。常规的关于安卓串口编程的问题网上已有很多,在此不赘述。
当调试设备时,根据仪器的通讯协议向仪器发送相关命令,但发现无法接收到对应的返回数据包,串口是正常打开的,命令也能正常发送。经过检查后,发现是因为串口连接的问题。安卓开发板上的3pin串口和仪器的接出线都分别是GND、RXD和TXD的,对于这种串口的连接其实是有两种方式的,一种是正接(即G接G,R接R,T接T),但还有一种方式!就是交叉接(没人告诉我还可以这么玩,直到搞硬件的同事问我有试过交叉接没),即G接G,R接T,T接R。
更改为交叉接之后,问题解决。串口能够实现正常通讯。
实现正常通讯后,打印日记查看数据收发情况,又出现了一个头疼的问题,一开始数据正常收发,我是每秒发送一个指令来获取数据,有时候在前二三十秒的时候正常,然后就出现只发不收的情况,这个时间是随机的,运气好能到100多秒的时候才异常。然而这个问题很致命,无法接收数据的安卓板子不是一块好的安卓板。通过检查没发现是什么原因。直到我在代码中改了一句话,程序就正常收发了……
/*
* 接收串口返回的数据包
* Reverse:July-04-2019
*/
private void receiveThread() {
// 接收
receiveThread = new Thread() {
@Override
public void run() {
while (flag) {
int size = 0;
try {
//*************这是原来的代码****************
//if (mInputStream == null){
//Log.i("test", "啥都没收到!");
//return;}
//*********************************************
//*****************************这是修改后的**********************************
if(mInputStream.available()>0 == false){
continue;
}
//******************************************************************************
size = mInputStream.read(mBuffer);
if (size > 0) {
//String recinfo = DataProcess.bytes2HexString(mBuffer);
Log.i("test", "接收到串口信息:" + DataProcess.bytes2HexString(mBuffer));
}
} catch (IOException e) {
Log.i("test", "接收失败。。。");
e.printStackTrace();
}
}
}
};
receiveThread.start();
}
记录下这个问题,以后方便查看,也希望能帮到别人,希望天堂里安卓和串口没有在一起。