|
그걸 처음부터 생각하고 짠건 아니지만 0x0d가 들어오기전에는 버퍼를 초기화 시키지
않기 때문에 count 가 나누어져서 들어와도 문제가 되지 않을까 생각하는데요...
만약 hel가 첫번째에 들어오고 lo가 두번째에 들어오면
data [0] = h [1] = e [2] = l 이 들어가고 0x0d가 들어오지 않았기 때문에
그다음에 들어온 lo는 data [3] = l data [4] = o 에 쌓여서
그다음에 data와 buff를 비교를 할것 같습니다.
memicmp는 문자열 전체를 비교해서 같으면 0을 리턴해주기 때문에 맞추기가 어렵네요..
strcmp인가요? 이 비교문은 리턴을 3가지로 해주네요 이걸로 해봐야겠습니다.
less than s2 < 0
the same as s2 == 0
greater than s2 > 0
조각발 님이 쓰신 글 :
: 저도 거의 질문만 올리다가요..
:
: 혹시 데이터가 들어오는 양(?)을 확인해보셨나요??
:
: 저도 전에 비슷하게 해봤는데..(제 질문두 게시판에 있구여..보실 필욘 없음)
:
: 저는 5바이트를 한 패킷으로 통신하는 걸 해봤는데요..
:
: 그게 ComPort 의 OnRxChar에서 Count 가 정확히 5바이트로 들어오지 않더라구요..
:
: 어떨때는 4바이트 들어오고 다음에 1바이트..
: 어떨때는 3바이트 들어오고 다음에 2바이트..
: 어떨때는 5바이트 한번에 들어오고..
:
: 이거 한번 확인해보세요..
:
:
: 번외편 님이 쓰신 글 :
: : 아래와 같이 하면 맨처음에 Hello나 Enter user name: 또는 Enter login password: 가
: : 들어오면 리턴을 해주는데
: : 맨처음이 아니라 데이터를 송수신 하다가 Hello 등이 들어오면 리턴을 제대로 해주지 않는군요
: : 제가 생각할때는 초기화가 제대로 되지 않는것 같아서 그런거 같은데..
: : 여러곳에서 초기화를 시켜줘도 계속 그러네요..
: :
: : 어느부분에 이상이 있는건가요?
: :
: : void __fastcall TForm1::Comm1RxChar(TObject *Sender, DWORD Count)
: : {
: :
: : char str[500];
: : unsigned char buffer=0;
: : DWORD i,j;
: : int k;
: : char Buff[100];
: : static unsigned char data[200],serial_number = 0;
: : static unsigned char serial_data[500];
: : String *Str_Data =new String;
: : Comm1->Read(serial_data,Count);
: :
: : for(i=0;i<Count;i++)
: : {
: : data[serial_number] = serial_data[i] ;
: :
: : if(memicmp(data,"Hello"sizeof("Hello") ) == 0)
: : {
: : memcpy(Buff, "Hi",sizeof("\n\r"));
: : k = Comm1->Write(Buff,sizeof("Hi"));
: : memset(Buff,0,100);
: : }
: :
: : else if(memicmp(data,"Enter user name: ",sizeof("Enter user name: ") ) == 0)
: : {
: : Label5->Caption = "OK";
: : memcpy(Buff, "Korea\n\r",sizeof("Korea\n\r"));
: : k = Comm1->Write(Buff,sizeof("Korea\n\r"));
: : memset(Buff,0,100);
: : }
: :
: : else if(memicmp(data,"Enter login password: ",sizeof("Enter login password") ) == 0)
: : {
: : memcpy(Buff, "Seoul\n\r",sizeof("Seoul\n\r"));
: : k = Comm1->Write(Buff,sizeof("Seoul\n\r"));
: : memset(Buff,0,100);
: : }
: :
: : if( data[serial_number] == 0x0d )
: : {
: :
: : if( (data[0] != 0x1b) && (data[1] != 0x1b) )
: : {
: : *Str_Data = (char)data[0];
: : for(j=1;j<serial_number ;j++)
: : {
: : *Str_Data = *Str_Data + (char)(data[j]);
: : }
: :
: : Memo1->Lines->Add(*Str_Data ) ;
: : while(Memo1->Lines->Count>50)
: : Memo1->Lines->Delete(0);
: : Memo1->Perform(EM_LINESCROLL,0,Memo1->Lines->Count-1);
: : Memo1->SelStart=Memo1->Text.Length()-1;
: :
: : Memo1->SelLength=1;
: : }
: : serial_number = 0;
: : }
: : else
: : {
: : serial_number++ ;
: : }
: :
: : }
: : }
|