본문 바로가기
심화캡스톤

JSerialComm 라이브러리 이용하여 자바와 아두이노 시리얼 통신 하는법

by Enhydra lutris 2023. 6. 29.

프로젝트 초반에 사용하던 rxtx라이브러리는 실행할때 dll파일 경로 설정을 해줘야 하고, 8버전 보다 높은 자바를 사용하면 작동이 안되는 문제가 있다.  (관련된 오류는 아래 링크를 참고 하면된다.)

따라서 JSerialComm 라이브러리로 교체해서 진행하게 되었다.

기존에 rxtx라이브러리를 사용하여 프로젝트를 진행했다면 포트와 연결하는 부분만 교체하면 다른 코드는 그대로 사용가능하다.(포트 연결부분은 다르지만 둘다 inpustream과 outputstream을 사용하기 때문)

 

https://seaotter.tistory.com/68

 

인텔리제이 자바 아두이노 rxtx 오류 Execution failed for task ':Main.main()'.> Process 'command 'C:/Program Files/Ja

인텔리제이 아두이노 rxtx오류 Execution failed for task ':Main.main()'. > Process 'command 'C:/Program Files/Java/jdk-11/bin/java.exe'' finished with non-zero exit value 1 rxtx는 dll 파일도 있어야 실행할 수 있는 라이브러리다.

seaotter.tistory.com

https://seaotter.tistory.com/69

 

인텔리제이 자바 아두이노 rxtx 오류 / 자바 버전 오류

# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000180005b00, pid=4056, tid=11932 # # JRE version: Java(TM) SE Runtime Environment 18.9 (11.0.18+9) (build 11.0.18+9-LTS-195) # Java VM: Java HotSpot(TM) 64-Bit Server VM 18.9 (11.0.18+9-LTS-195, mixed

seaotter.tistory.com

JSerialComm 라이브러리 사용방법

1.  maven을 사용하고 있다면 pom.xml에 아래 코드 추가

<dependencies>
    <dependency>
        <groupId>com.fazecast</groupId>
        <artifactId>jSerialComm</artifactId>
        <version>2.6.2</version>
    </dependency>
</dependencies>

gradle을 사용하고 있다면 build.gradle에 아래 코드 추가

dependencies {
    implementation 'com.fazecast:jSerialComm:2.6.2'
}

 

2.  아래와 같이 송신 수신 코드를 짠다

시리얼 통신으로 송수신 할때는 byte로 변환하여 하기 때문에 숫자도 그냥 String으로 써서 byte로 변환 시켜도 된다.

import com.fazecast.jSerialComm.*;

public class SerialRun {
    public static void main(String[] args) {
        SerialPort serialPort = SerialPort.getCommPort("COM7"); //COM7 부분에 본인이 사용하는 시리얼 포트 넣기
        
        if (serialPort.openPort()) {
            System.out.println("connect");

            //RX
            Thread readThread = new Thread(() -> {
                byte[] buffer = new byte[1024];
                while (serialPort.isOpen()) {
                    int numRead = serialPort.readBytes(buffer, buffer.length);
                    if (numRead > 0) {
                        String data = new String(buffer, 0, numRead);
                        System.out.println("수신 데이터: " + data);
                    }
                }
            });
            readThread.start();

            //TX
            Stirng sendData = "1";
            serialPort.writeBytes(sendData.getBytes(), sendData.length());

            serialPort.closePort(); //포트 닫기
        } else {
            System.out.println("connection failed");
        }
    }
}

 

3. 아두이노에서 송신 수신 하는 코드를 짠다.

1을 수신 받으면 led를 켜고, 1234를 송신 하는 코드다.

int ledPin = 8; // LED연결한 핀 번호

void setup() {
    Serial.begin(9600); // 시리얼 통신 속도
    pinMode(ledPin, OUTPUT); // LED 핀을 출력 모드
}

void loop() {
   //RX
    if (Serial.available() > 0) {
        int receivedData = Serial.parseInt(); // 시리얼로부터 정수 데이터 읽기
        if (receivedData >= 0) {
            if (receivedData == 1) { // 받아온 값이 1일때만 LED 켜기
                digitalWrite(ledPin, HIGH); 
            } else {
                digitalWrite(ledPin, LOW);
            }
        }
    }
    
    //TX
    Serial.printLn("1234"); //1234를 송신
}

 

위코드를 돌려보면 자바에서 수신한 값이 나눠져서 출력되는 문제가 발생할 수도 있다.

관련 문제는 아래 포스팅을 참고 하면된다.

https://seaotter.tistory.com/86

 

그리고 나는 자동 급식기, 자동 급수기를 둘다 제작했기 때문에 멀티 스레드를 이용하여 한번에 여러개의 아두이노와 통신이 가능하도록 코드를 수정하였다. 관련 내용은 아래 포스팅을 참고 하면 된다.

https://seaotter.tistory.com/87

댓글