From c351e407ed77ca39d1520a197fbebdc58a5b5c97 Mon Sep 17 00:00:00 2001 From: Matthew Date: Sun, 31 Mar 2024 13:04:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E6=B1=9F=E8=8B=8F=E8=A7=84?= =?UTF-8?q?=E7=BA=A6=E4=B8=8A=E4=BC=A0=E7=9F=AD=E8=A7=86=E9=A2=91=E5=B9=B6?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=B2=E5=8F=A3=E8=AE=BF=E9=97=AE=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/CMakeLists.txt | 3 + app/src/main/cpp/SerialPort.cpp | 162 ++++++++++++++++++++++++++++++++ app/src/main/cpp/SerialPort.h | 21 +++++ 3 files changed, 186 insertions(+) create mode 100644 app/src/main/cpp/SerialPort.cpp create mode 100644 app/src/main/cpp/SerialPort.h diff --git a/app/src/main/cpp/CMakeLists.txt b/app/src/main/cpp/CMakeLists.txt index 99700c11..6f0fa676 100644 --- a/app/src/main/cpp/CMakeLists.txt +++ b/app/src/main/cpp/CMakeLists.txt @@ -28,6 +28,7 @@ add_definitions(-DASIO_STANDALONE) add_definitions(-DUSING_XY_EXTENSION) # add_definitions(-DUSING_BREAK_PAD) add_definitions(-DSQLITE_THREADSAFE=1) +add_definitions(-DHAVE_STRING_H) # for memcpy in md5.c # set(OpenCV_DIR D:/Workspace/deps/OpenCV-android-sdk/sdk/native/jni/) set(OPENCV_EXTRA_MODULES_PATH D:/Workspace/Github/opencv_contrib/modules) @@ -293,6 +294,7 @@ add_library( # Sets the name of the library. Camera2Reader.cpp TextPaint.cpp CvText.cpp + SerialPort.cpp ncnn/yolov5ncnn.cpp @@ -318,6 +320,7 @@ add_library( # Sets the name of the library. ${TERM_CORE_ROOT}/TimerThread.cpp ${TERM_CORE_ROOT}/Template.cpp ${TERM_CORE_ROOT}/Utils.cpp + ${TERM_CORE_ROOT}/md5.c ${TERM_CORE_ROOT}/Client/TerminalService.cpp ${TERM_CORE_ROOT}/Client/Terminal.cpp ${TERM_CORE_ROOT}/Client/Terminal_HN.cpp diff --git a/app/src/main/cpp/SerialPort.cpp b/app/src/main/cpp/SerialPort.cpp new file mode 100644 index 00000000..1fc29e11 --- /dev/null +++ b/app/src/main/cpp/SerialPort.cpp @@ -0,0 +1,162 @@ + +#include +#include +#include +#include +#include +#include + +#include "SerialPort.h" + +#include "android/log.h" + +#ifdef DEPENDING_GPIO +#include "GPIOControl.h" +#endif + +static const char *TAG = "serial_port"; +#define LOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO, TAG, fmt, ##args) +#define LOGD(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, TAG, fmt, ##args) +#define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, TAG, fmt, ##args) + +/* +static speed_t getBaudrate(int baudrate) +{ + switch(baudrate) { + case 0: return B0; + case 50: return B50; + case 75: return B75; + case 110: return B110; + case 134: return B134; + case 150: return B150; + case 200: return B200; + case 300: return B300; + case 600: return B600; + case 1200: return B1200; + case 1800: return B1800; + case 2400: return B2400; + case 4800: return B4800; + case 9600: return B9600; + case 19200: return B19200; + case 38400: return B38400; + case 57600: return B57600; + case 115200: return B115200; + case 230400: return B230400; + case 460800: return B460800; + case 500000: return B500000; + case 576000: return B576000; + case 921600: return B921600; + case 1000000: return B1000000; + case 1152000: return B1152000; + case 1500000: return B1500000; + case 2000000: return B2000000; + case 2500000: return B2500000; + case 3000000: return B3000000; + case 3500000: return B3500000; + case 4000000: return B4000000; + default: return -1; + } +} +*/ + +bool CSerialPort::Open(const char* path, speed_t baudrate, int stopBits, int dataBits, int parity, int flowCon, int flags) +{ + if (baudrate == -1) { + return false; + } + + /* Opening device */ + { + fd = open(path, O_RDWR | flags); + if (fd == -1) { + return false; + } + } + + /* Configure device */ + { + struct termios cfg; + if (tcgetattr(fd, &cfg)) + { + close(fd); + return false; + } + + cfmakeraw(&cfg); + cfsetispeed(&cfg, baudrate); + cfsetospeed(&cfg, baudrate); + + cfg.c_cflag &= ~CSIZE; + switch (dataBits) { + case CS5: + case CS6: + case CS7: + case CS8: + cfg.c_cflag |= dataBits; //使用8位数据位 + break; + default: + cfg.c_cflag |= CS8; + break; + } + + switch (parity) { + case 0: + cfg.c_cflag &= ~PARENB; //无奇偶校验 + break; + case 1: + cfg.c_cflag |= (PARODD | PARENB); //奇校验 + break; + case 2: + cfg.c_iflag &= ~(IGNPAR | PARMRK); // 偶校验 + cfg.c_iflag |= INPCK; + cfg.c_cflag |= PARENB; + cfg.c_cflag &= ~PARODD; + break; + default: + cfg.c_cflag &= ~PARENB; + break; + } + + switch (stopBits) { + case 1: + cfg.c_cflag &= ~CSTOPB; //1位停止位 + break; + case 2: + cfg.c_cflag |= CSTOPB; //2位停止位 + break; + default: + break; + } + + // hardware flow control + switch (flowCon) { + case 0: + cfg.c_cflag &= ~CRTSCTS; //不使用流控 + break; + case 1: + cfg.c_cflag |= CRTSCTS; //硬件流控 + break; + case 2: + cfg.c_cflag |= IXON | IXOFF | IXANY; //软件流控 + break; + default: + cfg.c_cflag &= ~CRTSCTS; + break; + } + + + if (tcsetattr(fd, TCSANOW, &cfg)) { + LOGE("tcsetattr() failed"); + close(fd); + /* TODO: throw an exception */ + return false; + } + } + + return true; +} + +void CSerialPort::Close() +{ + close(fd); +} \ No newline at end of file diff --git a/app/src/main/cpp/SerialPort.h b/app/src/main/cpp/SerialPort.h new file mode 100644 index 00000000..b11c2e4d --- /dev/null +++ b/app/src/main/cpp/SerialPort.h @@ -0,0 +1,21 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class android_serialport_SerialPort */ + +#ifndef __SERIALPORT_H__ +#define __SERIALPORT_H__ + +#include + +class CSerialPort +{ +public: + bool Open(const char* path, speed_t baudrate, int stopBits, int dataBits, int parity, int flowCon, int flags); + + void Close(); + +private: + int fd; +}; + +#endif // __SERIALPORT_H__