C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[75421] Re:TByte를 문자열로 바꿔서 출력하는 방법 질문합니다 (블루투스 관련)
빌더(TWx) [builder] 2948 읽음    2019-05-17 11:24
질문쟁이 님이 쓰신 글 :
: RAD 12.0 C++빌더로 TBluetooth에서 받아온 TByte값을 String으로 출력하고자 합니다.
:
: 지금 시도중인건 아두이노 블루투스를 사용해 제 컴퓨터가 아닌 다른 기기에 아두이노를 연결한 채로 블루투스로 정보를 주고받는것인데요,
:
: TBluetoothSocket->SendData(TEncoding::UTF8->GetByte("보낼문자열")); 라는 방식으로 코드를 짜서 컴퓨터에서 블루투스로 정보를 보내는데에는 성공했지만, 반대로 블루투스쪽에서 이쪽으로 정보를 받아오는데에는 실패했습니다.
:
: 질문은
:
: 1. 이 때 블루투스쪽에서부터 정보를 받아오는 코드는 RecieveData()인가 ReadData()인가
: 2. 두 경우 모두 TByte값으로 정보를 전송해주는데, 이걸 String이나 Char로 바꾸는 방법
:
: 입니다. TEncoding::GetChar를 쓰는게 맞는지 아닌지, 맞는 경우라면 Bytes_High는 무슨 의미를 가진 int값인지 알고싶어요.




답변:


HC-06 / 05 블루투스 모듈이 링크되어 있는 Arduino 보드가 USB로 PC에 연결되어 있는 한 측 A와
블루투스 지원하는 노트북을 한 측 B로 해서 통신을 하려고 하는 것으로 보이는데...

Arduino 보드의 USB는 시리얼포트가 없는 PC를 virtual Serial 포트로 사용하기 위한 수단을 제공하는 것에 불과하고


보드에서 펌웨어 코드를...

void loop()
{
  // BlueTooth Module -> Data -> USB Virtual Serial
  if (BTSerial.available()) {
    Serial.write(BTSerial.read());
  }
  // USB Virtual Serial -> Data -> BlueTooth Module
  if (Serial.available()) {
    BTSerial.write(Serial.read());
  }
}

위와 같은 식으로 프로그래밍 해 주면...
BT로 받은 데이타를 USB 시리얼 포트로,  USB 시리얼 포트를 통해서 받은 데이타는 BT로 전송할 수 있는 구조가 되고

따라서 B 측에서 데이타를 받을려면...
A측에 연결되어 있는 PC에선 버추얼 시리얼포트 터미널 프로그램 이용해서 데이타를 써주고
B측에선 BlueTooth 프로토콜 이용해서 아래와 같이 읽으면 됍니다.


현재 RAD 10.3 이 최신 버전인데 12.0 은 뭔 말인지?

   TBluetoothSocket *p;
   TBytes bytes = p->ReceiveData();
   Memo1->Lines->Add(TEncoding::UTF8->GetString(bytes));

RAD 10.3.1 에서 ReadData()는 deprecated API 이므로 ReceiveData()를 사용해야 하고


encoding 은 A와 B 양쪽에서 어떤 식으로 약속을 정해서 사용하는가에 따라 정해지는 거라 UTF8은 의미 없고.



참고로...

Arduino 보드에 연결해서 사용하는 HC-05 또는 HC-06 블루투스 모듈은 Rx/Tx 핀을 두고 있지만...
이 핀은 RSC-232 시그널이 아닌... 마이컴과 직접 인터페이스(회로연결)를 취할 수 있도록 하기 위해
TTL 레벨을 사용하게 회로가 설계되어 있다는 것을 반드시 알고 있어야 합니다.

간단하게 TTL 신호레벨을 RSC-232로 바꾸어주는 회로를 꾸며서 시리얼 포트에 연결해 주면...
Arduino 보드가 없더라도 HC-05 또는 HC-06 블루투스 모듈만 이용해서 통신할 수도 있는데

디지틀 회로이론에 대한 지식이 없으면
TTL 시그널 레벨을 USB Virtual Serial 로 바꾸어주는 젠더를 이용할 수도 있고요.

RSC-232 시그널과 회로 서킷에서 직접 사용되는 TTL 시그널은 하드웨어적 특성이 완전히 다른 겁니다.



Arduino 보드 없이, 블루투스 모듈을 여러개 이용해서 멀티통신도 가능한데
하나를 Master 모드로 나머지를 Slave 모드로 사용하면 되지요.

블루투스 장치를 Discovery 하는 주체 역할하는 디바이스를 Master 모드에 있다고 하고...
Discovery의 대상이 되는 역할만 하는 디바이스를 Slave 모드상태 라고 합니다.

Master/Slave 관계는 디바이스 Discovery 단계에서 중요한 역할을 하지만
일단 디바이스가 Paired 상태가 되면 구분은 의미 없게 됍니다. Discovery 프로토콜이 그래요.


VCL 프레임웍에서 지원하고 있는 Classic 블루투스 기능은...
OS에서 제공해주는 BlueTooth API와 Windows Socket 레이어를 래핑해 놓은 것에 불과 하므로
BlueTooth 프로토콜을 디테일하게 이해하면서 사용하려면 VCL사용하지 말고 Windoows OS API 이용해서
직접 프로그래밍 하는 게 더 낫습니다.

프로토콜을 이해하지 못하고 사용하면... 눈뜬 장님에게 책 읽어보라고 하는 것과 마찬가지.




+ -

관련 글 리스트
75408 TByte를 문자열로 바꿔서 출력하는 방법 질문합니다 (블루투스 관련) 질문쟁이 2561 2019/05/13
75421     Re:TByte를 문자열로 바꿔서 출력하는 방법 질문합니다 (블루투스 관련) 빌더(TWx) 2948 2019/05/17
75677         Re:Re:TByte를 문자열로 바꿔서 출력하는 방법 질문합니다 (블루투스 관련) 금목암 2009 2019/11/04
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.