之前使用google的串口工程,在实际使用中如果串口线掉了,或者系统不稳定会造成读不到数据或者或者读取的数据不全,从而串口卡住的情况。在google的demo中,只是使用的c语音去打开串口,操作串口读取数据还是使用java 的IO流进行读取,IO流在read的时候是没有超时处理的,所有会造成串口卡住。
最新从新用jni使用c重新写了串口调用,因为是用c取里的所以串口不会卡住,可以设置超时时间。
读取数据使用的C语言写的,代码如下:
/**
* 读数据,返回读取到的长度
* @param env
* @param instance
* @param buf_ 读取的数据装入的容器
* @param bufsize 目标长度
* @param timeout 超时时间
* @param fd 文件描述符
* @return 读取的数据长度
*/
JNIEXPORT jint JNICALL
Java_com_jyt_serial_Uart_readBuffBlock(JNIEnv *env, jobject instance, jobject buf_, jint bufSize, jint fd){
unsigned char* dd = (unsigned char*)env->GetDirectBufferAddress(buf_);
int got = 0, ret;
do {
ret = read(fd, dd+got, bufSize - got);
if (ret > 0) {
got += ret;
}
if (got >= bufSize) break;
} while (readable(fd));
return (jint)got;
}
设置波特率、数据位、停止位、流控制如下:
JNIEXPORT jboolean JNICALL
Java_com_jyt_serial_Uart_setSerialPortParams(JNIEnv *env, jobject instance, jint baudRate, jint dataBits, jint stopBits, jchar parity,jint fd) {
int speed_arr[] = {B230400, B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300,
B38400, B19200, B9600, B4800, B