본문 바로가기
아두이노/유선통신

아두이노 2대를 이용한 정수와 실수 전송-#2

by 오징어땅콩2 2020. 8. 4.
반응형

자 이제 그러면 정수를 전송해 보자.

먼저 아래 코드를 보는게 좋을것이다.

정수나 실수나 모든것의 전송은 동일하다.

받는쪽에서만 잘 받으면 된다.

 

보내는쪽과 받는쪽에서 받는쪽이 중요하다.

그런데 실제로 테스트해보면 약간의 문제점이 있다.

사실 전송이 되지 않는것이 아니다. 받는것이 잘못 받고 있기 떄문이다.

Serial.Read()의 리턴 타입은 정수가 아니다. 

char다 사실 이부분도 약간은 애매하다. 

char라고 하기에는 정확한 표현은 아니다. 1바이트라는것이 정확한 표현이다.

그리면 아두이노 공식 홈페이지를 살펴 보자.

 

https://www.arduino.cc/reference/en/language/functions/communication/serial/read/

 

Returns

The first byte of incoming serial data available (or -1 if no data is available). Data type: int.

 

여기에는 분명이 int라고 적혀 있다.

이쯤에서 나에게 왜 사기치냐고 이야기 할 수도 있다.

사실 이것은 아두이노를 이상하게 만든것이지 내가 잘못한것은 아니다.

첫번쨰 바이트의 정수값이다. 이것을 왜 int형으로 주는지 정말 이해 안되는 부분이다.

어쨰던 char로 받는게 정신건강에 좋을것 같다. 

AVR룰 코딩해 본사람은 당연히 이해 할 사항이기는 한데, 본인은 잘 설명을 못하겠다.

어쩨던 char형이라고 생각하고 코딩 하기 바란다.

 

보내는쪽

 
#include <SoftwareSerial.h>
 
SoftwareSerial sSerial= SoftwareSerial(23);
//HardwareSerial&  sSerial = Serial2;
 
volatile unsigned long previousMillis;
void setup() 
{
    Serial.begin(9600);
    sSerial.begin(9600);  
    previousMillis = millis();  
 
    Serial.println(sizeof(int));   
    Serial.println(sizeof(float));     
    Serial.println(sizeof(double));                  
}
 
void loop() 
{
    int a = 100;
    unsigned long currentMillis = millis();
    if ((currentMillis-previousMillis)> 1000*1)
    {
        sSerial.write((char*)&a, sizeof(int));
        previousMillis = currentMillis;
    }
 
    return ;
}
 
 

받는쪽

 
#include <SoftwareSerial.h>
 
SoftwareSerial sSerial= SoftwareSerial(23);
//HardwareSerial&  sSerial = Serial2;
 
void setup() 
{
    Serial.begin(9600);
    sSerial.begin(9600);     
}
 
void loop() 
{
    if (sSerial.available())
    { 
        int a = sSerial.read();
        Serial.println(a);              
    }
      
    return ;
}
 

 

댓글