|
아 해결되었습니다.!! GODSON님께서 atof알려주셔서 정말 어찌나 큰도움이 되었는지
Sleep을 빼면 좀더빨라질거같아 Sleep을 빼는쪽으로 생각을 하고있었습니다. ㅎㅎ
도움 감사합니다.
김시환 님이 쓰신 글 :
: 아직 해결이 안된 모양이네요..
:
: 아래 코드를 보니 송신부분은 버튼의 클릭이벤트를 쓰고 수신은 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();
: :
: : }
: : }
: :
: :
: :
: :
: :
: : }
|