본문 바로가기
안드로이드

[Android] 안드로이드 PC RS232 사용법 (CD-RK3288-01)

by 코딩히어로 2022. 9. 6.
728x90

1


오늘은 개발에서 사용했던 CD-RK3288-01 미니 PC 모델 RS232 포팅 방법에 대해 포스팅하도록 하겠습니다

대부분 미니PC는 USB 단자를 통해 RS232가 포팅이 되어 사용되지만 해당 모델처럼

RS232 단자가 별도로 구성되어 있는 보드의 경우에는 별도로 포팅을 진행해야 사용이 가능합니다

2

제가 사용했던 CD-RK3288-01 모델은 RS485, RS232 등등 다양한 단자를 지원하기 때문에

산업기술개발 측면에서는 일반적인 USB만 있는 미니 PC보다는 전문적인 프로그램에 적합합니다

USB 포트가 3개 지원되지만 왼쪽 하단에 있는 232 포트를 사용할 수 있도록 설정해보도록 하겠습니다


AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.cleardisplay.yjaircleaner"
    android:sharedUserId="android.uid.system"> <!-- 이 라인 추가!! />

해당 sharedUserId를 통해 CD-RK3288-01 보드에서는 해당 232 포트를 허용할 수 있게 됩니다

android.uid.system은 제조사에서 제공하는 232포트 설정 파일을 적용했을 때 필요합니다

해당 라인은 삭제해도 프로그램이 실행되는데 문제가 없지만 그럴경우 232 포트는 사용할 수 없습니다

<uses-permission
    android:name="android.permission.REBOOT"
    tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.SET_TIME"
    tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="com.google.android.things.permission.USE_PERIPHERAL_IO" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission
    android:name="android.permission.WRITE_SETTINGS"
    tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

다음으로 어플에 필요한 권한 설정을 진행합니다

34

제조사에서 전달된 232설정 파일인 Smatek 폴더를 프로젝트 폴더에 복사합니다

두 번째로 serial_lib_100.arr 파일을 libs폴더에 복사해주면 설정은 마무리됩니다

 


build.gradle(:app)

android {
    compileSdk 31

    defaultConfig {

        ...
    }
    signingConfigs{
        release {
            storeFile file("../Smatek/platform.jks")
            storePassword 'android'
            keyAlias 'androiddebugkey'
            keyPassword 'android'
        }
    }
    signingConfigs{
        debug {
            storeFile file("../Smatek/platform.jks")
            storePassword 'android'
            keyAlias 'androiddebugkey'
            keyPassword 'android'
        }
    }
    ...
}

앱 수준의 빌드 파일에 Smatek에 있는 jks파일의 정보를 입력합니다

이 부분이 없으면 위에 설정을 했더라도 232 설정 파일에 접근이 불가능합니다

dependencies {
    ...
    implementation files('libs/serial_lib_100.aar')
}

dependencies를 추가하여 serial_lib_100.arr 파일의 경로를 설정합니다

 


MainActivity.class

SerialPort serialPort = null;
InputStream inputStream;
OutputStream outputStream;
SerialThread serialThread;

private boolean m_bSerialPortStat = false;

class SerialThread extends Thread{
    @Override
    public void run(){
        while(true){
            try{
                byte[] buffer = new byte[64];
                int size = inputStream.read(buffer);
                if(size > 0) OnReceiveData(buffer,size);
            } catch(IOException ex){
                ex.printStackTrace();
            }
        }
    }
}

@Override
protected void onResume() {
    super.onResume();
    ReOpenSerialPort();
}

public void ReOpenSerialPort(){
    try{
        if(m_bSerialPortStat != false){
            SerialPortClose();
            Thread.sleep(10);
            SerialPortOpen();
        }
    } catch(Exception ex){
        SingletonUtil.getInstance().ShowLog(ex.getMessage());
    }
}

public void SerialPortOpen(){
    try{
        if(serialPort == null){
            serialPort = new SerialPort(new File("/dev/ttyS3"),9600,0);
        }
        if(serialPort != null){
            inputStream = serialPort.getInputStream();
            outputStream = serialPort.getOutputStream();
            serialThread = new SerialThread();
            serialThread.start();
            m_bSerialPortStat = true;
        }
    } catch (Exception ex){
        Log.d("@combatspirit",ex.getMessage());
    }
}

private void WriteToSerialPort(byte[] bCmd){
    try{
        outputStream.write(bCmd);
    } catch (Exception ex){
        SingletonUtil.getInstance().ShowLog(ex.getMessage());
    }
}

public void SerialPortClose(){
    try{
        if(serialPort != null){
            serialPort.close();
            serialPort = null;
            serialThread.interrupt();
            serialThread = null;
            m_bSerialPortStat = false;
        }
    } catch(Exception ex){
        SingletonUtil.getInstance().ShowLog(ex.getMessage());
    }
}

public void OnReceiveData(byte[] buffer,int nSize){
        StringBuilder stringBuilder = new StringBuilder();
        for(int i = 0 ; i < nSize ; i++){
            stringBuilder.append(String.format("%02x ",buffer[i]));
        }
        Log.d("@Example",stringBuilder.toString());
}

위 코드를 복사하신 다음에 MainActivity Oncreate에서 SerialPortOpen() 함수를 호출하시면

232 포트가 세팅되고 OnReceiveData를 통해 데이터 입력을 받을 수 있습니다

위 설정에서 232 설정 파일이 필요하신 분은 별도로 말씀해주시면 보내드리겠습니다

 

728x90
반응형

댓글