VISA 읽기 함수가 요청한 바이트만큼 데이터를 반환하지 않습니다.

업데이트 됨 May 13, 2024

해당 제품

소프트웨어

  • LabVIEW

드라이버

  • NI-VISA

문의사항

VISA를 사용하여 직렬 포트를 통해 데이터를 수신하고 싶습니다.

예를 들어, VISA Read VI 또는 viRead() 함수를 사용하고 100 바이트를 요청하는 상황이라고 가정한다면, 작성된 코드에서 첫 번째 VISA Read VI 또는 viRead() 함수를 실행하여 수신된 데이터를 보면, 처음 63 바이트만 가져올 수 있습니다. 다시 VI 또는 함수를 실행해야 나머지 37 바이트를 가져올 수 있습니다. 때로는 첫 번째 읽기에서는 54 바이트, 두 번째 읽기에서 나머지 46 바이트만 수신합니다. 왜 이런 현상이 발생합니까?

해결책

직렬 통신을 위한 VISA Read VI 혹은 viRead() 함수는 직렬 포트 버퍼에서 응용 프로그램으로 바이트 수만큼의 데이터를 반환합니다. 그러나 반환하는 데이터의 양은 설정 및 직렬 데이터에 대한 세 가지 중요한 세부 정보(종료 문자, 요청된 데이터의 크기 및 타임아웃)에 따라 다릅니다.

Serial VISA Read 동작은 다음 중 하나라도 해당되면 읽기를 중지합니다.
  1. 포트에서 읽을 수 있는 데이터 크기보다 같거나 작은 크기의 데이터들이 요청된 경우.
  2. 종료 문자가 수신된 경우.
  3. 직렬 포트에서 더 이상의 데이터를 사용할 수 없고, 그 어떤 데이터가 수신되지 않은 채 제한 시간이 초과한 경우.
  4. VISA 시리얼 포트 구성에서 입력 파라미터 중 종료 문자 활성화를 False 로 변경하십시오.

NI-VISA의 종료 문자 설정에 대한 도움말은 하기의 관련 링크를 참조하십시오.

MODBUS와 같은 표준 프로토콜을 구현하는 경우 기존 라이브러리 사용을 고려하십시오.

추가 정보

LabVIEW의 시리얼 통신 예제 (NI 예제 탐색»하드웨어 입력 및 출력»시리얼»Simple Serial.vi)를 보면 VISA 시리얼 포트 구성 함수로 시작한다는 것을 알 수 있습니다. 이 명령은 종료 문자 (기본값은 16진수로 0x0A ( "linefeed"))와 타임아웃(기본값 10 초)을 설정합니다.


설정 종료 문자와 일치하는 바이트를 읽는 경우, VISA 읽기 VI는 요청된 데이터의 끝이라고 가정하여 읽기 작업을 중지합니다. 이는 첫 번째 조건이 충족되지 않더라도, 두 번째 조건이 충족되었기 때문에 발생합니다.

기본 종료 문자를 사용하면 일반적으로 일반 텍스트 통신에 문제가 발생하지 않습니다. 그러나 이진 데이터에는 0x0A 바이트에 특별한 의미가 할당되어 있지 않습니다. 첫 번째 읽기 작업이 63 바이트 후에 중지되고 소프트웨어 버퍼의 나머지 37 바이트가 읽히기를 기다리는 이유입니다. 때문에 시리얼을 통한 데이터 전송을 수행하는 경우, VISA 시리얼 포트 설정 VI에서 종료 문자를 거의 사용하지 않는 것이 필요할 수 있습니다.