C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[68859] Re:Re:Re:시리얼통신을 하기위해서는 꼭 쓰레드를 써야 하는 건가요?
망치 [mangchy] 2034 읽음    2012-12-21 13:11
흠....DebugPort->Read 인자에 Count는 최대 읽어낼 갯수가 아닐까 다시 한번 생각합니다.
그래서 보통 1024, 4096 저는 이런식으로 최대 숫자를 넣고,
Read에서 리턴되는 값을 버퍼에 복사합니다.

저의 개인적인 상식으로 풀어쓰면

time.start
while(1)
{
    int size = Read(버퍼, 1024);

    for(size만큼) 버퍼에 복사

    if( 프로토콜 마지막인가?) break;

    if(time.pending > timeout)
    {
        타임아웃으로 break.
    }
}

if( 정상 데이터 저장 이면) 데이터 뿌리고
else if( 타임아웃 이면) 타임아웃 뿌리고...

=> 위 경우는 프로토콜의 경우이고, time은 그냥 예를 들기 위해 임의로 넣은거니 실제에서는 다른것으로 바꾸셔야 합니다.
   로직을 설명하기 위한거니까요.

=> 그냥 디버그 용도로만 뿌리고 싶다면

타이머 이벤트
{
    타이머 disable;

    int size = Read(버퍼, 1024);
    for(size만큼) 메모장에 뿌리고...

    타이머 enable;
}


간만에 답변 달려니 ...으

프로바라기 님이 쓰신 글 :
: 답변 감사드립니다.
: 제가 쓰레드를 언급한 이유는 데이터를 못받는 이유가 타이밍때문, 데이터를 다 받아서 처리하기 전에
: 새로운 데이터가 들어와서 DebugPortRxChar가 호출되는 현상이 아닐까 하는 생각때문이었고요
:
: 말씀하신바에 따르면 count값이 들어오는 데이터 타입의 갯수 인가요?
: 그렇다면  아래와 같이 해보았는데요.. count값이 죄다 0으로만 찍히고  있습니다. ㅜ.ㅜ 따라서 if문은 항상 false
:
: if(count == 6)
: {
:     memset(&rcv[0], 0, sizeof(rcv));
:     DebugPort->Read((void *)&rcv[0], Count);
:
:     sscanf(&rcv[0],"%f%f%f%f%f%f",&data[0],&data[1],&data[2],&data[3],&data[4],&data[5]);
: }
: else
:    Memo->SelText = count;
:
:
: 송신보드의 소스는
: sprintf(buf,"%f %f %f %f %f %f",phi,theta,psi,gx,gy,gz);
:
:
: 일반 에뮬레이터로 출력한 데이터 스샷을 첨부합니다.
:
:
: 망치 님이 쓰신 글 :
: : 데이터를 수신하는데 있어 쓰레드는 별개의 문제인거 같군요.
: :
: : 문의하신 소스만 보았을때는 문제가 있는거 같습니다.
: : Count가 리턴되는데 sscanf에서는 무조건 0~5까지 배열값을 뿌리게 되어있군요.
: : 실질적으로 6바이트가 안들어올수 있는데요.
: :
: : 만일 Count=2값이 되었을때 0,1 배열값을 뺀 나머지는 쓰레기값으로 뿌려지겠군요...
: :
: : 이 시점에서 쓰레드를 쓸것인가를 고민하게 되는데
: : 만약 6바이트만 들어온다고 보았을때 이 6바이트가 최대 타임아웃이 얼마냐에 따라
: : 쓰레드 사용 결정을 할수 있겠네요. 왜냐하면 그 시간동안 데이터가 들어오는거 확인하는동안 다른걸 못하기 때문인거죠.
: :
: : 타임아웃이 만약 1초로 되어있다면 1초동안 계속적으로 Read하고 6개가 다 받아졌을때 그 루틴을 빠져나오면 되겠네요...
: :
: : 정확하게 사용하는 프로토콜등을 모르니 여기까지....
: :
: : 프로바라기 님이 쓰신 글 :
: : : rs232방식으로 보드와 통신을 하는중인데요...
: : : 일반 다운로드한 프로그램들은 데이터를 잘만 받는데
: : : 제가 만든 프로그램에서는 데이터가 앞부분만 들어온다던지 하는 등의
: : : 정상적인 데이터를 받을 수 가 없네요..
: : :
: : : DebugPortRxChar(TObject *Sender, int Count) 함수내에서
: : :
: : : DebugPort->Read((void *)&rcv[0], Count);으로 데이터를 받고
: : : sscanf(&rcv[0],"%f%f%f%f%f%f",&data[0],&data[1],&data[2],&data[3],&data[4],&data[5]);
: : : 으로 데이터를 변환 추출하고 있는데 쓰레기 값도 많이 들어오고 놓치는 데이터도 많고요
: : : 조언좀 부탁드립니다.

+ -

관련 글 리스트
68850 시리얼통신을 하기위해서는 꼭 쓰레드를 써야 하는 건가요? 프로바라기 1718 2012/12/20
68872     Re:시리얼통신을 하기위해서는 꼭 쓰레드를 써야 하는 건가요? 프로그램초짜 2094 2012/12/24
68851     Re:시리얼통신을 하기위해서는 꼭 쓰레드를 써야 하는 건가요? 망치 2035 2012/12/20
68858         Re:Re:시리얼통신을 하기위해서는 꼭 쓰레드를 써야 하는 건가요? 프로바라기 2032 2012/12/21
68859             Re:Re:Re:시리얼통신을 하기위해서는 꼭 쓰레드를 써야 하는 건가요? 망치 2034 2012/12/21
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.