|
답변 감사 드립니다.
무선은 아닌데... 지금 좀 골치 아프게도.. RS-232로 물려 있는 장비가 다른 장비의 영향을 받아서
Rx라인에다가 노이즈를 흘려 보내 버립니다. 노이즈를 내 보내는 장비에서는 Tx로 보내고..
당연히 OnRxChar 이벤트가 계속 발생이 될거구.. 그러다가.. 프로그램이 완젼히 사라져 버립니다.
이현상을 프로그램적인 측면에서 해결을 해야 할지.. 메카니즘 측면에서 해결을 해야 할지..
일단 눈에 보이는 현상대로 담당자인 저에게 책임이 주어 지는데.. 어떻게 설명을 해줘야 할지..
코딩은 아래와 같이 되어 있구요.. 이게 총 12개 입니다..
문제 될만한 부분을 좀 집어 주시면 ...
void __fastcall TForm1::ComPort3RxChar(TObject *Sender, int Count)
{
unsigned char s[20];
int data;
int data1;
ComPort3->Read(s,Count);
if(s[1] == 0x90){
data = s[2];//이렇게 하면 10진수로 변환 되드군요. ^^;
data1 = s[3];
Edit19->Text = ((data*256+data1)/10);
}
if(s[1] == 0x91) {
data = s[2];
Edit20->Text = data;
if(TriggerAuto[0] == true) {
if(StrToInt(Edit20->Text) > StrToInt(Edit14->Text) * 0.5)
TriggerB1->OnClick(TriggerB1);
}//if
if((StrToInt(Edit14->Text) != 0)&&
StrToInt(Edit20->Text) >= (StrToInt(Edit14->Text)*0.70) &&
StrToInt(Edit20->Text) <= (StrToInt(Edit14->Text)*1.30)){
PowerOnOff[0] = true;
AGun_1->Picture->Bitmap->LoadFromResourceName((int)HInstance,"Gun_01");
}//else
else {
PowerOnOff[0] = false;
if(TriggerB1->Down == false && TriggerAuto[0] == false &&
PowerOn1->Down == true && StrToInt(Edit14->Text) != 0) TriggerB1->OnClick(TriggerB1);
AGun_1->Picture->Bitmap = NULL;
}//else
}//if
if(s[1] == 0x92) {
data = s[2];
Edit21->Text = data;
}
}
김시환 님이 쓰신 글 :
: 일반적으로 시리얼 포트는 유선으로 연결되어 있을 경우 노이즈가 거의 안들어 오는데
: 지속적으로 노이즈가 들어 온다면 혹시 무선 데이타를 받는 것인지요?
:
: 유선으로 데이타를 받는다면 ComPort1->ReadStr(Str,Count); 이 문구를 써도 문제가
: 없겠지만 만일 무선을 쓴다면 이런 구문은 좀 위험합니다.
:
: 만일 무선 데이타를 받는 것이라면 1바이트씩 받아서 처리하는 방법을 써야 합니다.
: 일반적으로 무선의 경우 Header 데이타를 가지고 있는데 1바이트씩 처리하면서 헤더 값이
: 검출 되면 그때 부터 데이타를 버퍼에 저장을 하여야 합니다.
: 이런경우 일반적으로 버퍼는 링 버퍼 형태를 많이 쓰죠..
:
: 그리고 데이타를 받는 부분과 받은 데이타를 처리하는 부분을 나누어서 별도의 쓰레드에서 처리하는
: 것이 좋을 겁니다. 무선의 경우 계속해서 데이타가 들어오기 때문에 들어 오는 데이타 처리하랴
: 받은 데이타 처리하랴 좀 바쁠 겁니다. 이럴땐 일을 분담해서 해야 겠죠...
:
: 하지만 유선인데도 노이즈가 들어 온다면 그건 선로상에 문제가 있는 경우가 오히려 높을 겁니다.
: 아니면 데이타가 전송중에 깨지던가 그렇겠죠,, 이럴땐 에러 검출을 해서 데이타를
: 구분해서 써야 하겠죠,.
: 시리얼 통신에서 에러 처리는 CRC 를 많이 씁니다.
:
|