정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

uart통신
딩딩 | 2016-12-13

오른쪽이 송신부이고 scale.get_unit()이라는 함수의 값을 출력하고 그 출력된 값을

왼쪽 수신부에서 uart통신을 통해서 받았는데 시리얼모니터를 보면 아래쪽이 송신부쪽 출력이고

위쪽이 수신부쪽 출력인데 수신부쪽 통신이 송신부 통신과 전혀 상관없는 값이 나옵니다. 

함수에서 어떤값이 잘못된걸까요?

//송신부

 

 #include <LiquidCrystal.h>
#include "HX711.h"
#define calibaration_factor -7050.0
#define DOUT 3
#define CLK 2

HX711 scale(DOUT, CLK);
LiquidCrystal lcd(8, 9, 10, 11, 12, 13);
byte SpecialChar1[8] = { B01001, B10101, B10101, B01001, B00001, B10000, B10000, B11111};
byte SpecialChar2[8] = { B01000, B10101, B01001, B00011, B11101, B01001, B10000, B11111};
byte SpecialChar3[8] = { B00000, B00100, B00100, B00000, B00000, B00100, B00100, B00000};
byte SpecialChar4[8] = { B11101, B10111, B10101, B11111, B00001, B01110, B10001, B01110};

void setup()
{
  Serial.begin(9600);
 
  scale.set_scale(calibaration_factor);
  scale.tare();
   lcd.begin(16, 2);
  lcd.createChar(0, SpecialChar1);
  lcd.createChar(1, SpecialChar2);
  lcd.createChar(2, SpecialChar3);
  lcd.createChar(3, SpecialChar4);

  for(int i = 0; i<3 ; i++)
  {
    lcd.setCursor(i, 0);
    lcd.write(byte(i));
  }
}

void loop()
{
 
  Serial.println(scale.get_units());  
  lcd.setCursor(3,0);
  if(scale.get_units()>0&&scale.get_units()<3){lcd.print("   ");lcd.print(0);lcd.write(byte(3));}
  else if(scale.get_units()>3&&scale.get_units()<15){lcd.print("   ");lcd.print(1);lcd.write(byte(3));}
  else if(scale.get_units()>15&&scale.get_units()<30){lcd.print("   ");lcd.print(2);lcd.write(byte(3));}
  else if(scale.get_units()>30&&scale.get_units()<50){lcd.print("   ");lcd.print(3);lcd.write(byte(3));}
  else if(scale.get_units()>50){lcd.setCursor(3,0);lcd.print("FULL");lcd.print("    ");}
}

----------------------------------------------------------------------------------------------------------

//수신부

#include  <Servo.h>

 

Servo myservo;
int pos=0;
int inputPin=2;
int PIR_val=0;

void setup()

  
  myservo.attach(5);
  pinMode(4,INPUT_PULLUP);
  Serial.begin(9600);

  pinMode(inputPin,INPUT);   
}

void loop() 
{
  while(Serial.available()){
  double data = Serial.read();
   Serial.println(data);}
  
}

프로필사진

수박쨈 2016-12-13 16:44:30

 

 

 

아스키코드 표를 올려드릴게요.

 

 

 

위 수신부에서 48, 46, 52, 50가 연속으로 찍힌 값을 예를 들어 설명하면

아스키코드값과 비교하면 0.42가 나오네요.

 

또 48, 46, 52, 48이 연속으로 찍힌 값을 아스키코드 표와 비교하면 0.40입니다.

값 중간 중간에 찍힌 13, 10은 아스키코드에서 각각 캐리지리턴(\r)과 라인피드(\n)를 나타냅니다.

 

값을 제대로 전달되고 있는데 단지 출력이 아스키코드로 표현되고 있네요.

 

Serial.print()가 아닌 Serial.write()를 사용하여 수신부에서 출력해보세요.

프로필사진

딩딩 2016-12-13 17:16:54

write 로 바꿨더니 컴파일 오류가 떠요ㅜㅜ

프로필사진

수박쨈 2016-12-13 17:31:33

타입을 double이 아닌 int나 byte, char로 변환하셔서 사용해야 합니다.

 

아스키코드값으로 전달되기 때문에 값이 전달될때 그 타입 그대로 전송되지는 않는 점 고려하셔야 합니다.

이전글   |    인체감지센서 질문도 하나 더 해도 될까요?... 2016-12-13
다음글   |    아두이노 회로도 문제 2016-12-13