|
|
|
|
#define RS485_OE_1 22 //RS485 CH#1 Output Enable => pin 22 for CH#1
|
|
|
|
|
#define RS485_OE_2 23 //RS485 CH#2 Output Enable => pin 23 for CH#2
|
|
|
|
|
|
|
|
|
|
#define Snd_485 HIGH
|
|
|
|
|
#define Rcv_485 LOW
|
|
|
|
|
|
|
|
|
|
void RS485_setup(){
|
|
|
|
|
Serial1.setTimeout(300);
|
|
|
|
|
Serial1.begin(9600);
|
|
|
|
|
pinMode(RS485_OE_1, OUTPUT);
|
|
|
|
|
delay(10);
|
|
|
|
|
digitalWrite(RS485_OE_1, Rcv_485);
|
|
|
|
|
|
|
|
|
|
Serial2.setTimeout(300);
|
|
|
|
|
Serial2.begin(9600);
|
|
|
|
|
pinMode(RS485_OE_2, OUTPUT);
|
|
|
|
|
delay(10);
|
|
|
|
|
digitalWrite(RS485_OE_2, Rcv_485);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void send_485_1(){
|
|
|
|
|
if(!Wait_485_1){
|
|
|
|
|
String message = read_buff(Buff_485_1_Wr);
|
|
|
|
|
if(message != ""){
|
[Command 및 Process 중간 완료]
- Ethernet을 통한 명령
ㄴ DO!, DI?, AI?, SV!, SV?, PV?
ㄴ AT!(MC9 AutoTune): 테스트 완료, 주석으로 정리해 놨음
ㄴ AO!: DAC 수령 후 작성 예정
- Buffer
ㄴ Write는 CRLF 확인 후 없으면 CRLF 추가 후 write
ㄴ Read는 CRLF 까지 데이터를 출력, CRLF는 미출력으로 필요시 read후 추가 필요
ㄴ 즉, Buffer는 CRLF를 기준으로 쓰기/읽기 진행, 기본적으로 입출력시 CRLF 제외되나, 저장시 CRLF 있는 경우 중복방지처리 됨
2 years ago
|
|
|
|
|
|
|
|
|
//save sent message info. for received data processing
|
|
|
|
|
latest_sent_msg_1 = message;
|
[Command 및 Process 중간 완료]
- Ethernet을 통한 명령
ㄴ DO!, DI?, AI?, SV!, SV?, PV?
ㄴ AT!(MC9 AutoTune): 테스트 완료, 주석으로 정리해 놨음
ㄴ AO!: DAC 수령 후 작성 예정
- Buffer
ㄴ Write는 CRLF 확인 후 없으면 CRLF 추가 후 write
ㄴ Read는 CRLF 까지 데이터를 출력, CRLF는 미출력으로 필요시 read후 추가 필요
ㄴ 즉, Buffer는 CRLF를 기준으로 쓰기/읽기 진행, 기본적으로 입출력시 CRLF 제외되나, 저장시 CRLF 있는 경우 중복방지처리 됨
2 years ago
|
|
|
|
|
|
|
|
|
message += CRLF;
|
|
|
|
|
digitalWrite(RS485_OE_1, Snd_485); delay(5);
|
|
|
|
|
Serial1.print(message);
|
|
|
|
|
returnTime = millis();
|
|
|
|
|
Serial1.flush();
|
|
|
|
|
digitalWrite(RS485_OE_1, Rcv_485); delay(5);
|
|
|
|
|
|
|
|
|
|
Wait_485_1 = true;
|
|
|
|
|
Wait_485_1_cnt = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void send_485_2(){
|
|
|
|
|
if(!Wait_485_2){
|
|
|
|
|
String message = read_buff(Buff_485_2_Wr);
|
|
|
|
|
if(message != ""){
|
|
|
|
|
|
|
|
|
|
//save sent message info. for received data processing
|
|
|
|
|
latest_sent_msg_2 = message;
|
|
|
|
|
|
|
|
|
|
message += CRLF;
|
|
|
|
|
digitalWrite(RS485_OE_2, Snd_485); delay(5);
|
|
|
|
|
Serial2.print(message);
|
|
|
|
|
returnTime = millis();
|
|
|
|
|
Serial2.flush();
|
|
|
|
|
digitalWrite(RS485_OE_2, Rcv_485); delay(5);
|
|
|
|
|
|
|
|
|
|
Wait_485_2 = true;
|
|
|
|
|
Wait_485_2_cnt = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int recieve_485_1(){
|
|
|
|
|
// Timeout code
|
|
|
|
|
if(Wait_485_1){
|
|
|
|
|
Wait_485_1_cnt++;
|
|
|
|
|
if(Wait_485_1_cnt > 40){ // Timeout = periodic(20ms) x 25 = 500 msec
|
|
|
|
|
//Serial.println("485 not responced... (Timeout)");
|
|
|
|
|
timeoutMC9_1();
|
|
|
|
|
|
|
|
|
|
latest_sent_msg_1 = "";
|
|
|
|
|
Wait_485_1 = false;
|
|
|
|
|
Wait_485_1_cnt = 0;
|
|
|
|
|
numOf485--;
|
|
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// Receive pv data
|
|
|
|
|
while(Wait_485_1 && (Serial1.available() > 0)) {
|
|
|
|
|
char c = Serial1.read();
|
|
|
|
|
write_buff_c(Buff_485_1_Rd, c);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
String message = read_buff(Buff_485_1_Rd);
|
|
|
|
|
if(message != ""){
|
|
|
|
|
numOf485--;
|
|
|
|
|
if(latest_sent_msg_1.indexOf("DRS") != -1){
|
|
|
|
|
saveMC9_1(message);
|
|
|
|
|
}
|
[Command 및 Process 중간 완료]
- Ethernet을 통한 명령
ㄴ DO!, DI?, AI?, SV!, SV?, PV?
ㄴ AT!(MC9 AutoTune): 테스트 완료, 주석으로 정리해 놨음
ㄴ AO!: DAC 수령 후 작성 예정
- Buffer
ㄴ Write는 CRLF 확인 후 없으면 CRLF 추가 후 write
ㄴ Read는 CRLF 까지 데이터를 출력, CRLF는 미출력으로 필요시 read후 추가 필요
ㄴ 즉, Buffer는 CRLF를 기준으로 쓰기/읽기 진행, 기본적으로 입출력시 CRLF 제외되나, 저장시 CRLF 있는 경우 중복방지처리 됨
2 years ago
|
|
|
|
else{
|
|
|
|
|
Serial.print("----- 485 rcv : ");
|
[Command 및 Process 중간 완료]
- Ethernet을 통한 명령
ㄴ DO!, DI?, AI?, SV!, SV?, PV?
ㄴ AT!(MC9 AutoTune): 테스트 완료, 주석으로 정리해 놨음
ㄴ AO!: DAC 수령 후 작성 예정
- Buffer
ㄴ Write는 CRLF 확인 후 없으면 CRLF 추가 후 write
ㄴ Read는 CRLF 까지 데이터를 출력, CRLF는 미출력으로 필요시 read후 추가 필요
ㄴ 즉, Buffer는 CRLF를 기준으로 쓰기/읽기 진행, 기본적으로 입출력시 CRLF 제외되나, 저장시 CRLF 있는 경우 중복방지처리 됨
2 years ago
|
|
|
|
Serial.println(message);
|
|
|
|
|
}
|
|
|
|
|
Wait_485_1 = false;
|
|
|
|
|
Wait_485_1_cnt = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int recieve_485_2(){
|
|
|
|
|
// Timeout code
|
|
|
|
|
if(Wait_485_2){
|
|
|
|
|
Wait_485_2_cnt++;
|
|
|
|
|
if(Wait_485_2_cnt > 40){ // Timeout = periodic(20ms) x 25 = 500 msec
|
|
|
|
|
//Serial.println("485 not responced... (Timeout)");
|
|
|
|
|
timeoutMC9_2();
|
|
|
|
|
|
|
|
|
|
latest_sent_msg_2 = "";
|
|
|
|
|
Wait_485_2 = false;
|
|
|
|
|
Wait_485_2_cnt = 0;
|
|
|
|
|
numOf485--;
|
|
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// Receive pv data
|
|
|
|
|
while(Wait_485_2 && (Serial2.available() > 0)) {
|
|
|
|
|
char c = Serial2.read();
|
|
|
|
|
write_buff_c(Buff_485_2_Rd, c);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
String message = read_buff(Buff_485_2_Rd);
|
|
|
|
|
if(message != ""){
|
|
|
|
|
numOf485--;
|
|
|
|
|
if(latest_sent_msg_2.indexOf("DRS") != -1){
|
|
|
|
|
saveMC9_2(message);
|
|
|
|
|
}
|
|
|
|
|
else{
|
|
|
|
|
Serial.print("----- 485 rcv : ");
|
|
|
|
|
Serial.println(message);
|
|
|
|
|
}
|
|
|
|
|
Wait_485_2 = false;
|
|
|
|
|
Wait_485_2_cnt = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
[Command 및 Process 중간 완료]
- Ethernet을 통한 명령
ㄴ DO!, DI?, AI?, SV!, SV?, PV?
ㄴ AT!(MC9 AutoTune): 테스트 완료, 주석으로 정리해 놨음
ㄴ AO!: DAC 수령 후 작성 예정
- Buffer
ㄴ Write는 CRLF 확인 후 없으면 CRLF 추가 후 write
ㄴ Read는 CRLF 까지 데이터를 출력, CRLF는 미출력으로 필요시 read후 추가 필요
ㄴ 즉, Buffer는 CRLF를 기준으로 쓰기/읽기 진행, 기본적으로 입출력시 CRLF 제외되나, 저장시 CRLF 있는 경우 중복방지처리 됨
2 years ago
|
|
|
|
/* For Test from PC */
|
|
|
|
|
void recieve_485_0(){
|
|
|
|
|
|
[Command 및 Process 중간 완료]
- Ethernet을 통한 명령
ㄴ DO!, DI?, AI?, SV!, SV?, PV?
ㄴ AT!(MC9 AutoTune): 테스트 완료, 주석으로 정리해 놨음
ㄴ AO!: DAC 수령 후 작성 예정
- Buffer
ㄴ Write는 CRLF 확인 후 없으면 CRLF 추가 후 write
ㄴ Read는 CRLF 까지 데이터를 출력, CRLF는 미출력으로 필요시 read후 추가 필요
ㄴ 즉, Buffer는 CRLF를 기준으로 쓰기/읽기 진행, 기본적으로 입출력시 CRLF 제외되나, 저장시 CRLF 있는 경우 중복방지처리 됨
2 years ago
|
|
|
|
while(Serial.available() > 0) {
|
|
|
|
|
char c = Serial.read();
|
|
|
|
|
IdeSerial += c;
|
|
|
|
|
}
|
|
|
|
|
|
[Command 및 Process 중간 완료]
- Ethernet을 통한 명령
ㄴ DO!, DI?, AI?, SV!, SV?, PV?
ㄴ AT!(MC9 AutoTune): 테스트 완료, 주석으로 정리해 놨음
ㄴ AO!: DAC 수령 후 작성 예정
- Buffer
ㄴ Write는 CRLF 확인 후 없으면 CRLF 추가 후 write
ㄴ Read는 CRLF 까지 데이터를 출력, CRLF는 미출력으로 필요시 read후 추가 필요
ㄴ 즉, Buffer는 CRLF를 기준으로 쓰기/읽기 진행, 기본적으로 입출력시 CRLF 제외되나, 저장시 CRLF 있는 경우 중복방지처리 됨
2 years ago
|
|
|
|
if(IdeSerial.endsWith("\n")){
|
|
|
|
|
IdeSerial.replace(CRLF,"");
|
|
|
|
|
IdeSerial += sumMC9(IdeSerial);
|
|
|
|
|
IdeSerial = "" + IdeSerial + CRLF;
|
|
|
|
|
|
|
|
|
|
write_buff_first(Buff_485_1_Wr, IdeSerial);
|
[Command 및 Process 중간 완료]
- Ethernet을 통한 명령
ㄴ DO!, DI?, AI?, SV!, SV?, PV?
ㄴ AT!(MC9 AutoTune): 테스트 완료, 주석으로 정리해 놨음
ㄴ AO!: DAC 수령 후 작성 예정
- Buffer
ㄴ Write는 CRLF 확인 후 없으면 CRLF 추가 후 write
ㄴ Read는 CRLF 까지 데이터를 출력, CRLF는 미출력으로 필요시 read후 추가 필요
ㄴ 즉, Buffer는 CRLF를 기준으로 쓰기/읽기 진행, 기본적으로 입출력시 CRLF 제외되나, 저장시 CRLF 있는 경우 중복방지처리 됨
2 years ago
|
|
|
|
IdeSerial = "";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void send_temp(bool F){
|
|
|
|
|
|
|
|
|
|
String message = "TEST";
|
|
|
|
|
if(F) {
|
|
|
|
|
message += CRLF;
|
|
|
|
|
message += " with CRLF";
|
|
|
|
|
message += CRLF;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
digitalWrite(RS485_OE_1, Snd_485); delay(5);
|
|
|
|
|
Serial1.print(message);
|
|
|
|
|
returnTime = millis();
|
|
|
|
|
Serial1.flush();
|
|
|
|
|
digitalWrite(RS485_OE_1, Rcv_485); delay(5);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|