LWIP接收发送数据时间间隔设置
用硬石开发板例程改个TCP通信程序,发现接收数据很慢,间隔达到250ms,很大上位机下发的命令都无法快速响应:
#define TCP_TMR_INTERVAL 1//250 /* The TCP timer interval in milliseconds. */
原来是250,改成1,这样1ms接收回调一次
LWIP server 主动上传数据tcp_write ,要500ms才成功发送一次,TCP_TMR_INTERVAL调小就可以了
但是最小也有60ms,最后在网上找到了,是LWIP内部的Nagle算法会把一些小帧数据合并成一个大的数据包再往外发送,
解决: 在 tcp_recv(pcb, tcp_server_recv)前加tcp_nagle_disable(tcp_send_pcb)
/* 禁止小帧数据合并,否则会出现阻塞,内存溢出错误 */
tcp_nagle_disable(tcp_send_pcb);
tcp_recv(pcb, tcp_server_recv);
根本原因:tcp_write只是把数据复制到发送队列中,并没有发送,要立即发送使用tcp_output
err = tcp_write(pcb, puf, TCP_FRAME_DATA_ADD, 1);
if(err == ERR_OK) {
( void )tcp_output( pcb );
}
对LWIP只是能用,对底层代码了解不足。防止下次出错记录下。