본 자료는
1. Buffer Overrun Error란?
2. Buffer Overrun Error 발생 시 증상
3. Buffer Overrun Error 주요 원인
4. Buffer Overrun Error 저감 방법
5. Buffer Overrun Error 발생 여부 확인 방법
6. 드라이버 우선 순위 조정 프로그램 사용 방법
7. Buffer Overrun Error 테스트 프로그램 사용 방법
8. 테스트 결과
순서로 진행합니다.
IEC-Series CPU 내부에 UART(시리얼디바이스) 기능이 포함되어 있으며 3~4Ch을 가지고 있습니다. 각각의 COM Port마다 수신 버퍼 레지스터를 가지고 있으며 아래의 표는 각각의 제품별 각 포트 별 수신 버퍼 레지스터의 크기를 나타낸 표입니다.
[표] IEC-Series 및 COM Port 별 수신 버퍼 레지스터 크기Model | COM1 & COM 1_1 |
COM2 | COM3 | COM4 |
---|---|---|---|---|
IEC667-Series | 64Byte | 64Byte | 64Byte | 64Byte |
IEC1000-Series | 256Byte | 64Byte | 16Byte | 16Byte |
Model | COM1 & COM 1_1 |
COM2 | COM3 | COM4 |
---|---|---|---|---|
IEC667-Series | 64Byte | 64Byte | 64Byte | 64Byte |
IEC1000-Series | 256Byte | 64Byte | 16Byte | 16Byte |
가용 CPU Resource가 부족한 경우 통신 Baudrate가 높거나 데이터가 많을 경우 수신 버퍼 레지스터의 수신 데이터를 수신 버퍼 메모리에 복사하는 작업이 원활하지 못하여 Buffer Overrun Error가 발생합니다.
수신 버퍼 레지스터는 UART 내부에 포함된 버퍼이며 이 버퍼는 시리얼로 수신되는 데이터가 하드웨어적인 방식으로 수신 버퍼 레지스터에 순차적으로 임시 저장합니다.
따라서 임시 저장된 수신 데이터를 읽어서 응용 프로그램이 접근할 수 있는 수신 버퍼로 데이터를 읽어와야 합니다. 그렇지만 여러 가지 이유로 제때 읽어오지 못하는 상황이 발생되며 이러한 경우 Buffer Overrun Error가 발생하게 됩니다.
2. Buffer Overrun Error 발생 시 증상
- Buffer Overrun Error 예외가 발생
- 수신 데이터의 유실 및 데이터 깨지는 현상이 발생
3. Buffer Overrun Error 주요 원인
- 통신 속도가 빠르면서 대량의 연속적인 수신 데이터
- 대량의 수신 데이터가 발생하면서 CPU의 가용 상태가 낮아지는 경우
- 대량의 수신 데이터가 발생하면서 외부 인터럽트 처리가 많아지는 경우
Ex) 터치 입력이나 다른 작업으로 CPU의 사용량이 증가할 경우 시리얼 디바이스 드라이버에서 수신 버퍼 레지스터의 데이터를 가져오는 시간이 길어져 발생합니다.
4. Buffer Overrun Error 저감 방법
- 제품별 포트 별 수신 레지스터의 크기가 다르므로 수신 데이터가 많은 경우 수신 레지스터의 크기가 큰 포트를 사용할 것을 권장합니다.
- 통신 속도 하향 조절 권장
- 드라이버 우선 순위 변경
5. Buffer Overrun Error 발생 여부 확인 방법
Buffer Overrun이 발생하는 여부를 가장 간단하게 알 수 있는 방법은 smartSerialPort의 OnPortError 이벤트입니다. OnPortError 이벤트는 수신측 Port에서 발생하는 에러를 캐치합니다.
본 문서는 해당 이벤트로 각종 환경(통신 속도, 데이터 크기, Port 번호, 통신 우선 순위)에 따른 Buffer Overrun의 발생 여부를 파악하여 그 결과를 보여줍니다.
코드 | 실행 결과 |
---|---|
private void smartSerialPort1_OnPortError(System.IO.Ports.SerialError eErrorState) { smartListBox2.AddItem(eErrorState.ToString());
}
|
|
6. 드라이버 우선 순위 조정 프로그램 사용 방법
- [STEP-1] 본 문서의 첨부 파일을 다운로드하여 SerialPort_Priority 응용 프로그램을 IEC-Series의 Flash Disk에 넣은 후 실행
- [STEP-2] 통신 우선 순위 레벨을 설정 후 [Apply] 버튼을 누릅니다.
-
High : 높게 설정합니다.
-
Mid : 중간 설정합니다.
-
Low : 낮게 설정합니다.
- [STEP-3] Reboot 메시지가 나오면 [OK] 버튼을 누른 후 IEC-Series의 전원을 끄고 재시작합니다.
7. Buffer Overrun Error 테스트 프로그램 사용 방법
본 테스트 프로그램은 SmartSerialPort로 통신을 하는 경우 데이터 크기, Port 번호에 따른 Buffer Overrun Error 발생 여부를 확인합니다. 반드시 런타임 모드로 테스트하시길 바랍니다.
Server 프로그램 실행 방법- [STEP-1] IEC-Series에서 Server 프로그램을 실행합니다.
- [STEP-2] Port No, BaudRate를 선택하여 테스트할 Port와 통신 속도를 지정합니다.
- [STEP-3] [START] 버튼을 눌러 수신 대기 상태를 유지합니다.
Client 프로그램 실행 방법
- [STEP-1] IEC-Series에서 Client 프로그램을 실행합니다.
- [STEP-2] Port No, BaudRate를 선택하여 테스트할 Port와 통신 속도를 지정하고 [START] 버튼을 눌러 데이터 전송을 시작합니다.
- [STEP-3] 데이터 송/수신 도중 [Touch] 버튼을 눌러 터치 간섭 시 Buffer Overrun의 발생 여부를 확인합니다.
▪ TOTAL CNT : 모든 데이터 송/수신 개수
▪ FAIL CNT : Buffer Overrun Error 발생 개수
▪ SUCCESS CNT : 정상 데이터 송/수신 개수
8. 테스트 결과
해당 테스트는 Server를 IEC667-Series로 고정하여 Server, Client 모두 런타임 모드로 진행했습니다.
- 공통
- 터치 입력 인터벌은 무작위로 하여 입력한다.
- IEC667-Series
- 대량의 데이터를 수신할 때 모든 포트에서 BaudRate가 최대 속도(115200Bps)인 경우에만 Overrun이 발생한다.
- 통신 우선 순위를 변경 시 Overrun이 발생하지 않는다.
- 소량의 데이터를 수신할 때 Overrun이 발생하지 않는다. - IEC1000-Series
- COM1으로 수신 시 Overrun이 발생하지 않는다.
- COM2로 통신 시 BaudRate를 38400Bps 이하로 설정했을 경우 Overrun이 발생하지 않는다.
- COM3, COM4로 데이터를 수신 시 우선 순위를 변경하지 않았을 경우 Overrun이 발생한다.
- COM3, COM4를 통해 데이터를 수신 시 우선 순위를 변경하더라도 BaudRate가 최대 속도(115200Bps)일 경우 Overrun이 발생한다.
Comport | 통신 우선 순위 조정 (H : High / L : Low) |
Buffer Overrun 발생 여부 | |||
---|---|---|---|---|---|
115200 | 57600 | 38400 | 19200 | ||
COM1 ←→ COM1 | - | X | X | X | X |
H | X | X | X | X | |
L | X | X | X | X | |
COM2 ←→ COM2 | - | O | O | X | X |
H | X | X | X | X | |
L | X | X | X | X | |
COM3 ←→ COM3 | - | O | O | O | O |
H | O | X | X | X | |
L | O | X | X | X | |
COM4 ←→ COM4 | - | O | O | O | O |
H | O | X | X | X | |
L | O | X | X | X |
Com port |
통신 우선 순위 조정 (H : High / L : Low) |
Buffer Overrun 발생 여부 | |||
---|---|---|---|---|---|
115200 | 57600 | 38400 | 19200 | ||
COM1 ↕ COM1 |
- | X | X | X | X |
H | X | X | X | X | |
L | X | X | X | X | |
COM2 ↕ COM2 |
- | O | O | X | X |
H | X | X | X | X | |
L | X | X | X | X | |
COM3 ↕ COM3 |
- | O | O | O | O |
H | O | X | X | X | |
L | O | X | X | X | |
COM4 ↕ COM4 |
- | O | O | O | O |
H | O | X | X | X | |
L | O | X | X | X |
IEC1000. 30bytes 왕복 송/수신
Comport | 통신 우선 순위 조정 (H : High / L : Low) |
Buffer Overrun 발생 여부 | |||
---|---|---|---|---|---|
115200 | 57600 | 38400 | 19200 | ||
COM1 ←→ COM1 | - | X | X | X | X |
H | X | X | X | X | |
L | X | X | X | X | |
COM2 ←→ COM2 | - | X | X | X | X |
H | X | X | X | X | |
L | X | X | X | X | |
COM3 ←→ COM3 | - | O | O | O | O |
H | O | X | X | X | |
L | O | X | X | X | |
COM4 ←→ COM4 | - | O | O | O | O |
H | O | X | X | X | |
L | O | X | X | X |
Com port |
통신 우선 순위 조정 (H : High / L : Low) |
Buffer Overrun 발생 여부 | |||
---|---|---|---|---|---|
115200 | 57600 | 38400 | 19200 | ||
COM1 ↕ COM1 |
- | X | X | X | X |
H | X | X | X | X | |
L | X | X | X | X | |
COM2 ↕ COM2 |
- | X | X | X | X |
H | X | X | X | X | |
L | X | X | X | X | |
COM3 ↕ COM3 |
- | O | O | O | O |
H | O | X | X | X | |
L | O | X | X | X | |
COM4 ↕ COM4 |
- | O | O | O | O |
H | O | X | X | X | |
L | O | X | X | X |
IEC667. 300bytes 왕복 송/수신
Comport | 통신 우선 순위 조정 (H : High / L : Low) |
Buffer Overrun 발생 여부 | |||
---|---|---|---|---|---|
115200 | 57600 | 38400 | 19200 | ||
COM1 ←→ COM1 | - | O | X | X | X |
H | X | X | X | X | |
L | X | X | X | X | |
COM2 ←→ COM2 | - | O | X | X | X |
H | X | X | X | X | |
L | X | X | X | X | |
COM3 ←→ COM3 | - | O | X | X | X |
H | X | X | X | X | |
L | X | X | X | X | |
COM4 ←→ COM4 | - | O | X | X | X |
H | X | X | X | X | |
L | X | X | X | X |
Com port |
통신 우선 순위 조정 (H : High / L : Low) |
Buffer Overrun 발생 여부 | |||
---|---|---|---|---|---|
115200 | 57600 | 38400 | 19200 | ||
COM1 ↕ COM1 |
- | O | X | X | X |
H | X | X | X | X | |
L | X | X | X | X | |
COM2 ↕ COM2 |
- | O | X | X | X |
H | X | X | X | X | |
L | X | X | X | X | |
COM3 ↕ COM3 |
- | O | X | X | X |
H | X | X | X | X | |
L | X | X | X | X | |
COM4 ↕ COM4 |
- | O | X | X | X |
H | X | X | X | X | |
L | X | X | X | X |
IEC667. 30bytes 왕복 송/수신
Comport | 통신 우선 순위 조정 (H : High / L : Low) |
Buffer Overrun 발생 여부 | |||
---|---|---|---|---|---|
115200 | 57600 | 38400 | 19200 | ||
COM1 ←→ COM1 | - | X | X | X | X |
H | X | X | X | X | |
L | X | X | X | X | |
COM2 ←→ COM2 | - | X | X | X | X |
H | X | X | X | X | |
L | X | X | X | X | |
COM3 ←→ COM3 | - | X | X | X | X |
H | X | X | X | X | |
L | X | X | X | X | |
COM4 ←→ COM4 | - | X | X | X | X |
H | X | X | X | X | |
L | X | X | X | X |
Com port |
통신 우선 순위 조정 (H : High / L : Low) |
Buffer Overrun 발생 여부 | |||
---|---|---|---|---|---|
115200 | 57600 | 38400 | 19200 | ||
COM1 ↕ COM1 |
- | X | X | X | X |
H | X | X | X | X | |
L | X | X | X | X | |
COM2 ↕ COM2 |
- | X | X | X | X |
H | X | X | X | X | |
L | X | X | X | X | |
COM3 ↕ COM3 |
- | X | X | X | X |
H | X | X | X | X | |
L | X | X | X | X | |
COM4 ↕ COM4 |
- | X | X | X | X |
H | X | X | X | X | |
L | X | X | X | X |