Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
AT
at_socket
esp32
esp32使用at_socket通信问题
发布于 2024-09-12 16:21:53 浏览:299
订阅该版
最近调试stm32的TCP服务端程序,遇到了想不明白的问题,具体过程如下: 1. 使用的是rt-thread4.1.0的内核; 2. 通过串口和esp32-c3通信; 3. 启用at_socket; 4. 建立tcp服务器; 5. 与wifi中其他客户端通信。 总体过程如上,刚开始调试发现esp32的软件包没有实现服务端,于是我就用esp8266的软件包测试,一切OK,tcp通信很好,然后我就把缺失的驱动从8266复制到esp32中,然后就出现了问题: ``` psr: 0x61000000 r00: 0x08024e30 r01: 0x00000000 r02: 0x20006590 r03: 0x00000000 r04: 0x2000b198 r05: 0x2000a768 r06: 0x200001cc r07: 0x08026080 r08: 0x08025a10 r09: 0x0000000d r10: 0x00000000 r11: 0x00000000 r12: 0x00000000 lr: 0x0800addd pc: 0x0800adec hard fault on thread: at_clnt ``` 如上,我后面多次调试,确认问题点在at_socket.c中的函数at_connect_notice_cb中,原代码如下: ```c #ifdef AT_USING_SOCKET_SERVER // 屏蔽掉此处代码,解决hard fault问题 // static int (*store_at_socket_temporary)(struct at_device *device, enum at_socket_type type); static void at_connect_notice_cb(struct at_socket *sock, at_socket_evt_t event, const char *buff, size_t bfsz) { RT_ASSERT(buff); RT_ASSERT(sock == RT_NULL); RT_ASSERT(event == AT_SOCKET_EVT_CONNECTED); extern struct netdev *netdev_default; struct netdev *netdev = RT_NULL; struct at_device *device = RT_NULL; struct at_socket *new_sock = RT_NULL; rt_base_t level; rt_slist_t *node = RT_NULL; struct at_socket *at_sock = RT_NULL; char *socket_info = RT_NULL; int base_socket = 0; if (netdev_default && netdev_is_up(netdev_default) && netdev_family_get(netdev_default) == AF_AT) { netdev = netdev_default; } else { /* get network interface device by protocol family AF_AT */ netdev = netdev_get_by_family(AF_AT); if (netdev == RT_NULL) { return; } } device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, netdev->name); if (device == RT_NULL) { return; } /* avoid use bottom driver to alloc "socket" */ // 屏蔽掉此处代码,解决hard fault问题 // store_at_socket_temporary = device->class->socket_ops->at_socket; // device->class->socket_ops->at_socket = RT_NULL; new_sock = alloc_socket_by_device(device, AT_SOCKET_TCP); if (new_sock == RT_NULL) { return; } new_sock->type = AT_SOCKET_TCP; new_sock->state = AT_SOCKET_CONNECT; /* set AT socket receive data callback function */ new_sock->ops->at_set_event_cb(AT_SOCKET_EVT_RECV, at_recv_notice_cb); new_sock->ops->at_set_event_cb(AT_SOCKET_EVT_CLOSED, at_closed_notice_cb); new_sock->ops->at_set_event_cb(AT_SOCKET_EVT_CONNECTED, at_connect_notice_cb); // 屏蔽掉此处代码,解决hard fault问题 //device->class->socket_ops->at_socket = store_at_socket_temporary; /* put incoming "socket" to the listen socket receiver packet list */ sscanf(buff, "SOCKET:%d", &base_socket); LOG_D("ACCEPT BASE SOCKET: %d", base_socket); new_sock->user_data = (void *)base_socket; socket_info = rt_malloc(AT_SOCKET_INFO_LEN); rt_memset(socket_info, 0, AT_SOCKET_INFO_LEN); rt_sprintf(socket_info, "SOCKET:%d", new_sock->socket); /* find out the listen socket */ level = rt_hw_interrupt_disable(); rt_slist_for_each(node, &_socket_list) { at_sock = rt_slist_entry(node, struct at_socket, list); if (at_sock && at_sock->magic == AT_SOCKET_MAGIC && at_sock->listen.is_listen == RT_TRUE) { break; } at_sock = RT_NULL; } rt_hw_interrupt_enable(level); if(at_sock == RT_NULL) { return; } /* wakeup the "accept" function */ rt_mutex_take(at_sock->recv_lock, RT_WAITING_FOREVER); if (at_recvpkt_put(&(at_sock->recvpkt_list), socket_info, AT_SOCKET_INFO_LEN) != RT_EOK) { rt_free((void *)buff); rt_mutex_release(at_sock->recv_lock); return; } rt_mutex_release(at_sock->recv_lock); rt_sem_release(at_sock->recv_notice); at_do_event_changes(at_sock, AT_EVENT_RECV, RT_TRUE); } #endif ``` 问题就在我注释掉的程序中,使用变量store_at_socket_temporary,每次程序执行下面这条语句 ```c new_sock = alloc_socket_by_device(device, AT_SOCKET_TCP); ``` 就会导致hard fault,始终没想明白什么原因,于是注释掉了和这个变量相关的语句,一切正常运行。 我后期又通过vscode对比了esp8266和esp32相关的3个驱动文件,除了有几处at指令语句因为esp at固件不同,稍微差几个字,以及变量名一个是esp8266开头,一个是esp32开头,其他的都一模一样。 大家有明白原因的吗,虽然问题解决了,但是百思不得其解啊!
查看更多
0
个回答
默认排序
按发布时间排序
暂无答案,快来添加答案吧
撰写答案
登录
注册新账号
关注者
0
被浏览
299
关于作者
不简单呀
这家伙很懒,什么也没写!
提问
5
回答
0
被采纳
0
关注TA
发私信
相关问题
1
rt-thread 2g/3g/4g通信模块的教程有吗?
2
基于AT指令,用esp8266如何连接mqtt?
3
AT组件使用问题
4
官方AT客户端应用笔记的几个小tip
5
RTT的SAL能够判断使用LWIP或者AT?
6
rt_therad AT组件移植不成功(结贴)
7
AT组件在哪个版本的?
8
AT组件 连接 Onenet 连接失败
9
esp8266 AT指令 MQTT连接问题
10
AT组件使用问题之模块主动上报【已解决】
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
简单两步配置RTT源码阅读环境 vsc+clangd
2
恩智浦[FRDM-MCXN947]初探 之 ADC与DAC
3
LVGL使用字库IC芯片显示中文
4
基于STM32H750和Rt-Thread的CANFD通信实现的记录(一)
5
freemodbus主机在freertos的适配,参考rtthread例程
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
805
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部