마지막으로, 젤 중요한 통신부분을 하고 있는데요..
RS485 통신을 하고 있습니다. 제가 slave 이고 master는 상대편입니다.
이놈의 master device가 500ms 마다 제가 지금 핸들링하고 있는 slave device를 찾습니다.
그럼, 저는 resposne timer인 50ms 안에 그에 상응하는 응답을 주어야 합니다.
그래서, 지금 통신 초기화 부분, rx 부분, tx 부분들을 코딩은 해놓앗는데, 구조에서 지금 두가지를 놓고 저울질 하고 있습니다.
첫번째는...
가르쳐주신 방법대로 시간지연함수를 while문안에 넣고 돌리는 것이구요. 이렇게 하면 과연 master의 응답을 제대로
받아서 50ms 안에 응답할 수 있을지 의문입니다. 아래의 while문안의 함수들에서 tx_buffer[ ] 에다가 값을 쓰거나, rx_
buffer[ ]의 값을 읽어와서 처리합니다. 그리고, 통신의 rx부분, tx부분 함수에서 request와 rx_data가
오면 tx_buffer[ ] 값을 전송하게 되는 것입니다.
그래서, 아래의 while문에 넣게 되면.. 안될 것 같은데.. 어떻게 생각하시는지요??
while(1) {
Operation_rtn(); //main operation routine
Input_scan();//scan input value
Disp_rtn();// handling display board routine
sw_scan();//switch scanning 과 상응하는 대응
}
두번째 방법은. 통신의 rx부분, tx부분만 인터럽트 루틴에 넣어 약 5ms 간격으로 request를 스캔하고 값만 rx_buffer에 바로
넣고, tx_buffer의 값을 또 전송하는 그런 방법을 사용할까 합니다. 아니면, rx 부분만 isr에 넣고 tx는 while에 넣어도 50ms 응답
속도안에 전송할 수 있을것도 같은데요..
좋은 조언 좀 부탁드립니다. 참고로 통신 프로토콜은 RS485, HDLC 프로토콜에 NRZI 코딩하여 송수신하고 잇습니다.
일반적으로 사용하는 9600bps 로 통신을 한다면,
1초에 약 100바이트를 보내게 됩니다.
즉 1바이트를 보내는데 10mS 가 소요됩니다.
5바이트 이상의 데이터를 보낸다면 50mS 안에 응답을 완료하기 힘들겁니다.
2. (무조건) RX는 인터럽트로 처리해야 하고요....
(다른 루틴 처리하다 데이터를 잃을 경우가 생길수 있기 때문에)
Tx 는 while로 처리하면 될듯합니다.
circular Queue 를 사용하여 RX데이터를 처리하면 간단합니다.
즉, 데이터를 RX인터럽트로 받어 Q에 넣고, 수시로 수신된 데이터의 갯수를 체크하고, RX 데이터를 검사하는 겁니다.
여기에서 응답해야 하는 패킷을 들어 왔을 경우에는 바로 응답을 보내지 않고, 플래그를 하나 만들어서, SET 하고,
while()의 TX함수에서 그 플래그가 SET되어 있는 경우에 응답해주면 될겁니다.
간단하게 구조를 보면 아래처럼 될겁니다.
RX인터럽트(){
큐에 보관....
}
TX함수(){ // 딜레이 타이머를 지정하지 않음
데이터를 보내야 하면 => 데이터를 보내라.
}
RX데이터분석함수(){ // 딜레이 타이머를 지정하지 않음
큐에 분석할 만한 데이터의 수가 있는가? 그렇지 않다면 그냥 나감.
큐에 헤더, 데이터등의 패킷이 유효한가? 그렇지 않다면 (노이즈이기 때문에) 큐를 초기화 하고 나감
패킷을 분석하여 TX 를 하겠다는 플래그 SET, 큐 초기화
}
while(){
TX함수();
기타함수들();
RX데이터분석함수();
}