|
아직 해결이 안된 모양이네요..
아래 코드를 보니 송신부분은 버튼의 클릭이벤트를 쓰고 수신은 CPort의 수신 이벤트를 사용하신 것으로 보입니다.
이렇게 따로 나누어서 사용하지 마시고 그냥 버튼의 클릭 이벤트에서 한꺼번에 해결을 하세요..
void __fastcall TForm1::Button3Click(TObject *Sender)
{
char buff[100];
double voltage ;
ComPort2->Open(); <- 이 부분은 버튼 누를때 마다 하지 마시고 폼생성시에 하던지 하세요..
ZeroMemory(buff, 100) ;
sprintf(strr,"MEAS:VOLT:DC?%c",0x0a);
ComPort2->Write(strr,StrLen(strr));
Sleep(100) ;
ComPort2->Read(buff,100) ;
voltage = atof(buff) ;
StringGrid->Cells[1][1] = voltage ;
}
앱돌이 님이 쓰신 글 :
: c++왕초보자 질문좀 받아주세요
: Button3를 누르면 계측기로 명령어가 입력되어 rx부분에서 수신받아 LoadGrid함수를 불러 StringGrid에 뿌려지는 소스인대요
: StringGrid에 뿌려지는 걸 확인해보면 Read부분에서 아주잠깐 지연시간을 주면 정상적으로 계측기의 값이 입력됩니다.
: 지연시간을 없에버리면 숫자가 한개씩입력되거나 아예 입력이 안됩니다.
: breakPoint를 주고 확인해보면 breakpoint때문인지 정상적으로 입력이 됩니다.
: 그래서 다른분들의 조언을 들어 Rx부분 Count가 충분히 되었는지 확인하기위해 buff에 E가 입력될시 함수 호출하는 식으로 수정을 했는데 이번엔 Sleep을 해주면 정상출력되고 Sleep을 제거하면 E만 출력됩니다. ㅜ.ㅜ 너무 답답해서 조언을 구합니다.
: 질문1: Count가 충분한지 확인하려면 어떤식으로 수정을 해야할까요?
: 질문2: Count로 확인하지않고 buff에 문자열이 다들어왔는지 확인하기위해선 어떤식으로 수정해야할까요?
: 질문3: 문자열에 ETX까지 입력되었는지 확인하기위해선 어떻게해야할까요?
:
: 전송방식은 rs232 LF입니다.
:
:
:
: 메모 부분은 그냥 확인하기 위해 만든거라 무시하셔도됩니다.
:
:
: double voltage;
: AnsiString ConVolt;
: char strr[200];
:
: void __fastcall TForm1::Button3Click(TObject *Sender)
: {
:
:
:
: ComPort2->Open();
: sprintf(strr,"MEAS:VOLT:DC?%c",0x0a);
: ComPort2->Write(strr,StrLen(strr));
:
:
:
:
: }
:
:
: void __fastcall TForm1::ComPort2RxChar(TObject *Sender, int Count)
: {
:
: char buff[100];
:
: memset(buff,0,sizeof(buff));
: for(int i=0;i<Count;i++){
: ComPort2->Read(buff,Count);
: Memo2->Lines->Add(buff);
: if(strstr(buff,"E")!= NULL){
: voltage = atof(buff);
: ConVolt = FloatToStr(voltage).sprintf("%.3f",voltage);
: LoadGrid();
:
: }
: }
:
:
:
:
:
: }
|