WIZnet Developer Forum

[WIZ140SR] WIZ140SR 시리얼 통신 버그 픽스 문의

버그 1)

WIZ140SR 모듈에 아래와 같이 전송하고 있습니다.

동작 모드 : TELNET
DATA PACKET CONDITION
CHARACTOR : 00 SIZE : 0 TIME : 0 INACTIVITY TIME : 2

시리얼 -> WIZ140SR
1번포트(포트번호 설정 : 5001)에 57600 BPS로 약 20바이트의 패킷을 초당 50회 입력(매번 변경된 데이터)
4번포트(포트번호 설정 : 5004)에 230400 BPS로 약 100바이트의 패킷을 초당 15회 입력(매번 변경된 데이터)

PC -> WIZ140SR
3번 포트(포트번호 설정 : 5003)에 230400 BPS로 아래의 문자열을 전송하였습니다.(고정된 데이터)
"01234556789"
사용 텔넷 프로그램은 “J1C” 입니다

WIZ140SR 3번 포트로 출력되는 데이터를 읽어보니 “0123456789” 외에 추가로 랜덤하게 임의의 1바이트가 추가 됩니다
예 : "01234567892"
랜덤하게 임의 바이트가 추가가 되고나서 약 30회정도를 넘어가면 추가로 붙는 1바이트의 값이 변동하지 않고 고정됩니다

사용 펌웨어 버젼은 1.6.5 이며,
위 증상은 1.6.4 버젼에서는 나타나지 않습니다

버그 2)

아래의 증상은 펌웨어 1.6.5나 1.6.4 동일하게 나타나는 증상입니다

임의의 포트에 대해서 아래의 조건으로 테스트 진행합니다.

동작모드 : TELNET
CHARACTOR : 00 SIZE : 0 TIME : 0 INACTIVITY TIME : 2

PC -> WIZ140SR 로 100바이트를 초당 15회 전송(매번 변경된 데이터)
WIZ104SR -> PC로 50바이트를 초당 15회 전송(매번 변경된 데이터)

데이터의 일부분이 소실되는 문제가 발생하며,
그 위치는 패킷의 앞부분부터 발생합니다

오류 예시

전송데이터
0x02 0x02 0x02 0x30 0x30 0x30

수신데이터(1차 손실)
0x02 0x02 0x30 0x30 0x30

수신데이터(2차 손실)
0x02 0x30 0x30 0x30

시간이 지날수록 패킷의 앞부분에서 데이터 소실이 진행됩니다
데이터 소실되는 시점은 랜덤하며, 바이트 소실은 시간이 지속될수록 증가합니다.
1시간 동안 문제 없을때도 있고, 1분이내에 소실되는 경우도 발생합니다

PC쪽 프로그램은 그대로 놔두고 WIZ140SR을 재부팅하면 정상동작하다가 다시 문제가 발생합니다

추가로
WIZ140SR 1.6.5 펌웨어 다운로드 가능한가요?

텔넷이 아닌 일반 TCP/IP Client-Server로 테스트해도 동일한 증상이 발생하시나요?

수신 쪽에서 패킷이 손실된다는 말씀이신가요?
애초에 전송 중에 데이터 손실이 발생하는지, WIZ140SR 혹은 PC에 수신된 후 패킷 손실이 발생하는지 확인이 필요합니다.

추가로,
정확히 어떠한 테스트 흐름을 가지고 진행하셨고,
실제 테스트 결과 로그를 첨부해주시면 답변에 도움이 될 것 같습니다.

조건을 달리해서 추가로 테스트를 진행해 보았습니다

-> WIZ140SR 설정
펌웨어 버젼 : 1.6.5
모드 : TELNET
IP주소 : 192.168.0.150
포트번호 : 5001, 5002, 5003, 5004
BAUD RATE : 230400
DATA BIT : 8
PARITY : NONE
STOP BIT : 1
FLOW CONTROL : NONE
CHARACTER : 00
SIZE : 0
TIME : 0
INACTIVITY TIME : 2

-> 조건 1
PC에서 TCT ECO SERVER 프로그램 실행(접속 주소 : 컴퓨터 아이피 192.168.0.XXX)
PC에서 TCP CLIENT 테스트 프로그램 제작하여 테스트 진행
목적 : PC에서 보내는 데이터가 정상적으로 송/수신되는지 검증용
결과 : 30만번이상의 데이터 송/수신에도 오류 없음

-> 조건 2
WIZ140SR-EVB 보드 : 시리얼 출력단자 TX-RX 쇼트
PC에서 TCP CLIENT 테스트 프로그램 제작하여 테스트 진행

-> TCP CLIENT 프로그램에서 체크하는 항목
데이터 리턴해 오는 시간 측정
송 / 수신 데이터 길이 비교
송 / 수신 데이터 같은지 비교
오류 발생시 수신된 데이터 내용 표시

-> 조건 2 결과
오류가 발생하는 시점이 특정지을수 없음
사용하는 포트를 늘릴수록 오류 발생 확률도 늘어남

4개 동시(위) 및 1개만(아래) 테스트 진행 결과 입니다

-> 오류창 설명
ㅇ Time over : 시간 초과 설정값 표시
ㅇ -> 송신 바이트수, 송신 데이터
ㅇ <- 수신 바이트수, 수신 데이터

ㅇ Data err
ㅇ -> 송신 데이터
ㅇ <- 수신 데이터

-> 주된 오류 내용

  1. 시간내에 데이터가 전부 오지 않는 경우가 발생
  2. 데이터가 밀리는 현상이 발생
  3. 오류가 최초로 발생하는 시점은 수초 이내에서 수십분 이내로 다양하여 특정할 수 없음

이후 테스트 결과를 장문으로 작성했는데 스팸 필터에 걸려서 숨김처리됐습니다

관리자께서 확인해주세요

1 Like

제가 올린 위 댓글에서

화면 캡쳐부분 좌측 상단을 보게되면

이런식으로 해석이 가능하겠습니다

Time over : 20 (20ms 동안 수신 데이터가 적게 옴)
->100 ABCD… 890 (100바이트 보냄)
<- 099 ABCD…89 (99바이트 옴, 제일 뒤의 '0’값이 오지 않음

Data err
-> ABCD…890 (100바이트 보냄)
<- 0ABC…789 (최근 수신된 100바이트를 확인하니 보낸데이터와 틀림)

정리하자면 PC측에서 데이터를 모두 보냈으나 WIZ140SR쪽에서 20ms가 지나도록 1바이트를 안보내는 것이라고 보여집니다

다음번째 PC에서 데이터를 보낼때 WIZ140SR의 버퍼에 있는 '0’값이 새로운 값에 추가되어 같이 전송됨

PC측에서 WIZ140SR로 데이터를 전송할때 1바이트씩 따로 보내지 않고 한번에 묶어서 전송하며, PC측에서 데이터를 송신후 수신버퍼를 초기화하기에 이전 데이터가 남아있지 않습니다

상용 Telnet Client 프로그램을 사용하여 데이터 전송 테스트 결과 별다른 문제는 없었습니다.

혹시 만드신 프로그램을 받아서 사용해볼 수 있을까요?
그리고, 프로그램의 동작 플로우를 알려주시면 도움이 될 것 같습니다.

현재 타임오버로 20ms를 설정하셨는데,
반대로, WIZ140SR의 DataPacking Time을 5ms로 지정하고 사용해보시길 바랍니다.

그렇게 되면, PC에서 보낸 데이터가 5ms동안 없으면 그동안 받았던 데이터를 한번에 PC로 전송할 것입니다.

TESTER.zip (37.1 KB)

테스트에 사용한 프로그램을 업로드 하였습니다

아래는 동작 플로우입니다

  1. Thread.Sleep(1);
  2. 전송할 데이터 정리
  3. TCP 송신 (예: 100바이트)
  4. TCP 수신 버퍼 비우기
  5. 스톱와치 초기화 및 시작
  6. while(스톱와치 <= 제한시간) (예:20ms)
    6-1. TCP 수신데이터를 버퍼에 저장
    6-2. 수신데이터 길이가 송신데이터길이와 같으면 break;
  7. if(스톱와치 >= 제한시간)
    7-true. 시간초과 및 송/수신 데이터를 표시
    7-false. 송/수신 데이터 비교후 틀릴경우 해당 데이터 표시
  8. 남은 시간동안 기다리기
  9. 스톱와치 정지
  10. 1번으로 이동

주신 프로그램으로 아래와 같은 조건으로 테스트 결과, 타임아웃이나 데이터 에러가 발생하지 않았습니다.

제가 이해한대로라면, 해당 프로그램은 오류가 발생하지 않으면 디버그 메시지를 출력하지 않습니다. 맞나요?
의도적으로 타임아웃 발생시킬때만 디버그 메시지가 출력되더군요.

카테고리를 한국어 포럼으로 이동하고, 게시물 제목에 [WIZ140SR]을 추가하였습니다.

네, 타임아웃 또는 데이터 비교오류 발생시에만 메세지가 출력됩니다

제가 올린 테스트 프로그램을 4개 동시에 띄우고 테스트 해보셨으면 합니다

오류 발생하는 시간이 랜덤인지라, 여러개를 실행시키면 오류 발생시간이 짧아졌었습니다.

4개면 대략 5분이내에 오류가 발생할 것입니다만,

만약, 오류가 안난다면 제쪽에서는 해결책을 찾을 방법이 없을듯 하여 난감하겠네요…

추가) 펌웨어 1.6.5 버젼을 구할수 있을까요?

4개 구입해서 테스트중에 2개를 1.6.4 버젼으로 다운그레이드 했었습니다

다시 1.6.5버젼으로 업해서 쓰고자 합니다

말씀하신 증상을 확인했습니다만,

주신 프로그램의 특성에 의한 것은 아닌지 생각됩니다.
100byte를 전송하는 것으로 하고, data packing을 100byte로 지정하여 사용한 결과,
간헐적으로 타임아웃이 발생하는 것을 제외하고는 (100바이트 모두 전송 안됨) 4개 모두 데이터 에러가 발생하지 않고 있습니다.

예를 들어, 작성하신 프로그램 플로우에 의해서 타임아웃 동안 데이터를 99바이트 읽어서 처리했다면, 아직 들어오지 않은 1바이트가 이후부터 계속 미뤄지게 됩니다.

이에 대한 예외처리를 하셨다면 상관없겠지만,
제가 테스트해본 결과, 한번 밀린(타임 아웃으로 인한 입력 데이터 크기 에러) 포트에서만 해당 증상이 나타나고 있으며, 정확히 특정 문자만이 추가되거나 생략되어 전송이 되고 있는 것을 보았을 때, 프로그램 처리 오동작으로 인한 현상으로 판단됩니다.

이러한 이유라면, 말씀하신대로 랜덤한 시간에 현상이 발생할 수 있으며,
4개 모두 동작시켰을 때 발생할 확률이 높습니다.(펌웨어에서는 이 동작을 폴링방식으로 수행하기 때문에 시간 지연이 일어납니다)

1.6.5는 현재 버그가 발견되어 담당자가 처리 중에 있다고 합니다.
따라서 1.6.4로 다운그레이드 하여 사용하실 것을 권장드립니다.

USR-TCP-Test라는 상용 툴이 있습니다.
송신 데이터와 수신 데이터의 사이즈를 확인할 수 있고, 체크섬 기능도 있습니다.

해당 프로그램으로 테스트를 해보시는게 좋을 것 같습니다.
이 프로그램으로 4포트 동시에 테스트 해보니 데이터 Packing 기능을 사용하지 않아도 문제 없었습니다.

제가 사용하는 환경에서는
0x02 + 데이터 + 0x0D 라는 시작코드와 종료코드를 넣어서 패킷을 만들어서 보냅니다
데이터가 밀려서
0x0D + 0x02 + 데이터 + 0x0D 가 들어오더라도 이전데이터는 폐기하고 새로운 데이터를 처리합니다
수신을 시작할때 0x02 가 들어온것을 확인하고 처리하기에 0x0D 또는 다른 데이터가 먼저 들어오더라도 수신이 정상적으로 처리됩니다

데이터가 밀리기만 하는것이라면 어떻게든 사용할수 있지만,
데이터가 지속적으로 생략되는 현상이 랜덤하게 발생하였었기에
그럴때마다 장비를 껐다 켜기를 반복해서 사용했습니다

다행히도 문제점이 확인되셨다고하니 펌웨어 업뎃이 될때까지 기달려야 겠네요^^

위 현상은 처음에 말씀하셨던 버그2에 대한 것인가요?
그렇다면 버그 1은 소프트웨어 변경으로 해결 하신건가요?

발견된 버그는 문의 주신 버그1과 버그2와는 관계 없는 내용이라고 합니다…
저희쪽에서 계속 확인은 해보겠지만, 문의 주신 분 쪽에서도 지속적인 디버깅이 필요한 상황이라고 판단됩니다.

랜덤관련은 버그 2에 대한 것입니다.

버그 1의 경우,
시작값(0x02)와 종료코드(0x0d)값이 있기에 사용시 그다지 문제가 되지 않습니다
버그1은 버그2를 확인하기위해 수신패킷을 확인하다 발견하게 된 것입니다.

버그2의 경우,
시작값(0x02)가 생략되버리면 데이터 시작부분을 알수 없기때문에 데이터를 주고 받는것이 매우 어렵습니다
시작값(0x02)를 여러개(5개 정도)넣고 테스트를 해보았지만 시간이 지날때마다 시작값이 1바이트씩 줄어들어서, 시작값
전체가 소멸되어 결국에는 통신에 문제가 발생하는 현상이 생깁니다

제쪽에서 버그2를 완벽하게 해결할 방법이 없습니다.

기존에는 2개의 포트를 사용하였는데 포트 1개로 줄이면 그나마 문제발생이 드물게 발생하기에 PCB와 프로그램을 수정해서 임시로 쓰는수 밖에 없다고 보고 있습니다.

Copyright © 2017 WIZnet Co., Ltd. All Rights Reserved.