안녕하세요.
avr펌웨어를 하면서 데이타 파싱하는 부분에 문제가 있어서 이렇게 도움을 요청합니다.
시리얼인터럽트 루틴에서 데이타를 받으면서 비슷한 값의 데이타를 받으면 하나로 인식하는 현상이 발생합니다.
예를들면, ERROR1~15라는 데이타 값이 있는데요. 문자이구요.
ERROR1, ERROR10,ERROR11,ERROR12,ERROR13,ERROR14,ERROR15의 데이타값을 각각 수신하면...ERROR1로만 인식이 됩니다.
한바이트씩 받으면서 처리하기때문에 7자 문자가 6자 문자로 받으면서 먼저 ERROR1로 인식해 버립니다.
어떻게 처리하면 되는지 좋은 조언부탁드립니다.
UCHAR Rev_Data = 0;
ISR(USART0_RX_vect)
{
Rev_Data = UDR0;
// Parsing_ReceiveData_Xray(Rev_Data); // 받은 데이타를 파싱하는 함수
}
질문
1. 한바이트씩 데이타를 받아서 비교해서 처리하는데요..
예를들어, ERROR1, ERROR10인 경우에 파싱하는 함수에서 마지막 데이타 값과 전체 LENGTH를 비교해서 처리하는데....
ERROR10인 경우 7바이트의 LENGTH이지만, 한바이트씩 받아서...먼저 6바이트 LENGTH루틴으로 빠져버립니다.
수신인터럽트상에서 6바이트인지...7바이트인지를 어떻게 처리해야 하나요?
며칠동안 모든 방법을 동원했지만.....쉽게 해결되지않네요...
답변 부탁드립니다.
답변이랑 의견이랑 다른거군요.ㅎㅎ
제가 생각하기에는 두가지 방법이 있을 듯 합니다.
1. 모든 데이터 값을 7 바이트로 처리하는 방법입니다. ERROR1 -> ERROR01 로 변경해서 처리하면 어떨지요.
2. 일단 데이터들이 6바이트든 7바이트든 연속해서 올텐데요. 그 간격 만큼 기다렸다가 데이터를 해석하는 방법이 있겠습니다. 즉 다음 바이트가 들어올 시간동안 기다려보고 들어오는 데이터가 없으면 마지막 바이트가 들어온 것으로 보고 데이터 파싱 처리하는 방법이 되겟습니다. 참고가 되시길...
string.h 를 include 하신 다음에
uart data를 string 형으로 저장한다음, 아래와 같이..
while(rx_counter_usartf1 != 0) //
{
RxString1[RxCountTemp1] = rx_char(1);
RxCountTemp1++;
}
if( ( strncmp( "ERROR1", RxString1) ) == 0 ) {...............} //문자열 비교하여 같으면 '0'
else if( ( strncmp( "ERROR2", RxString1) ) == 0 ){...............} //문자열 비교하여 같으면 '0'
else if( ( strncmp( "ERROR3", RxString1) ) == 0 ){...............} //문자열 비교하여 같으면 '0'
else if( ( strncmp( "ERROR4", RxString1) ) == 0 ){...............} //문자열 비교하여 같으면 '0' .........
형태로 비교처리하는 방식으로 가시는 것이 어떠실런지?
생각보다 잘~~~ 됩니다.