c - ESP8266 - 连接到 TCP 服务器(C 语言)

标签 c tcp esp8266

我目前正在尝试让 esp8266 连接到我的 http 服务器。连接到我的本地 WiFi 网络可以正常工作,但如果我尝试连接到我的服务器,我会在终端窗口上收到此错误:

Fatal exception 9(LoadStoreAlignmentCause): epc1=0x4026027b, epc2=0x00000000, epc3=0x00000000, excvaddr=0x00000011, depc=0x00000000

user_init 函数中,我调用 check_ip() 来处理 tcp 连接,如下所示:

LOCAL void ICACHE_FLASH_ATTR check_ip(void){
    struct espconn conn;
    struct ip_info ipconf;
    esp_tcp tcp;
    uint8 ipAddr[4] = {1,2,3,4};
    uint32 localPort = espconn_port();
    bool res = wifi_get_ip_info(STATION_IF, &ipconf);
    if(!res)
        os_printf("No Success.");
    else{
        os_memcpy(tcp.local_ip,&ipconf.ip,4);
        if(wifi_station_get_connect_status() == STATION_GOT_IP && ipconf.ip.addr != 0){
            os_printf("Got IP Address.\n");

            tcp.remote_port = 80;
            tcp.local_port = espconn_port();
            os_memcpy(tcp.remote_ip,ipAddr,4);

            conn.type = ESPCONN_TCP;
            conn.state = ESPCONN_NONE;
            conn.proto.tcp = &tcp;

            espconn_regist_connectcb(&conn,tcp_connect_cb);
            espconn_regist_reconcb(&conn,tcp_recon_cb);

            espconn_connect(&conn);
            os_timer_disarm(&timer);
        } else {
            os_timer_setfn(&timer,(os_timer_func_t*)check_ip,NULL);
            os_timer_arm(&timer,100,0); //recall function after 100ms, don't repeat
        }
    }
}

非常感谢任何帮助。

最佳答案

如果我没记错的话,你需要动态分配esp_conn,而不是使用堆栈变量。

(在内部,espconn_tcp_client(struct espconn *espconn) 函数执行以下操作: espconn_list_creat(&plink_active, pclient); pclient->pespconn = espconn; <---- it stores your pointer

示例:https://myesp8266.blogspot.com.cy/2015/03/publish-data-from-your-esp8266-to.html (只是在 Google 中排名第一,但看起来还不错)

PS:IMO esp_conn_xxxx 函数有点不可靠......我建议使用 LWIP。

关于c - ESP8266 - 连接到 TCP 服务器(C 语言),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39453130/

相关文章:

c - 如何使用 continue 语句将此 for 循环转换为 C 中的 while 循环

c# - C#TCP异步BeginSend回调永远不会发生

c - 序列化目录树以通过 TCP 发送

esp8266 - 是否有用于测试在 Arduino IDE 上编写的代码的 esp8266 模拟器?

c - 如果值包含 '&' 字符,则解析 POST 请求

c - 如何获取exec执行的程序的返回值?

检查结构数组是否已满

javascript - 如何通过同一个流发送不同编码的数据?

arduino - ESP8266 不断重启 rst cause :4, boot mode :(3, 7) NO PROGRAM LOADED

c - 警告 : espcomm_sync failed error: espcomm_open failed error: espcomm_upload_mem failed