참고. 대부분의 컴 포트 구성 요소는 소유자에게 다시보고 할 때 단서가 없습니다. 일반적으로 포트에서 바이트를 수집하는 스레드는 OS에서 하나 이상의 바이트를 처리 할 준비가되었음을 알립니다. 이 정보는 귀하의 레벨까지 간단히 나타납니다. 따라서 메시지가 전송되기를 기대할 때 OS가 제공하는 것을 얻을 수 있습니다.
들어오는 모든 문자를 글로벌 버퍼에 버퍼링해야합니다. 메시지 문자열에서 마지막 문자를 얻으면 메시지를 처리하십시오.
다음은 메시지 시작이 특수 문자로 식별되고 메시지의 끝이 다른 문자로 식별되는 예입니다.
메시지를 다른 방법으로 작성한 경우 코드를 적용하는 방법을 알 수 있습니다.
var
finalBuf: AnsiString;
{- Checking message }
Function ParseAndCheckMessage(const parseS: AnsiString) : Integer;
begin
Result := 0; // Assume ok
{- Make tests to confirm a valid message }
...
end;
procedure TMainForm.ComPortRxChar(Sender: TObject; Count: Integer);
var
i,err: Integer;
strBuf: AnsiString;
begin
ComPort.ReadStr(strBuf, Count);
for i := 1 to Length(strBuf) do
case strBuf[i] of
'$' :
finalBuf := '$'; // Start of package
#10 :
begin
if (finalBuf <> '') and (finalBuf[1] = '$') then // Simple validate check
begin
SetLength(finalBuf, Length(finalBuf) - 1); // Strips CR
err := ParseAndCheckMessage(finalBuf);
if (err = 0) then
{- Handle validated string }
else
{- Handle error }
end;
finalBuf := '';
end;
else
finalBuf := finalBuf + strBuf[i];
end;
end;
이 알려진 문제입니다 : 예 문자의 4 한 금액을 초과 할 수 없습니다. 더 많은 환경에서 사용했습니다. 데이터 이벤트 트리거는 실제로 다음 데이터보다 빠릅니다. 독서하기 전에 잠깐 기다리는 것 외에 다른 것이 있다는 것을 확신하지 못합니다. – pritaeas
이것은 매우 정상적이며, 버퍼에 문자를 저장하고 타이머를 재설정해야합니다. 그런 다음 타이머를 사용하여 실제 활동을 트리거하십시오. 타이머가 꽤 빡빡 할 수 있습니다. "상태 머신"으로 끝내고 이벤트에 대한 트리거를 원합니다. – mj2008
Djean Crnila의 TComport (여러 구성 요소를 'TComport'라고 함)를 사용한다고 가정합니다. 이 문제는 데이터 이벤트 트리거와 관련이있을 수 있지만 직렬 장치의 전송 속도가 사용자의 comport 제어 속도와 다른 속도로 설정 될 수도 있습니다. 장치가 몇 밀리 초마다 패킷을 보내는 경우 패킷이 적당한 길이이면 전체 데이터 패킷을 쉽게 캡처하고 파싱 할 수 있어야합니다. 장치가 패킷 제어 문자의 끝을 보냅니 까? - 더 쉬워진다.기기에 대한 더 많은 정보를 제공하면 수신 된 패킷 등 누군가가 도움을 줄 수 있습니다. – SteveJG