링버퍼 관련 코드 질문

coolpis6의 이미지

펌웨어 시작이제 한달쨰...아직 C문법도 잘 모르는 초보입니다.

어떻게 어떻게 해서....링버퍼 구현했습니다.....근데...프로그램 테스트를 프로그램상에서 임의의 데이터를 넣어주고

터미널로 보내서 링버퍼 동작을 하는지 확인을 했는데...임의의 데이터를 키보드 입력으로 넣어줄려고 하는데

막히네요..... 코드 좀 봐주세요.... 키보드 입력받은 부분이 잘못인거 같은데.....잘 모르겠네요....

대충 프로그램 설명을 하면 링버퍼[100]에서 스타스 포인터와 엔드 포인터를 정하고 데이터 길이만큼

*m_load_ptr 과 *m_consume_ptr이 이동을 합니다.....Add_buffer() 에서 데이터 입력을 저장하고

Get_buffer() 에서 입력한 만큼 읽어갑니다... ( 1바이트씩 처리해야함(여러바이트라도 결국은 한바이트씩 처리) ) 이후

터미널상엔 버퍼안에 내용을 모두 뿌려줍니다.

아래 빨간색부분이 의심이 가는데 어떻게 수정을 해야할지 모르겠네요....

** 추가로 아래 코드로 테스트는 아스키모드로만 되더라구요....헥사 모드로 바꿀려면 프로그램 손 많이 되야되나요?

#include "io8535.h"
#include "string.h"

unsigned char *m_load_ptr, *m_consume_ptr;
unsigned char *m_buff_end;
unsigned char *m_buff;
unsigned char m_max_load, m_max_consume, m_data_in_buffer;

unsigned char buffer[100];
unsigned char rBuffer[10];
unsigned char i;

// 전송
void PUT( unsigned char TX_D )
{
while(!(USR & 0x20)); // 송신 가능 ?
UDR = TX_D; // 송신
}

// Updata_State
void Update_State(void)
{
if(m_consume_ptr == m_buff_end) m_consume_ptr = m_buff;
if(m_load_ptr == m_buff_end) m_load_ptr = m_buff;

if(m_load_ptr == m_consume_ptr)
{
if(m_data_in_buffer > 0)
{
m_max_load = 0;
m_max_consume = m_buff_end - m_consume_ptr;
}
else
{
m_max_load = m_buff_end - m_load_ptr;
m_max_consume = 0;
}
}
else if(m_load_ptr > m_consume_ptr)
{
m_max_load = m_buff_end - m_load_ptr;
m_max_consume = m_load_ptr - m_consume_ptr;
}
else
{
m_max_load = m_buff_end - m_load_ptr;
m_max_consume = m_buff_end - m_consume_ptr;
}
}

//RingBuf init
void Init_RingBuffer(void *buffer, unsigned char buffer_size)
{
unsigned char m_buffer_size = buffer_size;

m_buff = (unsigned char *)buffer;
m_buff_end = m_buff + m_buffer_size;
m_load_ptr = m_consume_ptr = m_buff;
m_max_load = m_buffer_size;
m_max_consume = m_data_in_buffer = 0;
Update_State();
}

// Add data
void Add_Buffer_Data(const void *inData, unsigned char len)
{
if(len > (unsigned char)m_max_load)
len = (unsigned char)m_max_load;

memcpy(m_load_ptr, inData, len);
m_load_ptr += len;
m_data_in_buffer += len;
Update_State();
}

// Get data
void Get_Buffer_Data(void *outData, unsigned char len)
{
if(len > (unsigned char)m_max_consume)
len = (unsigned char)m_max_consume;

memcpy(outData, m_consume_ptr, len);
m_consume_ptr += len;
m_data_in_buffer -= len;
Update_State();
}

// 키보드 입력
#pragma vector = UART_RX_vect
__interrupt void UART_RXD(void)
{
unsigned char *ch;
*ch = UDR;

Add_Buffer_Data(&ch, sizeof(ch));

Get_Buffer_Data(rBuffer, sizeof(ch));

for(i=0; i<10; i++)
{
PUT(buffer[i]);
}
}

void main(void)
{
// serial init
UBRR = 11; // 3.6864[MHz]일 경우 19200[bps]
UCR = 0x98; // 송신,수신 인에이블, 수신 인터럽트 인에이블
SREG = 0x80; // 전체 인터럽트 인에이블

Init_RingBuffer(buffer, 100);
}