serial 통신

2018. 7. 8. 15:38HARDWARE/Arduino

Serial 통신 클래스
:아두이노 보트와 컴퓨터 또는 다른 장치와의 통신에 사용된다.
모든 아두이노 보드에는 최소 한개의 시리얼 포트(UART 또는 USART)를 가지며 
Serial이라고 한다. 
디지털 핀 0(Rx) 과 핀 1(Tx)을 사용한 통신은 USB를 통해 컴퓨터와도 통신을 할 수가 있다.
그러므로 이 함수를 사용하면 1번과 0번핀은 디지털 입력 및 출력 핀으로 사용할 수 없다.
 
아두이노 보드와의 통신을 위해 내장된 아두이노 시리얼 모니터 환경을 이용할 수 있다.
툴바에 있는 시리얼 모니터 버튼을 누르고 begin()에서 지정한 값과 동일한 보레이트 값을 지정하면 된다.
 
아두이노 메가(Arduino Mega)는 세개의 시리얼 포트를 더 가지고 있다:
Serial1은 19번(Rx)과 18번(Tx),
Serial2는 17번(Tx)과 16번(Tx),
Serial3는 15번(Tx)과 14번(Rx)에 있다.
이 핀을 컴퓨터와의 통신에 이용하려면, Mega의 USB-to-sefial어댑터에 연결할 수 없기 때문에 USB-to-serial 어댑터를 별도로 구비해야 한다.
이 포트들은 다른 외부의 TTL 시리얼 장치에 연렬하려면 Tx핀을 다른 장치의 Rx핀에 연결하고 Rx핀은 다른 장치의 Tx핀에 연결하고
Mega의 접지를 다른 장치의 접지에 연결하여야 한다. 
이 핀을 R232 핀에 직접 연결하면 안된다. RS232는 +/- 12V로 아두이노보드가 손상될 수도 있다.

함수


begin()
시리얼 데이터 통신에서 초당 전송 비트수(baud)를 설정한다.

컴퓨터와의 통신을 위해서는 다음 비율중의 하나를 사용한다: 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 및 115200. 그러나 특정 값을 정해 주어야 한다. 예를 들어 핀0과 1을 통해 통신하려면 특정한 보레이트 값을 지정해 주어야 한다. 

Serial.begin(속도);
다음은 Arduino Mega에서만 동작한다.
Serial1.begin(속도);
 Serial2.begin(속도);
Serial3.begin(속도);

결과값: 없음

void setup() {

Serial.begin(9600); //시리얼 포트를 열고, 9600 bps로 설정


void loop() {}


아두이노 메가 예
void setup(){ Serial.begin(9600); Serial1.begin(38400); Serial2.begin(19200); Serial3.begin(4800); Serial.println("Hello Computer"); Serial1.println("Hello Serial 1"); Serial2.println("Hello Serial 2"); Serial3.println("Hello Serial 3"); } void loop() {}



end()
시리얼 통신을 사용하지 않도록 하여 Tx 및 Rx 핀을 디지털 입출력 핀으로 사용할 수 있도록 한다.
 시리얼 통신을 위해서는 Serial.begin()을 불러야 한다. 
구문
Serial.end(); 


아두이노 메가에서만,
Serial1.end();
Serial2.end();
Serial3.end();
파라메터와 반환 값은 없다.


available();

시리얼 포트에서 읽을 수 있는 몇개의 바이트(문자들)을 가져온다. 
이 데이터는 시리얼 수신버퍼에 이미 도착하여 저장된 것이다.

구문
Serial.available();
 아두이노 메가 만
Serial1.available();
 Serial2.available(); Serial3.available();
파라매터: 없음
결과값: 읽을 수 있는 바이트의 
 

int incomingByte = 0; // 도착한 문자열을 입력 버퍼
 void setup() { Serial.begin(9600); // 시리얼 포트를 열과, 데이터 전송률을 9600bps 설정 } void loop() { if (Serial.available() > 0) { // 데이터를 입력 받았을 경우에만 : incomingByte = Serial.read(); // 입력 데이터를 받고 // 수신 상활을 알림 Serial.print("I received: "); Serial.println(incomingByte, DEC); } }


read()

 : 입력된 시리얼 데이터를 읽는다.


  구문

  Serial.read();

  아두이노 메가에만 해당되는 사항

    Serial1.read();

    Serial2.read();

    Serial3.read();


  파라메터: 없음

  반환값

    입력된 데이터의 첫번째 바이트 (데이터가 없다면 -1). 정수형(int)


  

    int incomingByte = 0;  // 입력된 데이터를 위해 준비된 정수형 변수

    void setup() {

Serial.begin(9600); // 시리얼 포트를 열고데이터 전송 속도를 9600 bps로 설정

  } 


   void loop() {

if (Serial.available() > 0) {  // 수신 데이터가 있을 때에만 데이터를 보낸다:

incomingByte = Serial.read();  // 입력 데이터를 읽는다:

Serial.print("I received: "); // 데이터가 수신되었음을 알린다

Serial.println(incomingByte, DEC); // 받은 데이터를 시리얼 포트를 통해 전송한다.

}

   }


peek()

 : 입력된 시리얼 데이터에서 다음 바이트(문자)를 읽어 돌려 주지만, 내부 시리얼 버퍼에서 제거하지는 않는다.

   그러므로 연속되어 peek()로 읽게되면 같은 문자를 돌려준다. 다음 read()를 불러야 한다.


  구문

  Serial.peek();


  아두이노 메가에만 해당되는 사항

   Serial1.peek();

   Serial2.peek();

   Serial3.peek();

  파라메터: 없음

  반환값

    입력된 데이터의 첫번째 바이트 (데이터가 없다면 -1). 정수형(int)


flush();

 : 입력된 시리얼 버퍼의 데이터를 모두 비운다. 이것은 Serial.read()나 Serial.available()을 호출하면 

최근의 Serial.flush() 를 호출한 이후에 수신된 데이터를 가져오는 것이다.


  구문

     Serial.flush();


  아두이노 메가에만 해당되는 사항

     Serial1.flush();

     Serial2.flush();

     Serial3.flush();


  파라메터: 없음

  반환값: 없음



print();

  데이터를 시리얼 포트에 ㅅ람이 읽을 수 있는 ASCII문자열로 보낸다. 이 명령은 많은 형태가 있다.

  숫자는 각 숫자에 대한 ASCII를 사용하여 프린트한다. 

  소수점 숫자는 ASCII 숫자로 비슷하게 프린트한다. 기본값은 두자리 소수이다.

  바이트는 한개의 문자로 전송한다.

  문자들과 문자열은 그 자체로 보낸다.

 다음은 여러가지 예이다.

  Serial.print(78);     // "78"이 출력된다.

  Serial.print(1.2345);   // "1.23"

  Serial.print(byte(78)); // "N",   78 의 ASCII 코드는 "N"이다.

  Serial.print('N'); // "N"

  Serial.print("Hello world."); // "Hello world"


옵션으로 사용되는 두번 째 파라메터는 사용할 단위의 기본이 된다. 

허용값은 BYTE, BIN(이진 또는 밑이 2), OCT (8진수, 밑이 8), DEC(십진수, 밑이 10), HEX(16진수, 밑이 16)이다.
부동 소수점에서는 이 파라메터로 사용하고자 하는 십진수의 위치를 지정해야 한다.


예를 들면:
Serial.print(78, BYTE) "N" 출력
Serial.print(78, BIN) "1001110" 출력
Serial.print(78, OCT) "116" 출력
Serial.print(78, DEC) "78" 출력
Serial.print(78, HEX) "4E" 출력
Serial.println(1.23456, 0) "1" 출력
Serial.println(1.23456, 2) "1.23" 출력
Serial.println(1.23456, 4) "1.2346" 출력 

구문
Serial.print(값);
Serial.print(값, 형식);

파라메터
값: 프린트할 값 - 어떠한 데이터 형식이라도 된다.
형식: 무슨 진수로 할 것인지 지정한다(정수 데이터에서). 십진수의 수를 지정한다.(소수점에서)

반환값
없음

/*
for 문을 사용하여 데이터 표시하고 다양한 형식으로 수를 프린트 한다.
*/

int x = 0; // 변수

void setup() {
Serial.begin(9600); // 시리얼 포트를 9600 bps로 연결
}

void loop() { 
// 설명을 프린트한다. 
Serial.print("NO FORMAT"); // 설명 프린트
Serial.print("\t"); // 탭 프린트

Serial.print("DEC"); 
Serial.print("\t"); 

Serial.print("HEX"); 
Serial.print("\t"); 

Serial.print("OCT");
Serial.print("\t");

Serial.print("BIN");
Serial.print("\t"); 

Serial.println("BYTE");

for(x=0; x< 64; x++){ // ASCII 문자만으로 적절히 바꾸어도 된다.

// 다양한 형식으로 프린트한다.
Serial.print(x); // ASCII-코드로 십진수를 프린트한다. "DEC"과 같다.
Serial.print("\t"); // 탭을 프린트

Serial.print(x, DEC); // ASCII-코드로 십진수로 표시
Serial.print("\t"); // 탭을 프린트

Serial.print(x, HEX); // ASCII-코드로 16진수로 표시
Serial.print("\t"); // 탭을 프린트

Serial.print(x, OCT); // ASCII-코드로 8진수로 표시
Serial.print("\t"); // 탭을 프린트

Serial.print(x, BIN); // print as an ASCII-encoded binary
Serial.print("\t"); // 탭을 프린트

Serial.println(x, BYTE); // 원래의 바이트 값으로 표시하고 "println"으로 리턴을 더해주었다.

delay(200); // 200 밀리초를 지연
}
Serial.println(""); // 리턴을 또하나 프린트
}

프로그래밍 팁
프린트하는 마지막 문자는 Serial.print()를 반환한 후 시리얼 포트를 통해 전송된다.


println();

설명
인간이 알아볼 수 있는 ASCII 문장에 캐리지 리턴(ASCII 13 또는 '\r')과 개행문자(ASCII10 또는 '\n')를 붙여 시리얼 포트로 데이터를 프린트한다. 

이 명령은 Serial.print()와 형식이 동일하다.

구문
Serial.println(값)
Serial.println(값, 형식)

파라메터
값: 프린트할 값
형식: 숫자 형식과 소수점 위치를 정의한다

:
 

/* 아날로그 입력
0번에 있는 아날로그 핀에서 아날로그 입력을 읽어 출력한다
*/ 

int analogValue = 0; // 아날로그 값을 저장할 변수

void setup() {
Serial.begin(9600); // 시리얼 포트를 9600 bps의 속도로 연다.
}

void loop() {
analogValue = analogRead(0); // 아날로그 입력 0번 핀에서 입력 값을 읽는다.

// 다양한 형식으로 출력을 한다.
Serial.println(analogValue); // 10진수로 ASCII-인코딩하여 프린트한다.
Serial.println(analogValue, DEC); // 10진수로 ASCII-인코딩하여 프린트한다.
Serial.println(analogValue, HEX); // 16진수로 ASCII-인코딩하여 프린트한다.
Serial.println(analogValue, OCT); // 8진수로 ASCII-인코딩하여 프린트한다.
Serial.println(analogValue,BIN); // 2진수로 ASCII-인코딩하여 프린트한다.
Serial.println(analogValue, BYTE); // 원래의 바이트 값으로 프린트한다.

delay(10); // 다음 값을 읽기 전에 10밀리초를 지연한다.
}

write();

설명:
이진 데이터를 시리얼 포트로 전송한다. 이 데이터는 byte나 바이트열로 전송되며, 숫자로 표시되는 문자를 보내려면 대신에 print()를 사용하라.

구문:
Serial.write(값);
Serial.write(문자열);
Serial.write(버퍼, 길이);

아두이노 메가는 Serial1, Serial2, Serial3 를 지원한다.

파라메터:
값: 전송할 단일 바이트값
문자열: 전송할 여러 바이트들
버퍼: 바이틀를 순서대로 보낼 배열
길이: 버퍼의 길이




출처 : https://m.blog.naver.com/PostView.nhn?blogId=heennavi1004&logNo=10119557669&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F