打印

LwIP实现TCP通信时发送数据的问题

[复制链接]
15033|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
luting409|  楼主 | 2011-12-31 09:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在stm32f2开发板上实现lwip通信,主要是在研究例程,修改了部分程序,现在可以实现发送和接收。
    由于之前是定时发送固定字符串,因此没有发现问题,后来发送不同的数据时,发现会出现丢数据的现象,但是如果把发送数据的语句放在接收中断中,即放到LwIP_Pkt_Handle();函数中,则不会出现丢数据现象,但是发送的很慢,并且不是定时发的,发送的速率是变化的,不明白是为什么。
    由于我要实现的功能是把发送数据放在自己设置的定时器中断中,定时发送数据到上位机客户端,因此现在就需要知道发送数据时写完tcp_write后的数据到底是怎么传输的,为什么会出现丢数据的现象呢?费解?
    希望各位大侠帮忙解释一下。关于这个lwip已经头疼了好久了。

相关帖子

沙发
luting409|  楼主 | 2012-1-3 16:42 | 只看该作者
没有高手飘过啊.......
冷清啊

使用特权

评论回复
板凳
swx2010| | 2012-1-5 19:12 | 只看该作者
又遇到什么问题了

使用特权

评论回复
地板
luting409|  楼主 | 2012-1-6 15:58 | 只看该作者
呵呵,又是你啊,庆幸!!!
现在数据的发送已经没有问题了,可是最终要实现的定时发送数据,并且发送速率很快,暂时预计是100ms发送8000个数据,每个数据都是经AD采样来的数据,可是我现在发送数据的速度还是不能太快,否则就丢数据了。暂时还没有找到原因,但是理论上TCPIP的发送速率应该不会很慢的,所以我觉得应该是哪里出了问题。
    我分析了一下,每次调用完tcp_write后数据只是送到的缓存区,等待发送,之后的整个过程好像都没有控制到。

使用特权

评论回复
5
swx2010| | 2012-1-30 21:55 | 只看该作者
4# luting409
问题解决没,年前特殊情况休假太早了

使用特权

评论回复
6
sjnh| | 2012-1-31 08:25 | 只看该作者
我做TCP转串口时也是快了丢数据,发现是操作tcp_write太快了丢的(串口中断大约5-10ms就调用一次),具体多快会丢没有测试(100ms是没有问题的)
后来做了一下判断可以了:
if (tcp_write(serial_pcb, tcp_buf, len, 1) == ERR_OK)
没有去看为什么

使用特权

评论回复
7
dld2| | 2012-2-6 09:18 | 只看该作者
定时发送,我觉得你该用UDP。TCP是要握手的,不能简单地在定时中断里发送。

使用特权

评论回复
8
luting409|  楼主 | 2012-8-16 21:12 | 只看该作者
看到很多朋友的邮件,看来大家很多人都遇到这个问题了,我的已经解决了,现在把我修改的程序发给大家,是在原来的开发板的程序上进行修改的,主要修改的地方有:
1.屏蔽掉原来程序中再接受函数中进行发送的语句;
2.在tcp_echoserver_accept中将当前的pcb状态保存下来,即增加  tcp_echoserver_pcb_test = newpcb;其中 tcp_echoserver_pcb_test 是自己定义的变量;
3.在void Time_Update(void)
{
  tcp_write(tcp_echoserver_pcb_test, content, 20, TCP_WRITE_FLAG_COPY);
  LocalTime += SYSTEMTICK_PERIOD_MS;
}中增加了tcp_write函数。
这几点是主要修改的几点,其中比较重要的是第二步,保存当前的pcb,我用的是比较笨的办法,因为可能tcp协议有一些地方还是没有弄清楚,才这么做的,应该还有比较好的方法。大家可以好好研究一下。

使用特权

评论回复
9
luting409|  楼主 | 2012-8-16 21:12 | 只看该作者
看到很多朋友的邮件,看来大家很多人都遇到这个问题了,我的已经解决了,现在把我修改的程序发给大家,是在原来的开发板的程序上进行修改的,主要修改的地方有:
1.屏蔽掉原来程序中再接受函数中进行发送的语句;
2.在tcp_echoserver_accept中将当前的pcb状态保存下来,即增加  tcp_echoserver_pcb_test = newpcb;其中 tcp_echoserver_pcb_test 是自己定义的变量;
3.在void Time_Update(void)
{
  tcp_write(tcp_echoserver_pcb_test, content, 20, TCP_WRITE_FLAG_COPY);
  LocalTime += SYSTEMTICK_PERIOD_MS;
}中增加了tcp_write函数。
这几点是主要修改的几点,其中比较重要的是第二步,保存当前的pcb,我用的是比较笨的办法,因为可能tcp协议有一些地方还是没有弄清楚,才这么做的,应该还有比较好的方法。大家可以好好研究一下。

使用特权

评论回复
10
zhao5476278| | 2013-8-3 12:41 | 只看该作者
你好,我最近也在学习这个,因为是自己的板子,没有例程,所以想问下能不能把你的以太网的例程给我发一份,非常感谢。

使用特权

评论回复
11
zhao5476278| | 2013-8-3 12:44 | 只看该作者
我邮箱:zwc_1116@163.com

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

40

帖子

0

粉丝