게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
[본삭금] 아두이노 관련으로 도움을 받고 싶습니다.
게시물ID : programmer_21250짧은주소 복사하기
작성자 : 유한요소법
추천 : 0
조회수 : 550회
댓글수 : 7개
등록시간 : 2017/08/22 11:49:01
옵션
  • 창작글
  • 본인삭제금지
왜인지 소프트웨어 시리얼로 동작시키면 데이터를 잘 받는데요.
하드웨어 시리얼로 동작시키면 제대로 동작을 안합니다. ㅠㅠ

itead HMI 디스플레이 (Nextion Display) 랑
아두이노 메가랑 연결한 것이구요.
아래는 문제의 코드입니다.
목적은 간단한 차압계 디스플레이를 만드는 거예요.
타이머는 일종의 테스트용으로 디스플레이가 제대로 나오나 확인하는 용도로 만들었습니다.

소프트웨어 구현으로 통신하면 터치값이 잘 읽히는데요.
하드웨어로 통신하면 터치값도 이상하고,
텍스트 저장할 스트링도 이상하게 떠요.

같은 코드인데, 왜 통신 방법에 따라 이런 차이가 발생하는지 모르겠습니다. ㅠㅠ

#include <MsTimer2.h>

char buf[40];
int cmd[3];
String txt_data; // 날라온 텍스트
String file_name; // 파일명
int val[3]; // 명령어 저장값
int set_val[3][2] = {{1,0},{1,0},{1,0}};  // 설정 저장값
bool flag,flag1,flag2 = false;

// 임시 데이터
int air_flow = 1000;
int dPressure = 300;
float temp = 23.4;
float humid = 50.0;
float baro = 1010.0;

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(115200);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  Serial.println("USB is connected!");

  // set the data rate for the SoftwareSerial port
  Serial2.begin(115200);
  while (!Serial2) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  Serial.println("Display is connected!");
  randomSeed(analogRead(A0));
  MsTimer2::set(200,txData);
  MsTimer2::start();
}


void loop()
{
  rxData();
}

void rxData() {
  if(Serial2.available() > 0)
  {
    if(flag)
    {
      if(flag1)
      {
        for(int i = 0; i < 3; i++)
        {
          val[i] = Serial2.read();
        }
        for(int i = 0; i < 3; i++)
        {
          cmd[i] = Serial2.read();
        }
        if(cmd[2] == 0xff) {
           flag = false;
        }
        if(val[0] == 2) {
          set_switch(val[1]);
        } else if(val[0] == 4) {
          Serial.println("Recording is Ended.");
        } else {
          flag = false;
        }
      } else if(flag2) {
        Serial2.readBytes(buf,40);
        String txt_temp = String(buf);
        txt_data = txt_temp.substring(0,txt_temp.length()-3);
        file_name = txt_data + ".txt";                           //여기에 파일명이 저장됨.
        Serial.print("file_name : ");
        Serial.println(file_name);
        flag = false;
      } else {
        long b = Serial2.read();
        Serial.print("Num : ");
        Serial.println(b);
        flag = false; 
      }
    } else {
      int a = Serial2.read();
      switch(a) {
        case 0x65:
        flag = true; flag1 = true; flag2 = false; break;
        case 0x70:
        flag = true; flag1 = false; flag2 = true; break;
        case 0x71:
        flag = true; flag1 = false; flag2 = false; break;
      }
    }
  } else {
    flag = false;
  }
}

void set_switch(int val) {
  switch(val) {
    case 3:
    if(set_val[0][0]==0) {
      set_val[0][0] = 1;
      set_val[0][1] = 0;
    }
    Serial.println("Actual Airflow");
    break;
    
    case 4:
    if(set_val[0][1]==0) {
      set_val[0][0] = 0;
      set_val[0][1] = 1;
    }
    Serial.println("Nominal Airflow");
    break;
    
    case 5:
    if(set_val[1][0]==0) {
      set_val[1][0] = 1;
      set_val[1][1] = 0;
    }
    Serial.println("Flowrate unit is CMH.");
    break;
    
    case 6:
    if(set_val[1][1]==0) {
      set_val[1][0] = 0;
      set_val[1][1] = 1;
    }
    Serial.println("Flowrate unit is CFM.");
    break;

    case 7:
    if(set_val[2][0]==0) {
      set_val[2][0] = 1;
      Serial.println("5 inch nozzle is Opened.");
    } else {
      set_val[2][0] = 0;
      Serial.println("5 inch nozzle is Closed.");
    }
    
    break;

    case 8:
    if(set_val[2][1]==0) {
      set_val[2][1] = 1;
      Serial.println("7 inch nozzle is Opened.");
    } else {
      set_val[2][1] = 0;
      Serial.println("7 inch nozzle is Closed.");
    }
    break; 
  }
}

void txData() {
  int temp_data;
  temp_data = air_flow + random(500);
  Serial2.print("main.dpFlow.txt=\"");
  Serial2.print(temp_data);
  Serial2.print("\"");
  Serial2.write(0xff); Serial2.write(0xff); Serial2.write(0xff);
  Serial2.print("record.dpFlow.txt=\"");
  Serial2.print(temp_data);
  Serial2.print("\"");
  Serial2.write(0xff); Serial2.write(0xff); Serial2.write(0xff);

  temp_data = dPressure + random(50);
  Serial2.print("main.dpDP.txt=\"");
  Serial2.print(temp_data);
  Serial2.print("\"");
  Serial2.write(0xff); Serial2.write(0xff); Serial2.write(0xff);
  Serial2.print("record.dpDP.txt=\"");
  Serial2.print(temp_data);
  Serial2.print("\"");
  Serial2.write(0xff); Serial2.write(0xff); Serial2.write(0xff);

  float temp_data2;

  temp_data2 = temp + random(200) / 100;
  Serial2.print("main.temp.txt=\"");
  Serial2.print(temp_data2,1);
  Serial2.print("\"");
  Serial2.write(0xff); Serial2.write(0xff); Serial2.write(0xff);
  Serial2.print("record.temp.txt=\"");
  Serial2.print(temp_data2,1);
  Serial2.print("\"");
  Serial2.write(0xff); Serial2.write(0xff); Serial2.write(0xff);

  temp_data2 = humid + random(300) / 100;
  Serial2.print("main.humid.txt=\"");
  Serial2.print(temp_data2,1);
  Serial2.print("\"");
  Serial2.write(0xff); Serial2.write(0xff); Serial2.write(0xff);
  Serial2.print("record.humid.txt=\"");
  Serial2.print(temp_data2,1);
  Serial2.print("\"");
  Serial2.write(0xff); Serial2.write(0xff); Serial2.write(0xff);

  temp_data2 = baro + random(1000) / 100;
  Serial2.print("main.baro.txt=\"");
  Serial2.print(temp_data2,1);
  Serial2.print("\"");
  Serial2.write(0xff); Serial2.write(0xff); Serial2.write(0xff);
  Serial2.print("record.baro.txt=\"");
  Serial2.print(temp_data2,1);
  Serial2.print("\"");
  Serial2.write(0xff); Serial2.write(0xff); Serial2.write(0xff);
}

출처 제가 직접 만들어봤습니다. ㅠㅠ
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호