?>

Hard Copy World

HCW

Q&A

Home > Forum >

Q&A

질문 | [질문] Arduino DUE .. UART Send BREAK Signal?

페이지 정보

작성자 돌메 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일16-09-23 13:33 조회1,488회 댓글2건

본문

장비: Arduino DUE

Serial2 에 어떤 장비가 연결되어 있습니다. 장비는 Sleep 상태일 수도 동작 중인 상태에 있을 수도 있습니다.

Serial2에 Hardware break signal을 전송하면 장비는 Sleep 상태에서 wakeup 되어 Ready 상태가 되거나

동작 중인 상태를 멈추고 Ready 상태가 됩니다. (Reset되어 초기 상태가 됨)

 

Serial2에 연결된 장비에 주기적으로 Hardware break 신호를 보내어 장비를 Ready 상태로 만들고, 동작 Command를

전송하여 장비를 운영하도록 하려 합니다. (장비의 Sleep / 동작 중과 상관없이 일정 시간에 동작 시키려고 합니다.)

 

아래의 코드는 Arduino Forum의 DUE Forum 등을 뒤지면서 만든 코드인데..

Hardware Break는 잘 동작합니다.

문제는, Hardware Break를 한 번 보낸 후 Serial2의 TX가 전혀 동작하지 않는다는 것입니다.

 

Forum을 뒤져보니, Hardware Break Signal를 전송하려면 Serial2 의 Serial 모드를 종료하고

Digital Output Mode로 변경하여 HIGH 상태를 일정 시간 유지(예제는 500ms)한 후 다시 Idle 상태(LOW)상태로

돌아오면 Hardware Break가 걸린 것으로 처리할 수 있다는 것입니다.

Hardware Break는 RS-232 상에서 Low State를 뜻하지만, Arduino 상의 Tx/Rx는 MAX232 Chip을

통과하기 전의 상태이니 Break Signal은 HIGH를 의마한다고 합니다.

 

어쨌든 Break는 잘 동작하고 있으나, 한 번이라도 Hardware Signal을 전송한 후에는  Serial2.TX Pin으로

어떤 데이터도 전송되지 않습니다.

 

왜 그런 것인가요?

 

고수님들의 도움을 간절히 바랍니다.

 

///////////////////////////////////////////////////////////////////////
// Arduino Source
///////////////////////////////////////////////////////////////////////

 

void SendBreak(int ms);      // Hardware BREAK Signal Send Function

//////////////////////////////////////////////////////////////////////////////////////////
void setup() {
    Serial.begin(9600);
    Serial2.begin(9600);      // 연결된 장비의 포트
    
    Serial.println("Ready...");
}

char c;

//////////////////////////////////////////////////////////////////////////////////////////
void loop() {
    
    Serial2.write("C?\r",3);           // 장비에 상태 Request

    for ( int i = 0 ; i < 50 ; i++ ) {    // 5초 동안 수신을 기다림.
        delay(100);    
        while (Serial2.available()) {   
            c = Serial2.read();            // Break Signal을 전송하지 않은 상태에서는 응답 Ok
            Serial.print(c);
        }         
    }    
    
    /////////////////////////////////////////////////////////
    Serial.println("Send Break to Serial2..............................................");
    
    SendBreak(500);        // BREAK Signal을 전송
    
    for ( int i = 0 ; i < 50 ; i++ ) {
        delay(100);    // 5 second waiting..
        while (Serial2.available()) {
            c = Serial2.read();      // 장비가 Reset 되면서 장비의 초기 메세지(Banner)가 출력됨. (장비 제조사, 장비이름, 버젼)
            Serial.print(c);
        }         
    }
    
    Serial2.write("C?\r",3);    // 장비의 상태 조회

    for ( int i = 0 ; i < 50 ; i++ ) {
        delay(100);    // 5 second waiting..
        while (Serial2.available()) {
            c = Serial2.read();      // 아무런 응답 없음..
            Serial.print(c);
        }         
    }    
}

//////////////////////////////////////////////////////////////////////////////////////////
void SendBreak(int ms)
{
    Serial2.end();                    // Serial2의 Serial Mode 종료
    
    pinMode(16, OUTPUT);   // Serial2의 TX Pin을 Digital Output Mode로 전환
    digitalWrite(16, HIGH);    // Send Break
    delay(ms);                         // 500 ms
    digitalWrite(16, LOW);    // Idle Status
    
    Serial2.begin(9600);        // Serial2를 다시 Serial Mode로 전환
}

///////////////////////////////////////////////////////////////////////
// 실행 결과
///////////////////////////////////////////////////////////////////////

Ready...
C?                                       // Serial2에 질의한 명령어의 Echo(장비에서 Echo 함)
Available Commands:       // Serial2에서 수신한 Text들..

CB 411 ------------------ Serial Port Control {baud;parity;stop}
CF 01110 ---------------- Set Ctrl Flags {e;p;b;s;*}
.......

>Send Break to Serial2.............................................. // BREAK를 전송함.

Horizontal XXXX                                                           // 장비가 Reset되고 초기 상태 표시(회사,제품,버젼 등 표시)
XX Instruments (c) 2009
All rights reserved.
Product Version: XX02.11
                                                 // 이후 C?\r로 장비 상태 질의하였으나 아무 응답없음.
                                                 // BREAK 한 후 Tx Pin에서 전송 작업이 이루어지지 않고 있음.
                                                 // 정상적이라면 이곳에 C?\r 질의에 대한 결과가 표시되어야 함. (위의 표시 내역 ..)

>Send Break to Serial2.............................................. // BREAK를 전송함.

Horizontal XXXX                                                           // 장비가 Reset되고 초기 상태 표시(회사,제품,버젼 등 표시)
XX Instruments (c) 2009
All rights reserved.
Product Version: XX02.11

>Send Break to Serial2..............................................

Horizontal XXXX                                                           // 장비가 Reset되고 초기 상태 표시(회사,제품,버젼 등 표시)
XX Instruments (c) 2009
All rights reserved.
Product Version: XX02.11

>


///////////////////////////////////////////////////////////////////////
// Arduino Forum의 참고한 Article
///////////////////////////////////////////////////////////////////////

http://forum.arduino.cc/index.php?topic=39579.0
http://forum.arduino.cc/index.php?topic=141611.0

감사합니다.

댓글목록

돌메님의 댓글

돌메 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일

해결~! 편법이지만..~~!!
http://forum.arduino.cc/index.php?topic=39579.0
이 Article은 이미 오래 되어서 wiring_serial.c 와 같은 파일은 존재하지않지만,
약간의 편법이 소개되어 있네요.
Tx Pin을 GPIO 모드로 변환하지 않고, Serial 통신 모드를 300bps로 가장 저속으로 바꾸고,
0x00 값을 일정 시간 만큼 전송하면 (500ms LOW 상태이면 150바이트의 0x00을 전송하면) 연결된 장비가 Hardware break로 인식 합니다. 장비는 최소한 300ms 의 LOW 상태를 요구하지만 안전하게 500ms동안 LOW State를 유지하는 것으로 하였습니다. 코드로 본다면..

void SendBreak(int ms) // ms => 100 <= ms <= 500 ( 100milisecond ~ 500 milisecond)
{
Serial2.end();
delay(10); //wait for while

Serial2.begin(300);
byte x[150];
memset(x, 0x00, 150);
Serial2.write(x, 150); // Send BREAK ( 500ms )
Serial2.end();

Serial2.begin(9600);
}

aprilrussell님의 댓글

aprilrussell 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일

이틀밤새서 겨우 해결했네요..... cairo경로 때문이 아니였네요 ㅠㅠ "dig"라는 명령어가 안먹어서 에러가 발생했었습니다. sudo apt-get install dnsutils 로 설치하고 python home.py 실행하니 완벽해결 ㅎㅎ 같은 에러 가지는 분이 없길 바랍니다.
juegos friv https://juegosfriv-gratis.com gratis online
run 3 https://run2.online/run-3 unblocked game.