|
유엔아이 현입니다.
에구 좀 까다로운 질문이네요~
글구 질문제목을 점 어울리게 쓰시지요~
485 리시브 루틴어케 짜요 하고 물어보면서 타이머 관련이라니원
타이머 한참 찾았습니다.
리시브 루틴은 일단 어떤 통신라이브러리를 쓰는지는 모르겠지만
일반적으로 리시브 이벤트에서 ...
데이타를 받으면 그 데이타를 프로토콜 크기 만큼의 링큐 버퍼를 잡으시고
큐로 돌려가면서 테일 검사를 하고 맞으면 헤더검사를 하고 그것도 통과하면
체크썸 체크를 하시는게 일반적입니다.
뭐 간단하게 여기 까지 답변할수 있겠구요~~
링큐 운용법까지 알려 달라고 하면 헉 ... 자료 구조 책 디저보십시요라고 답변
할겁니다.
자료구조를 글로 설명하기에는 영 말주변이 없어서리~~
저희 같은 경우는 시리얼 통신과 프로코콜을 잡아주는 로직자체를 간단한
프로퍼티조정으로 가능하게 컴포넌트화 해서 사용하구 있답니다.
이부분 공개는 아직까지는 힘들겠군요~~
그럼
콩아 님이 쓰신 글 :
: 안녕하세요!
: 안녕하세요.. 패킷을 만들어서 데이터를 날려야 하거든요..(RS485통신을 합니다.)
:
: RS485통신을 하는데 있어서 시스템에서 단말기로 전송을 시작하기전에 Token연결(서로통신할 수 있는 ok 할수 있는...)하는 패킷을 먼저 날려보내면 단말기 쪽에서 시스템에서 보낸 메세지를 동일하게 보내면 token할수 있는 것이고 그렇지않으면 에러가 나는 프로그램을 작성하려고 합니다. 좀 도와주세요!!
:
: void __fastcall TfrmDoorDownload::labdownloadClick(TObject *Sender)
: {
: BYTE bSendBuf[256], bBuf[512];
: int iSendLen;
:
: memset(bSendBuf, ' ', 256);
:
: MakeDL_START_pkt(0xA1, 1, 1, bSendBuf, &iSendLen);
: cpComport5->Write( bSendBuf , iSendLen );
:
: BinToHexASCii ( bBuf, bSendBuf, iSendLen);
: meotrandata->Lines->Add( "COM5 Send --> " + AnsiString ((char *) bBuf) );
: }
:
:
: // 단말기 패킷부분
: // 아래는 단말기로 보내기위한 token를 보내는 패킷의 정의부분입니다.
: //FC 0xA0 -> Token패킷 (비고)'0'/'1' : Line Off / Line On
:
: void MakeDL_START_Pkt(BYTE func, BYTE* Buf, int iLen, int* iPktLen)
: {
: BYTE LRC = 0;
: BYTE pkt[256];
:
: pkt[0] = STX; // Strat of Text
: pkt[1] = (iLen+1)>>8; // Packet Length - 2bytes Integer value (LEN1)
: pkt[2] = iLen+1; // Packet Length - 2bytes Integer value (LEN2)
: pkt[3] = func; // Function Code
: memcpy(pkt+4, Buf, iLen); // Packet n번째 DATA
: pkt[4+iLen] = ETX; // End of Text
: for (int i =1;i<=4+iLen;i++) // LEN1에서부터 ETX까지 EX-OR한 값
: LRC ^= pkt[i];
:
: pkt[4+iLen+1] = LRC;
: memcpy (outpkt, pkt, iLen+5 );
: *iPktLen = iLen+5;
: }
:
: 위의에는 token패킷을 보내기위한 부분과 패킷을 정의한 부분으로 되어있습니다.
: 제가 하고자하는것은 위의 token패킷을 보내고자하는 부분이 맞았는가 하는것이고 그리고 token패킷을 보내고 응답패킷을 받야하 하는데 이것을 Data Receive라는 함수를 만들어야 한다고 하는데 어떻게 작성하는 되는지요... 좀 알려주셔요..
: 질문이 두서없었더라면.. 다시 질문해주셔요...
: 꼭 답변좀 부탁드립니다.
: 수고하셔요!!!
|