|
pos = (strstr(pos, strstr(pos, "E")) != NULL) ? (strstr(pos, strstr(pos, "E")+1) : NULL;
^
|
요기 괄호가 하나 더 추가되어야 겠네요
앱돌이 님이 쓰신 글 :
: 윽 글에 패스워드를 안달았더니 삭제가 안되내요 밑에 질문은 해결했습니다.
:
: pos = (strstr(pos, strstr(pos, "E") != NULL) ? (strstr(pos, strstr(pos, "E")+1) : NULL;
: 이부분에서 [C++ Error] test.cpp(179): E2285 Could not find a match for 'strstr(char *,bool)' 이런에러가 생깁니다.
: 무슨 에러인가요?
:
: 라스코니님 덕분에 공부 많이되었네요 정말 감사합니다.
:
: 라스코니 님이 쓰신 글 :
: : ComPort2RxChar() 가 rs232 수신단의 콜백함수라면 아래와 같이 해보세요.
: :
: : char strr[200]; // NULL '/0' 로 초기화
: :
: : ComPort2RxChar(int Count)
: : {
: : char buff[100];
: : char tmp[100];
: : char *pos = &buff[0];
: : char *result;
: : int rcvdCnt;
: :
: : memset(buff,0,sizeof(buff)); // '\0' 으로 초기화
: : memset(tmp,0,sizeof(tmp)); // '\0' 으로 초기화
: :
: : // rs232 port 로부터 Count 개수만큼 읽는다.
: : rcvdCnt = ComPort2->Read(buff,Count);
: :
: : while(pos) {
: : // 임시 tmp 저장소에 buff 데이터를 넣어준다
: : strcpy(tmp, pos);
: :
: : // buff의 'E' 다음 위치를 업데이트, 즉 'E' 가 있는지 찾는다
: : pos = (strstr(pos, strstr(pos, "E") != NULL) ? (strstr(pos, strstr(pos, "E")+1) : NULL;
: :
: : // 임시 tmp 저장소에 buff 데이터를 넣어준다
: : if(pos) { // tmp 내에 'E' 가 들어있다. 즉 다 들어온 데이터가 있다.
: : // tmp 버퍼에 있는 데이터 중 'E' 뒤를 지워준다
: : result = strstr(tmp, "E");
: : *result = '\0';
: :
: : strcat(strr, tmp); // strr에 합친다.
: : voltage = atof(strr); // 받은 문자열을 숫자로 변환한다
: : memset(strr,0,sizeof(strr)); // strr을 초기화
: : }
: : else { // tmp 내에 'E'가 없다. 따라서 더 기다려야 한다
: : strcat(strr, tmp); // strr에 합친후 다시 'E'가 들어오기를 기다린다
: : }
: : }
: : }
: :
: : 첨언하자면 질문을 하실때는 기본적인 매너는 지켜주세요. 저를 포함해서 몇분이 앱돌이님의 질문에 답변을 달아줬지만 아무런 피드백도 받지 못했습니다. 답변을 달아 주시는 분들도 귀중한 시간을 할애해서 글을 쓰는 만큼 기본적인 피드백은 남겨주시길 바라고 그리고 동일한 문제로 계속 다른 글타래를 만드는 것도 좋지 않아 보입니다. 하나의 글타래에 계속 답글을 다는것이 좋지 않을까요?
: :
: : 앱돌이 님이 쓰신 글 :
: : : 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();
: : :
: : : }
: : : }
: : :
: : :
: : :
: : :
: : :
: : : }
|