|
하신 부분이나 설명하신 부분이 잘 이해안가지만 통상적인 상황에 비추어 조언을 드립니다.
우선 KEITHLY2000 장비에서 어떤 포맷으로 데이터를 보내주는지 알아야 합니다.
rs232는 데이터를 byte 단위로 보냅니다. 그리고 전압을 위 장비에서 검출해서 보내준다고 봤을 때 1 byte 로도 올수 있고 수십 바이트로도 올수 있습니다.
밑의 ComPort2RxChar() 함수가 rs232 callback 함수라면 받은 문자 count 가 충분한 길이만큼 왔는지 확인해 봐야 합니다. 확인을 안하고 그냥 처리하면 요행을 바라고 소프트웨어를 돌리는 것과 같습니다. 충분한 길이가 안 왔다면 받은 문자를 잠시 보관해놓고 다시 문자가 들어올 때 합쳐서 처리하면 됩니다.
앱돌이 님이 쓰신 글 :
: rs232로 계측기 KEITHLY2000과 통신중입니다.
:
:
: void __fastcall TForm1::Button3Click(TObject *Sender)
: {
:
:
: AnsiString result;
: FILE *fp;
: char str1[200];
: ComPort2->Open();
: sprintf(str1,"MEAS:VOLT:DC?%c",0x0a);
: ComPort2->Write(str1,StrLen(str1));
:
:
: /////////////바로 밑에 Stringgrid로 뿌려지게 만들었습니다./////////////////
: }
: void __fastcall TForm1::ComPort2RxChar(TObject *Sender, int Count)
: {
:
: char strbuff[200];
:
: memset(strbuff,0,Count);
:
: ComPort2->Read(strbuff,Count);
: sleep(1);
:
: voltage = atof(strbuff);
:
:
:
: }
: voltage는 전역으로 int형입니다.
: 이렇게 작성하였는데요
:
: StringGrid에 0이 먼저 입력되고 그다음에 button3를 한번더 눌렀을때 측정값이 입력됩니다.
:
: 혹시나 하여 rx부분에 한줄간격으로 ShowMessage를 넣었더니2바퀴도는걸 확인했습니다
:
: void __fastcall TForm1::Button3Click(TObject *Sender)
: {
:
:
: AnsiString result;
: FILE *fp;
: char str1[200];
: ComPort2->Open();
: sprintf(str1,"MEAS:VOLT:DC?%c",0x0a);
: ComPort2->Write(str1,StrLen(str1));
: <---------------------------이곳에 ShowMessage를 넣었더니 0이 사라지고 정상적으로 입력이 되었습니다.
: 질문 1: ShowMessage를 없에고 싶은대 어떻게해야할까요?
: 질문 2: sleep(1)을 넣었더니 [C++ Warning] test.cpp(163): W8053 'sleep(unsigned int)' is obsolete 이런 경고창이뜹니다.
: 문제가 무엇인가요?
: 질문 3: sleep(1)을 빼면 다시 0이 입력됩니다. 지연시간없이 해결할 수 있는 방법은 없을가요?
: 질문 4: rx호출은 어떤식으로 이뤄지는건가요?
|