왜인지 소프트웨어 시리얼로 동작시키면 데이터를 잘 받는데요.
하드웨어 시리얼로 동작시키면 제대로 동작을 안합니다. ㅠㅠ
아두이노 메가랑 연결한 것이구요.
아래는 문제의 코드입니다.
목적은 간단한 차압계 디스플레이를 만드는 거예요.
타이머는 일종의 테스트용으로 디스플레이가 제대로 나오나 확인하는 용도로 만들었습니다.
소프트웨어 구현으로 통신하면 터치값이 잘 읽히는데요.
텍스트 저장할 스트링도 이상하게 떠요.
같은 코드인데, 왜 통신 방법에 따라 이런 차이가 발생하는지 모르겠습니다. ㅠㅠ
#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);
}