RF 통신을 사용하는 간단한 장비 개발을 진행하게 돼, 가장 가격이 낮기도 하고 보편화됀 2.4Ghz RF 모듈을 사용하기로 했다.
위 보드를 사용하기 위해서 RF24라이브러리를 사용할때 기기마다 Write 하고 Read 하는 기기가 별도로 지정되어 있으면 별 문제가 없지만, 한 기기에서 Read/Write를 동시에 하는 경우에는 문제가 생긴다.
RF24 radio(9, 10); radio.openWritingPipe(ADMIN_ADDRESS); radio.openReadingPipe(1, RELAY_ADDRESS); radio.startListening(); if(radio.available()){ uint8_t* packet = (uint8_t*)calloc(sizeof(uint8_t), PACKET_SIZE); radio.read(packet, PACKET_SIZE); radio.writeFast(packet, PACKET_SIZE); delete[] packet; }
위와 같이 RELAY_ADDRESS로 받은 신호를 받아서 ADMIN_ADDRESS로 보내주기만 하는 코드가 있다고 가정하자, 이 경우 RF24 라이브러리에서는 수신은 가능하지만 송신은 불가능한 문제가 있다.
이 경우 writeFast의 반환값이 3번 정도는 송신에 성공했다는 true값을 반환해서 문제점을 찾기가 어렵다.
해결법은 다음과 같다.
RF24 radio(9, 10); radio.openWritingPipe(ADMIN_ADDRESS); radio.openReadingPipe(1, RELAY_ADDRESS); radio.startListening(); if(radio.available()){ uint8_t* packet = (uint8_t*)calloc(sizeof(uint8_t), PACKET_SIZE); radio.read(packet, PACKET_SIZE); this->radio.openWritingPipe(ADMIN_ADDRESS); this->radio.stopListening(); radio.writeFast(packet, PACKET_SIZE); radio.openReadingPipe(1, RELAY_ADDRESS); radio.startListening(); delete[] packet; }
보낼 때에는 stopListening() 함수를 호출해서 잠시 수신을 취소하고, 송신이 완료돼면 startListening()을 호출하여 수신을 받도록 설정하면 문제는 해결 됀다.
댓글
댓글 쓰기