|
앱돌이 님이 쓰신 글 :
: 초보 질문좀 받아주세요
:
: rs232로 계측기와 연결하여 버튼을 눌렀을시 전압을 StringGrid에 뿌려주려주는 소스입니다.
:
: char strr[200];
: char DMMRecData[200]; //변수는 전역으로 잡았습니다.
:
: void __fastcall TForm1::Button3Click(TObject *Sender)
: {
:
: AnsiString result;
: FILE *fp;
: ComPort2->Open();
: sprintf(strr,"MEAS:VOLT:DC?%c",0x0a);
: ComPort2->Write(strr,StrLen(strr));
: }
:
:
:
:
: void __fastcall TForm1::ComPort2RxChar(TObject *Sender, int Count)
: {
:
: ComPort2->Read(strr,Count);
: memcpy(DMMRecData,strr,Count);
: StringGrid1->Cells[3][1] = DMMRecData;
:
:
: }
:
: 11v인가한 결과입니다.
: 메모로 확인해보니
: Memo2
: +
: 1
: .
: 0
: 9
: 9
: 0
: 1
: 4
: 5
: 4
: E
: +
: 0
: 1
:
:
: 이런식으로 작성되었습니다.
:
: /////////////////////////////MEMO소스///////////////////////////////
:
: void __fastcall TForm1::ComPort2RxChar(TObject *Sender, int Count)
: {
:
: ComPort2->Read(strr,Count);
: memcpy(DMMRecData,strr,Count);
: Memo2->Lines->Add(DMMRecData);
:
:
: }
:
:
:
: 1. 질문 : 메모로 출력되는것을 한줄로 바꿀수 있는 방법이있나요?
=> ComPort2RxChar() 콜백 함수는 데이터가 수신될 때 마다 호출 되는것인데요.
아마도 통신 속도를 매우 느리게 설정한것 같습니다.
데이터를 수신할 때마다 출력해서 그런 결과가 나온것이구요.
데터를 모두 수신하기 전에는 출력하지 말아야 정상적으로 한줄로 나옵니다.
데이터를 모두 수신하였는지 확인하는 방법은 타겟 장비로부터 보내주는 데이터 포멧을 알아야합니다.
STX, ETX를 사용한다든지.. 그래서 ETX가 들어올 때 가지 데이터를 죽 받아서 저장해 두었다가
하나의 문장으로 완성해서 데이터를 처리해야합니다.
시리얼 통신에서는 항상 데이터가 한꺼번에 들어온다고 생각하면 절대 안됩니다.
중간에 몇번씩은 잘려서 들어온다고 생각하세요. 특히 통신 속도를 느리게 하면 더 그렇습니다.
: 2. 질문 : 11v인가하였는데 +1.0이런식으로 나왔는데 어떻게 수정해야할까요?
=> 타겟 장비로 부터 보내는 데이터 형식을 바꿔달라고 해야합니다.
아니면 데이터 요청을 보낼때 어떤 형식이 있어서 리턴 받는 값의 형식을 지정해서 보낼 수 도 있구요.
이건 앞에 1번에서 말씀드린것 같이 해당 타겟 장비의 통신 메뉴얼을 참고하셔야합니다.
: 3. stringgrid로 옮기기위해서는 어떻게 해야할까요?
=> 작성하신 코드처럼 하시면 될것 같은데요.
완성된 문장을 만드는게 중요하고, 완성된 문장이 만들어지면 어디에 출력하는 가는 쉬운 문제니....
:
: 공부중에 너무 속상하내요 안되니...
:
: 답변부탁드립니다.
:
:
:
|