WIZ550io 문의 드립니다

안녕하세요.

Renesas mcu와 wiz550io를 연결하여 테스트하고 있습니다.
하드웨어는 인터럽트 핀을 사용 가능하도록 구성했습니다.

다음과 같은 문의 사항이 있습니다.

  1. 다음 코드의 문제점 확인 부탁드립니다.
    int32_t recv(uint8_t sn, uint8_t * buf, uint16_t len)
    {
    uint8_t tmp = 0;
    uint16_t recvsize = 0;
    CHECK_SOCKNUM();
    CHECK_SOCKMODE(Sn_MR_TCP);
    CHECK_SOCKDATA();

    recvsize = getSn_RxMAX(sn); //recvsize가 항상 0으로 읽혀지는데 왜 그러는지요?
    if(recvsize < len) len = recvsize;

  2. 처음 mcu를 부팅하고 client 소켓을 open 했습니다. 그리고 처음 1개의 문자열"mthis is nanokem.+++"을 전송하면 다음과 같은 이상한 문자가 서버에 수신됩니다. 어떤 원인으로 발생하는 현상인가요?
    정상적으로 수신이 완료된 이후에 다시 문자열을 보내면 server는 정상적으로 잘 수신됩니다.

처음 1개의 문자열을 보낸 경우 :
The oldest data was removed. Continue…
q?{FF}?2?%篩?Gr쬨nh룬?r璽뇇죊?_O잎컔瑾?짜쿥~喧@?尻[?2S7??`??>9닧?|6/띘60V퐲맯3X4쁛?z??앃?S!0l]?tm?"?<柯N뚵볞<-??j셛e첒??B퍯쩿/Aモ?쐥n?
[웁뛺?뚧MO僻欒€?.띆MaD쓬€n?3Y?a???緯롻蘭?Oym??I_뷛m샟l!s떈??G`??_퍉?只4?濂???삓(쬽렢Hw餓b?V땥d먋꿺뾟?N$€`
… 중간 생략 …
mthis is nanokem.+++ ==> 마지막에 정사적으로 수신된 메시지.

  1. 여러개의 소켓을 사용할 경우 소켓의 폴링은 어떻게 해야 하나요?

확인하시고 회신 부탁드립니다.
감사합니다.

안녕하세요.

WIZ550io의 경우는 기본 라이브러리만 제공이되고 있습니다.
따라서 질문하신 2번 3번에 대해서는 직접 구현을 하셔야하며, MCU에 종속적이기때문에 동일한 보드와 소스가 있지 않다면 디버깅이 불가합니다.

각 질문 항목에 대하여 최대한 답변을 드려보겠습니다.

  1. recvsize = getSn_RxMAX(sn); 에서 getSn_RxMAX는 Sn_RXBUF_SIZE 레지스터 값을 가져와 해당 소켓에 할당된 RX버퍼 사이즈를 확인합니다.
    [url]http://wizwiki.net/wiki/lib/exe/fetch.php?media=products:w5500:w5500_ds_v107e_160224.pdf[/url]
    자세한 내용은 위 링크의 데이터시트에서 Sn_RXBUF_SIZE 레지스터를 찾아보시면 됩니다.
    예를 들어 1번 소켓에 2kb를 할당한 상태라면 레지스터값은 0x02로 설정이 되어 있습니다.
    하지만 이 상태로는 실제 2kb를 표현할 수 없으므로 getSn_RxMAX 매크로로 쉬프트 연산하여 실제 사이즈인 2048이라는 값이 저장되게 됩니다.
    즉, 질문자님처럼 0으로 읽히는 경우에는 해당 소켓의 RX버퍼 사이즈가 할당이 되어 있지 않았기 때문입니다.
    따라서, 할당을 해주셔야합니다.

  2. 처음에만 쓰레기값이 들어온다면, 초기화 과정에서 TX/RX버퍼를 다 flush하고 진행해 보시면 되겠습니다.
    실제 소스가 어떤식으로 구성되어 있는지 알 수 없는 상황에서는 이정도의 초기화 가이드만 드릴 수 있겠습니다.

  3. 소켓의 폴링이라는게 0~3번의 소켓이 있다면 일반 polling방식처럼 순차적으로 각각 사용하길 원하시는건가요?
    만약 맞다면, 이부분은 socket 하나에 대한 function을 구현했던 방식처럼 S/W로 추가 구현을 해주셔야 합니다. H/W에서는 지원하지 않습니다.
    원하시는대로 각 socket에 대한 function을 나열하시면 되겠습니다.

답변이 되셨길 바랍니다.

감사합니다.