#include <jni.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <termio.h>
#include <sys/types.h>
#include <sys/stat.h>
static struct termio oterm_attr;
static int baudflag_arr[] = {
B921600, B460800, B230400, B115200, B57600, B38400,
B19200, B9600, B4800, B2400, B1800, B1200,
B600, B300, B150, B110, B75, B50
};
static int speed_arr[] = {
921600, 460800, 230400, 115200, 57600, 38400,
19200, 9600, 4800, 2400, 1800, 1200,
600, 300, 150, 110, 75, 50
};
static int speed_to_flag(int speed)
{
int i;
for (i = 0; i < sizeof(speed_arr)/sizeof(int); i++) {
if (speed == speed_arr[i]) {
return baudflag_arr[i];
}
}
return B115200;
}
JNIEXPORT jint JNICALL Java_com_up_Uart_OpenUartPort(JNIEnv *env, jobject obj, jstring ttyS0, jint baud)
{
struct termio term_attr;
int fd;
memset(&oterm_attr, 0, sizeof(struct termio));
memset(&term_attr, 0, sizeof(struct termio));
char *str = NULL;
str = (*env)->GetStringUTFChars(env, ttyS0, 0);
fd = open(str, O_RDWR, 0);
if (fd < 0) {
return -1;
}
if (ioctl(fd, TCGETA, &term_attr) < 0) {
return -1;
}
memcpy(&oterm_attr, &term_attr, sizeof(struct termio));
term_attr.c_iflag &= ~(INLCR | IGNCR | ICRNL | ISTRIP);
term_attr.c_oflag &= ~(OPOST | ONLCR | OCRNL);
term_attr.c_lflag &= ~(ISIG | ECHO | ICANON | NOFLSH);
term_attr.c_cflag &= ~CBAUD;
term_attr.c_cflag |= CREAD | speed_to_flag(baud);
term_attr.c_cflag &= ~(CSIZE);
term_attr.c_cflag |= CS8;//databit:8
term_attr.c_cflag &= ~(PARENB);//no parity
term_attr.c_cflag &= ~CSTOPB;//stopbit:1
term_attr.c_cc[VMIN] = 1;
term_attr.c_cc[VTIME] = 0;
if(ioctl(fd, TCSETAW, &term_attr) < 0){
return -1;
}
if (ioctl(fd, TCFLSH, 2) < 0) {
return -1;
}
return fd;
}
JNIEXPORT jstring JNICALL Java_com_up_Uart_UartReset(JNIEnv *env, jobject obj, jint fd)
{
if (ioctl(fd, TCSETAW, &oterm_attr) < 0){
return (*env)->NewStringUTF(env, "reset failed!");
}
return (*env)->NewStringUTF(env, "reset seccuss!");
}
JNIEXPORT jstring JNICALL Java_com_up_Uart_UartClose(JNIEnv *env, jobject obj, jint fd)
{
if (ioctl(fd, TCSETAW, &oterm_attr) < 0){
return (*env)->NewStringUTF(env, "reset failed!");
}
close(fd);
return (*env)->NewStringUTF(env, "uart closed success!");
}
JNIEXPORT jint JNICALL Java_com_up_Uart_UartRecv(JNIEnv *env, jobject obj, jint fd, jbyteArray buffs, jint len)
{
int ret = 0;
int sum = 0;
int i = 0, j = 0;
//char* mybuff = (char*)env->GetByteArrayElements(buffs, 0)
jbyte *temp = (*env)->GetByteArrayElements(env, buffs, 0);
char *mybuff = (char *)temp;
char *str = (char*)malloc(4);
memset(mybuff, 0, len);
while(1){
memset(str, 0, 4);
ret = read(fd, str, 4);
sum += ret;
for(j=0; j<ret; j++){
if(i == len){
goto retur;
}
mybuff[i++] = str[j];
}
if(sum >= len){
goto retur;
}
if((ret <= 1024) && ((mybuff[i-1] == '\0') || (mybuff[i-1] == '\n'))){
//if (mybuff[0] == 0x51) || mybuff[0] == 0x52 || mybuff[0] == 0x53 || mybuff[0] == 0x54)
goto retur;
}
//这里逻辑还有些问题,把<4 和=4俩种情况分开判断
}
retur:
free(str);
return sum;
}
JNIEXPORT jint JNICALL Java_com_up_Uart_UartSend(JNIEnv *env, jobject obj, jint fd, jstring buff, jint len)
{
int ret = 0;
char *str = (*env)->GetStringUTFChars(env, buff, 0);
while((len-ret) > 0){
ret += write(fd, str, len-ret);
}
// (*env)->ReleaseStringUTFChars(env, buff, str);
return ret;
}