오늘은 개발에서 사용했던 CD-RK3288-01 미니 PC 모델 RS232 포팅 방법에 대해 포스팅하도록 하겠습니다
대부분 미니PC는 USB 단자를 통해 RS232가 포팅이 되어 사용되지만 해당 모델처럼
RS232 단자가 별도로 구성되어 있는 보드의 경우에는 별도로 포팅을 진행해야 사용이 가능합니다
제가 사용했던 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" />
다음으로 어플에 필요한 권한 설정을 진행합니다
제조사에서 전달된 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 설정 파일이 필요하신 분은 별도로 말씀해주시면 보내드리겠습니다
'안드로이드' 카테고리의 다른 글
[Android] 어플 재시작 방법 (6) | 2022.09.12 |
---|---|
[Android] IllegalThreadStateException 에러 해결 (5) | 2022.09.06 |
[Android] FCM 알림 구현 (2) | 2022.08.31 |
[Android] Thread 사용하기 (2) | 2022.08.30 |
[Android] 소수점 자릿수를 정하는 String.format (2) | 2022.08.19 |
댓글