Wizfi210 AP 모드 문의

wizfi210에 커맨드로 AP모드작업을 하는데
AT+WA 명령어에서
리스폰만되고 [OK]가 뜬후 다음 명령어로 못넘어가고 계속 무한루프에 빠집니다…

안녕하세요

전체적인 커맨드를 알려주셔야 문제 해결에 도움을 드릴 수 있을 것 같습니다…

AT+WD

[OK]

AT+WM=2

[OK]

AT+WAUTH=0

[OK]

AT+NDHCP=0

[OK]

AT+NSET=192.168.55.1,255.255.255.0,192.168.55.1

[OK]

AT+WA=kuckhwan
IP SubNet Gateway
192.168.55.1: 255A

AT+WA 명령어 부분에서 무한루프에 빠져서 다음명령어로 못넘어갑니다 소스는

switch(flag) {
case 0:
Serial1.print(“+++”); // exit datamode
flag++;
break;
case 1:
flag++;
break;
case 2:
Serial1.print(“+++”);
flag = 10;
break;
case 10:
Serial1.print(“AT+WD\r\n”); // clear current connection & setting
break;
case 11:
Serial1.print(“AT+WM=2\r\n”);
break;
case 12:
Serial1.print(“AT+WAUTH=0\r\n”);
break;
case 13:
Serial1.print(“AT+NDHCP=0\r\n”);
break;
case 14:
Serial1.print(“AT+NSET=192.168.55.1,255.255.255.0,192.168.55.1\r\n”);
break;
case 15:
Serial1.print(“AT+WA=kuckhwan\r\n”);
break;
case 16:
Serial1.print(“AT+NAUTO=1,1,8080\r\n”);
break;
case 17:
Serial1.print(“ATA2\r\n”);

소스 중 일부분입니다. 스위치문을 이용해서 하는건데 AT+WA에서 다음 케이스문으로 못넘어갑니다. 어떤 문제가 있는건지 문의 드립니다…

안녕하세요.

AT command 상에서 문제가 없기 때문에 문의 주신 내용으로는 원인을 찾기 힘들어보입니다…

  1. at+wa 명령을 사용하면 응답 이벤트로 ip, sn, gw 정보가 뜨게 되는데, 파싱하실때 이점을 고려하셨나요?
  2. WizFi210에 직접 serial 연결해서 at command로 입력하면 정상 동작하나요?

아니면, 기본적인 내용을 저장(at&w0, at&y0, atc1)해서 auto connection으로 사용하는 방법은 어떠신가요?

추가로,

switch 문 위에 올려주신게 결과창 복사하신거같은데요… overflow나 파싱에서 character를 놓치셨을수도 있구요…

at+wa명령어가 입력 됬을 때 응답이벤트에서 ip 주소만 제대로 나오고 sn, gw 정보는 제대로 시리얼에 출력 되지가 않습니다.

#include <TimerOne.h>
#include <Wire.h>

char databuff[512] = {0};

#define CMD_RES 0x90
#define CMD_REQ 0x10

int flag;
int dataModeFlag = 0;
int waitATAOk = 0;
int waitATACounter = 0;
int counter = 0;
char value = 0;

void Callback() {
counter++;;
switch(flag) {
case 0:
Serial1.print(“+++”); // exit datamode
flag++;
break;
case 1:
flag++;
break;
case 2:
Serial1.print(“+++”);
flag = 10;
break;
case 10:
Serial1.print(“AT+WD\r\n”); // clear current connection & setting
break;
case 11:
Serial1.print(“AT+WM=2\r\n”);
break;
case 12:
Serial1.print(“AT+WAUTH=0\r\n”);
break;
// case 13:
// Serial1.print(“AT+WWEP1=1234567890\r\n”);
// break;
case 13:
Serial1.print(“AT+NDHCP=0\r\n”);
break;
case 14:
Serial1.print(“AT+NSET=192.168.55.1,255.255.255.0,192.168.55.1\r\n”);
break;
case 15:
Serial1.print(“AT+WA=kuckhwan\r\n”);
break;
// case 17:
// Serial1.print(“AT+DHCPSRVR=1\r\n”);
// break;
case 16:
Serial1.print(“AT+NAUTO=1,1,8080\r\n”);
break;
case 17:
Serial1.print(“ATA2\r\n”); // Start Auto Connect, including association.
flag++;
waitATAOk = 1;
waitATACounter = 0;
break;
default: break;
}
if ( waitATAOk ) {
waitATACounter++;
if ( waitATACounter > 20 ) {
waitATACounter = 0;
dataModeFlag = 1;
waitATAOk = 0;
Serial.println(“Enter Data Mode”);
}
}
}

void setup() {
// put your setup code here, to run once:
flag = 0;
Serial1.begin(115200);
Serial.begin(115200);
Serial.print(“Sensing server”);
//Wire.begin();

#ifndef DEBUG_MODE
Timer1.initialize(1000000);
Timer1.attachInterrupt(Callback);
#endif
}

void loop() {
// put your main code here, to run repeatedly:
int i = 0;
char someChar[512] = {0};

#ifdef DEBUG_MODE
if(Serial.available()) {
do {
someChar[0] = Serial.read();
Serial1.printf(someChar[0]);
} while (Serial.available));
}
if(Serial1.available()) {
someChar[0] = Serial1.read();
Serial.print(someChar[0]);
}
#else
if(Serial.available()) {
do {
someChar[i++] = Serial.read();
delay(3);
} while (Serial.available() > 0);
Serial.println(someChar);
Serial1.print(someChar);
}
i = 0;
while(Serial1.available()) {
if(!dataModeFlag) {
do {
databuff[i] = Serial1.read();
Serial.print(databuff[i++]);
delay(3);
} while(Serial1.available() > 0);
databuff[i] = 0;
if(strstr(databuff, “OK”)) {
flag++;
if(waitATAOk) {
waitATAOk = 0;
dataModeFlag = 1;
Serial.println(“Enter Data Mode”);
}
}
} else { // dataModeFlag
do {
databuff[i] = Serial1.read();
// Serial.print(databuff[i++]);
Serial.print(“[”);
Serial.print((unsigned char)databuff[i++], HEX);
value = databuff[2];
Serial.print(“]”);
delay(3);
/*
if(databuff[2] == 5) {
Serial.print("get Android value : ");
Serial.print(databuff[2], HEX);
}
*/
} while (Serial1.available() > 0);

    Serial.print("\r\n");
    
    // Buffer Send
    if(i >= 4) {
      unsigned char sendbuf[4];
      sendbuf[0] = 0x01;
      sendbuf[1] = 0x90;
      sendbuf[2] = value;
      sendbuf[3] = 0x04;
      Serial1.write(sendbuf, 4);
    }
} 

}
/*
if(counter > 2) {
// Read
counter = 0;
Serial.println("Read : ");
Serial.println(value, DEC);
}
*/
#endif
}

전체 소스 입니다…

안녕하세요

혹시 우노 사용하시나요?? 소스코드를 보니 512 배열이 2개 있고, print도 많이 하시는것 같아 램 용량이 부족해보입니다.

ip까지 출력된 상태에서 다른 기기로 ap를 검색해보시면 wizfi210 ap가 나올 것으로 판단됩니다…

만약 그렇다면 wizfi210의 문제가 아닌, 아두이노에서의 문제로 생각됩니다.

보드는 MEGA ADK를 사용하고 있습니다. AP모드가아닌 일반모드로도 실행해보면은 ATA 명령 이후에 응답이벤트에서도 ip주소까지만 출력이 됩니다.

wifi 연결 부분은 기존 예제소스 그대로 사용을 했습니다…

안녕하세요.

아두이노 MEGA2560에서 1.6.3, 1.0.6 두가지 버전의 아두이노 IDE에서 테스트 해보았는데 컴파일 성공 후 시리얼 창에서 setup()의 print문도 수행하지 못했습니다. 아마 WizFishield가 아닌 모듈인것 같은데…

  1. 사용하시는 제품이 무엇인지 제품 링크나 사진을 부탁드립니다. 소스코드상의 Serial1은 uart인가요?

  2. 기존 예제라고 하셨는데, 올려주신 예제는 저희가 제공하는 예제는 아닌것 같습니다…
    만약 WizFishield를 사용중이시라면 [url]https://github.com/Wiznet/WizFiShield[/url] 저희 라이브러리로 접속 성공하는지 확인 부탁드립니다.

  3. 정확히 무한루프 도는 반복문이 어디인지 부정확합니다. 저희 소스코드상 AT+WA명령시 무한 루프를 돌 수 있는 구간이 없습니다. 작성하신 void loop() 내의 반복문에서 무한루프를 도는 것 같은데 어느 반복문인지 디버깅해서 알려주세요

  4. 또, 처음 말씀하셨던 무한루프 상태에서 다른기기(노트북, 스마트폰)로 WizFi210의 ap가 검색이 되는지도 확인 부탁드립니다.

  1. UART 입니다.
    사진 링크 : [url]http://multi.shingu.ac.kr/~2011125149/wiznet/wizfi.html[/url]
  2. 제공한 링크로 들어가서 Limited AP 예제 업로드시 서버 셋팅에 계속 실패합니다.
  3. 알아본결과 코드상 [OK]란 응답 명령이 올때까지 계속 Serial에 명령을 하는데 AT+WA명령에서 sb와 gw가 제대로 출력되지 않아서 [OK]라는 응답이 안와서 계속 무한루프에 빠지게 된 것 같습니다.
  4. AT+WA 명령에서 무한루프에빠질때 노트북 및 스마트폰에서 AP 검색은 됩니다.

안녕하세요

Limited AP 뿐만 아니라 아두이노 라이브러리는 SPI용(WizFiShield)으로 구현된 것들입니다.
그래서 uart에서는 동작하지 않습니다.

테스트 해보았는데, 저도 같은 문제가 발생했습니다.
테스트 환경은 아두이노 메가2560에 WizFi210-evb를 uart로 연결하고, evb에 uart1로 아두이노와 Wizfi210의 rx, tx를 캡쳐해보았습니다.

결과로 보아 WizFi210이 보내는 데이터를 코딩이나 메모리 등의 이유로 아두이노에서 제대로 수신하지 못하는 현상으로 보입니다.

그래서 제가 도움드릴 수 있는 부분은 WizFi210을 auto connection으로 사용하시라고 권해드리는 것 밖에 없을 것 같습니다.
mode, ip 등의 정보를 미리 WizFi210에 세팅해 두고, 전원이 인가 되었을 때 바로 세팅된 상태로 동작하는 방법입니다.

답변해주신 내용을 참고하여 해결하였습니다. 감사합니다. AP모드에서의 sb와 gw가 출력되지 않은 부분은 메모리상 문제로 판단하여 강제로 flag를 증가시켜 셋팅을 시켰습니다. 답변 감사합니다.