티스토리 뷰

반응형

//UART 데이터 수신처리 예제 코드입니다.

void xputs_no_rn(char *s)
{
printf(s);
}
void xputs_str(char *s,char *a)
{
xputs_no_rn(s);
xputs_no_rn("=");
xputs(a);
}
void xputs_int(char *s,int a)
{
char buf[64];
itoa(a,buf,10);
xputs_str(s,buf);
}
void xputs_Hex(char *s,int a)
{
char buf[64];
itoa(a,buf,16);
xputs_str(s,buf);
}




int HEX1_to_bin(char hex1,int *ret)//0x 빼고 넣어주세요
{
int r=0,bok=1;
char a=hex1;
if(('0'<=a)&&(a<='9'))
{
r=a-'0';
}
else if(('a'<=a)&&(a<='f'))
{
r=a-'a'+10;
}
else if(('A'<=a)&&(a<='F'))
{
r=a-'A'+10;
}
else
{
//err
bok=0;
}
*ret=r;
return bok;
}
int HEX_str_to_bin(char *hex_str)//0x 빼고 넣어주세요
{
int ret=0,b;
char a;
while(1)
{
a=*hex_str;
if(a==0)break;
hex_str++;
if(HEX1_to_bin(a,&b))
{
ret=(ret<<4) | b;
}
else
{
//err
break;
}
}
return ret;
}


#define rx_fifo_buf_SIZE 64
volatile char rx_fifo_buf[rx_fifo_buf_SIZE];
volatile int rx_fifo_buf_w,rx_fifo_buf_r,rx_fifo_buf_cnt;
void UART_rx_fifo_push(char a)//인터럽트에서 호출
{
if(rx_fifo_buf_cnt<rx_fifo_buf_SIZE)
{
rx_fifo_buf[rx_fifo_buf_w]=a;
rx_fifo_buf_w++;
if(rx_fifo_buf_w>=rx_fifo_buf_SIZE)
{
rx_fifo_buf_w=0;
}
rx_fifo_buf_cnt++;
}
}
char UART_rx_fifo_pop()//메인루프에서 호출
{
char a=0;
if(rx_fifo_buf_cnt>0)
{
a=rx_fifo_buf[rx_fifo_buf_r];
rx_fifo_buf_r++;
if(rx_fifo_buf_r>=rx_fifo_buf_SIZE)
{
rx_fifo_buf_r=0;
}
rx_fifo_buf_cnt--;
}
return a;
}
void rx_fifo_push_str(char *s)
{
while(*s)
{
UART_rx_fifo_push(*s);
s++;
}
}


char fifo_getch()
{
while(rx_fifo_buf_cnt==0)
{
CPU_Sleep();
}
return UART_rx_fifo_pop();
}
int fifo_read_int(void)
{
int ret=0,a;
while(1)
{
a=fifo_getch();
if(('0'<=a)&&(a<='9'))
{
ret=ret*10+(a-'0');
}
else
{
//err
break;
}
}
return ret;
}
int fifo_read_HEX(void)
{
int ret=0,a,b;
while(1)
{
a=fifo_getch();
if(HEX1_to_bin(a,&b))
{
ret=(ret<<4) + b;
}
else
{
//err
break;
}
}
return ret;
}
void xputs_Hex(char *s,int a);
void on_rx_NMS(void)
{
int a,b;

a=fifo_read_HEX();
xputs_Hex("NMS1",a);//NMS1=a1b2

//','는 이미 읽었다.

b=fifo_read_HEX();
xputs_Hex("NMS2",b);//NMS2=c3d4
}
volatile char status;//상태변수
void on_rx_1byte(char a)
{
switch(status)
{
case 0:
if(a=='N')
{
status++;
}
else
{
status=0;//err. reset
}
break;
case 1:
if(a=='M')
{
status++;
}
else
{
status=0;//err. reset
}
break;
case 2:
if(a=='S')
{
status++;
}
else
{
status=0;//err. reset
}
break;
case 3:
if(a==':')
{
//ok
on_rx_NMS();
status=0;//reset
}
else
{
status=0;//err. reset
}
break;
default:
status=0;//err. reset
}
}
void UART1_rx_proc()
{
while(rx_fifo_buf_cnt>0)
{
on_rx_1byte(UART_rx_fifo_pop());
}
}





//테스트용 코드
void test_UART1_rx_proc(void)
{
//테스트용 코드
rx_fifo_push_str("NMS:A1B2,C3D4\r\n");
rx_fifo_push_str("NMS:1234,5678\r\n");
UART1_rx_proc();
}

//실제 코드
void main()
{
...
while(1)
{
...
UART1_rx_proc();
CPU_sleep();
}
}
/*
출력
--------------
NMS1=a1b2
NMS2=c3d4
NMS1=1234
NMS2=5678
*/

/*
위 방식은 1바이트씩 받아서 처리하는 방식입니다.
(다른 방법도 있습니다. 방법은 여러가지가 있습니다.)

(버퍼만 충분하다면) 1줄(1Line)씩 받아서 처리해도 상관없습니다.
예) "NMS:1234,5678\r\n" 다 받을때까지 기다렸다가 1줄씩 처리
*/

반응형

'C언어' 카테고리의 다른 글

stm32 tick count 1msec 수정 포인트  (0) 2022.06.15
HEX 문자열을 바이너리로 변환하는 샘플코드입니다.  (0) 2022.04.30
BuildDateTime.exe  (0) 2022.03.24
RP2040 개발환경(작성중)  (0) 2022.02.02
strcnt  (0) 2021.06.06
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함