|
일단 문제가 없는 소스와 잘 안되는 소스를 비교해야 할겁니다.
그리고 문제 해결을 위한 테스트를 몇가지 해봐야할거고요
제대로 되는 처음의 방법은 텍스트를 한꺼번에 보내지 않고 라인단위로 끊어서 보내는겁니다.
한꺼번에 보낼때 안된다면 님이 사용하는 ComPort의 WriteStr에서 한번에 보낼 수 있는 문자수에
제한이 있지 않을까요?
데이터 크기를 조금씩 늘려가면서 테스트 해보시면 금방 알수 있을겁니다.
또한 ComPort콤포넌트의 버퍼 크기와도 연관이 있을 것 같습니다.
자료실에 있는 ComPort사용한거라면 기본 버퍼가 1024로 되어 있는것으로 기억하는데..
버퍼크기를 늘려보고 테스트해 보시죠.
그리고 아래 두가지 방법에서 앞의 데이터는 가는데 뒷부분이 안간다고 했죠?
그러면 앞의 데이터가 정확히 몇바이트까지 가는건지...
또 제대로 가는 바이트 수가 일정한지..
그것과 버퍼 크기와 연관성이 없는지 등등 생각해 보세요
일반적인 말씀을 드리면..
시리얼 통신 속도 그다지 빠르지 않기 때문에
많은 양의 데이터를 흐름 제어 없이 보내는데는 문제가 있다고 봅니다.
따라서 ComPort의 흐름제어(Flow Control) 기능을 사용하고 있는지 확인도 필요합니다.
흐름제어를 지원하지 않는다면
직접 Ack, Nak신호를 이용해서 제대로 갔는지 데이터를 받았는지 확인하면서 보내는 루틴을
작성하는것이 권장할만한 방법이라고 생각합니다.
나름대로 문제 해결 방향을 제시해 봤는데 도움이 되었기를 바랍니다.
즐거운 하루 되시길.. ^^
즐겁게~ 님이 쓰신 글 :
: 초보자 입니다~ ^^;;
: C++ 빌더를 공부하는데, 이곳은 자료천국인것 같습니다.(아부아님..)
: 열심히 하시는 분들에게 늘 좋은일이 있길 바라며~
: 저의 질문은 아래를 보아주세요~
:
: AnsiString filename = FormMain->OpenDialog->FileName;
: FormMain->EditTx->Lines->LoadFromFile(filename);
:
: int length = FormMain->EditTx->Lines->Count;
: for(int i=0 ; i<length ; i++)
: {
: FormMain->ComPort->WriteStr(FormMain->EditTx->Lines->Strings[i]);
: }
: *위와 같이
: 1) 파일을 open하여
: 2) RichEdit에서 파일을 load하고
: 3) RichEdit의 data를 serial로 전송하면 무지 잘 되는데여~
:
: 1)번과 2)번은 동일하고 3)번의 방법만 아래의 두 가지 방법으로 변경했을때,
: text의 length가 길면(참고로 테스트한 파일의 length는 7300 정도임다.)
: 앞의 data는 전송이 되는데, 뒤의 data는 전송이 안됩니다.
: 이유가 뭔지(실수한 부분이 있는지), 혹 해결 방법이 있는지... 알고싶습니다.
:
:
: [방법 1]
: FormMain->ComPort->WriteStr(FormMain->EditTx->Text);
:
: [방법 2]
: AnsiString str = FormMain->EditTx->Text;
: unsigned char *ch = (unsigned char *)str.data();
: int length = FormMain->EditTx->Text.Length();
:
: for(int i=0 ; i<length ; i++)
: {
: FormMain->ComPort->TransmitChar(*ch++);
: }
:
|