RT-Thread ------ ESP8266

流程:

1、注册设备类 ---> 调用 esp8266_device_class_register(),把 ESP8266 的初始化、WIFI设置函数 和 esp8266_socket_connect() 等socket函数传入系统

 

2、注册设备 ---> 在应用层用 at_device_register(),把 device->list 添加到链表 at_device_list,通过client->name找到串口设备结构体(内含读串口缓冲区数据、发送串口数据等API),并把串口设备结构体赋值给AT设备结构体。 同时,函数 at_device_register() 调用了 ESP8266 的初始化函数 esp8266_init()--->at_client_init()--->at_client_para_init(),在这里面创建接收数据需要的信号量等,并且创建接收线程 client_parser()

 

3、UART4_IRQHandler()--->uart_isr()--->rt_hw_serial_isr()--->serial->parent.rx_indicate()

rt_device_set_rx_indicate()--->at_client_rx_ind()--->at_client_getchar()--->at_recv_readline()--->client_parser()

at_client_getchar()--->rt_device_read()(由于传入形参是串口设备结构体,所以调用的是串口设备结构体中的函数:rt_serial_read())

at_client_rx_ind() 函数内发射信号(信号句柄是:rx_notice),at_client_getchar() 函数内接收到信号后读取一个字节数据,at_recv_readline() 接收一定量的数据返回给 client_parser(),一定量判断标准有:

  1、接收到\r \n

  2、设置了特定的结束标志,比如’>‘

  

 

 

  3、收到特定的字符串头和字符串尾,不关心字符串中间。针对ESP8266,有两个 urc_table()

 

串口接收数据思路:有一个串口接收缓冲区,循环存储。每接收到一个字节,串口中断函数往缓冲区写一个数据,同时发送一个信号,告知上层有数据可读,上层读取的是串口缓冲区里的数据。

RT_SERIAL_RB_BUFSZ:设置串口接收缓存大小,即串口中断接收到的数据先放入这里,申请空间在这个函数:rt_serial_open()

rt_hw_usart_init()--->rt_hw_serial_register()

 

接收到TCP服务器数据的数据流:client_parser()--->urc_recv_func()-->at_recv_notice_cb()--->at_recvfrom()

at_recv_notice_cb()把数据放入动态申请空间,插入链表,然后释放信号sock->recv_noticeat_recvfrom()接收信号,从链表读数据,释放申请的空间

设置回调函数at_recv_notice_cb()过程:at_recvfrom()、at_connect()、at_sendto()--->esp8266_socket_set_event_cb()--->at_recv_notice_cb()

设置回调函数at_recvfrom()过程:esp8266_init()--->esp8266_netdev_add()--->sal_at_netdev_set_pf_info()--->at_inet_family--->at_socket_ops--->at_recvfrom(),所以recv()--->sal_recvfrom()内调用回调函数,回调函数是at_recvfrom()

总结:应用层调用recv(),实际是调用at_recvfrom(),接收到TCP服务器数据后通过at_recv_notice_cb()内的信号告知at_recvfrom()有数据可读

 

note:

1、"设置内核对象名称的最大长度“至少为9,否则AT线程的名字都是”at_clnt“,正常是”at_clnt0“、"at_clnt1"

2、ESP8266 初始化程序开始的时候,发送AT指令没有回复,直接终止初始化

3、每次发送 AT 指令,需要申请一个结构体 at_response_t 变量,变量中可以设置接受 AT 指令返回数据的 buf 大小,最大等待时间,何种方式返回等。其中 buf 的大小根据 line_num 需要存一行数据或者多行数据

4、client->recv_bufsz 是在 RT-Thread Settings 中 “接收缓存一行数据的最大长度”,对应的缓存容器是"client->recv_line_buf",一行的结束标准看 at_recv_readline() 

5、ESP8266发给单片机的数据,分以下几种情况存储:

  1、接收到AT指令的response数据,先放入 client->recv_line_buf,然后再放入 resp->buf

  2、接收到URC数据(非+IPD,X,X),放入 client->recv_line_buf,根据数据进行相应的设置

  3、接收到URC数据(+IPD,X,X),先放入 client->recv_line_buf,然后根据数据中的参数判断接下来要接收的数据量,动态申请内存空间存放

6、"AT 命令缓冲区的最大长度”是指单片机要发送的AT指令最大总长度

 

 

MQTT:

调用 mqtt_start(),会调用 ESP8266 的初始化函数

 

posted @ 2021-01-09 17:11  流水灯  阅读(45)  评论(0编辑  收藏  举报