링버퍼 관련 코드 질문

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);
}

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.