-
시리얼 통신에 사용되는 함수Arduino/Serial 통신 2020. 10. 20. 19:22
readBytes함수 & readreadBytesUntil 함수
시리얼 통신에 사용되는 찾기함수이다.
소스 코드
// 함수들에 대해 알아보자. // readBytes함수 void setup() { // put your setup code here, to run once: Serial.begin(9600); Serial.setTimeout(2000); // 기본은 1000(1초)를 의미 } void loop() { // put your main code here, to run repeatedly: char temp[100]; // 입력이 있으면 if (Serial.available() > 0) { // byte len = Serial.readBytes(temp,10); byte len = Serial.readBytesUntil('0',temp,10); // '0'을 구분함. 문자를 분리할 때 많아 쓴다. Serial.print(len); for (int i = 0; i < len; i++) { Serial.print(temp[i]); } Serial.println(); } }
readBytes함수를 활용한 시리얼 통신 Handshaking
아래의 내용이 시리얼 통신 Handshaking에 관한 내용이다.
소스 코드
// 시리얼 통신 Handshaking void setup() { // put your setup code here, to run once: Serial.begin(9600); establishConnection(); } void establishConnection() { char buffer[100]; Serial.println("hi server\'OK'"); while (1) { if (Serial.available()) { int readCount = Serial.readBytes(buffer,99); buffer[readCount] = '\0'; Serial.println("receiver message : " +String(buffer)); if (String("OK").equals(buffer)) break; } } Serial.println("Thank you"); } void loop() {}
시리얼 모니터에서 'line ending 없음' 으로 선택을 해야 한다. 종료 조건이 순수 "OK"만을 입력했을 때이다.
위의 establishConnection함수에서 선언한 변수 buffer는 크기가 100이며 입력받을 내용은 문자열이기 때문에
readBytes함수에서는 99만큼만 읽어야 한다. 그 이유는 마지막 자리에 널 문자를 삽입해야 하기 때문이다.if( SerialSerial.available()) 문장은 외부에서 입력이 있을 때 참이 되어 if내의 문장이 실행된다.
즉, 입력한 문자가 있으면 if 내로 들어온다.
substring 함수
시리얼 모니터에서 'line ending 없음'으로 보도록 하자. 출력 결과는 abc가 나온다.
소스 코드
void setup() { // put your setup code here, to run once: Serial.begin(9600); String buf = "abcdefg"; // substring함수의 두 번째 매개변수인 3번 인덱스에 '\0'가 채워짐 Serial.println(buf.substring(0,3)); } void loop() {}
문자열 함수 indexOf와 substring 함수(String 클래스 내의 함수)
시리얼 모니터에서 'line ending 없음' 으로 두고 실행하자.
소스 코드
더보기// 문자열 함수를 이용해서 ':'을 중심으로 문자열을 나누기. // 보낸 데이터를 받는 형식 void setup() { // put your setup code here, to run once: Serial.begin(9600); establishConnection(); } void loop() {} void establishConnection() { char buf[100]; Serial.println("hi server\'OK'"); while (1) { // 외부에서 입력이 있을 때 if (Serial.available()) { int readCnt = Serial.readBytes(buf,99); buf[readCnt] = '\0'; // Serial.println("receiver message : " +String(buf)); int pos = String(buf).indexOf(':'); // substring함수에서 pos인덱스 위치에 '\0'문자 삽입 String command = String(buf).substring(0, pos); Serial.println("분리 명령 : " +command); // substring함수에서 readCnt인덱스 위치에 '\0'문자 삽입 String value = String(buf).substring(pos + 1,readCnt); Serial.println("분리값 : " +value); if (String("OK").equals(buf)) {break;} else if (String("IP").equals(command)) {Serial.println("IP설정");} else if (String("PORT").equals(command)) {Serial.println("PORT설정");} else {Serial.println("명령이 잘못되었습니다.");} } } Serial.println("Thank you"); }
micros함수 & flush함수
micros함수를 이용해서 데이터 처리하는 시간을 구할 수 있다.
이 함수는 중요하다. 그 이유는 나중에 버튼에 대한 처리를 하기 때문이다.
fflush함수는 시리얼 통신에 사용되는 버퍼 비우는 함수이다.
소스 코드
// 데이터 처리하는 시간 구하기 char* buf = "test message"; void setup() { // put your setup code here, to run once: Serial.begin(9600); } void loop() { // put your main code here, to run repeatedly: unsigned long int t; for (int i = 0; i < 10; i++) { t = micros(); // 현재의 시간을 잰다. Serial.println(buf); Serial.flush(); // 버퍼를 지우는데 걸리는 시간이 조금 걸린다. Serial.println(micros() - t); // 현재의 시간에서 그 이전의 시간을 뺀다. } while (1); }
serialEvent함수
소스 코드
void setup() { // put your setup code here, to run once: Serial.begin(9600); } void loop() {} // 알아서 available상태를 체크함 void serialEvent() { char c = Serial.read(); Serial.print("rx : "); Serial.println(c); }
parseInt 함수
parseInt함수말고 Serial.parseFloat함수도 있다.
소스 코드
더보기void setup() { // put your setup code here, to run once: Serial.begin(9600); } void loop() { // put your main code here, to run repeatedly: if (Serial.available()) { Serial.println(Serial.parseInt()); if (Serial.read() != '\0'); } }
find 함수
소스 코드
void setup() { Serial.begin(9600); } long temp = 0; void loop() { while (Serial.available()) { if (Serial.find("f")) temp = Serial.parseInt(); else temp = 0; Serial.print("temp value = "); Serial.println(temp); } }
findUntil 함수
소스 코드
void setup() { Serial.begin(9600); } long temp = 0; void loop() { while (Serial.available()) { Serial.println(Serial.findUntil("f","T")); } }
'Arduino > Serial 통신' 카테고리의 다른 글
아두이노와 아두이노의 시리얼 통신하기 (0) 2020.11.05 Serial Rx Tx & SoftwareSerial Rx Tx (0) 2020.10.20 시리얼 통신과 문자열 활용 - LED (0) 2020.10.20 시리얼 통신의 활용 - LED와 센서 (0) 2020.10.19 시리얼 통신 기초 (0) 2020.10.19