-
是网关,w5300把PC机的地址当成网关,同时也是destination address
-
20位的试了:字长设为20位,FSX设为18个CLOCK
示波器上看DATA的时序不对。
但是结果好像跟数据手册上说帧同步异常处理也对应不上。
既不是传了一半,重传;也不是忽略同步帧同步;
发送0x1ffff,示波器上一帧数据的前6位是1,后面都是0
-
对上面这个时序,有没有其他好的解决办法呢
-
感谢版主大人!
补充一下,数据是单向传的,只从McBSP流向DA。DA数据输入时序如下图,DATA脚输入18位数据后,需要一个锁存信号LATCH。
这个锁存使用McBSP的帧同步脚FSX,FSX的周期可以自己设定(CLK的倍数),这些可以设置。
问题是FSX信号的跳变如果与McBSP的设定字长(8,12,16,20,24)对应不上会产生帧同步异常(“Unexpected Transmit Frame-Synchronization Pulse”),McBSP对异常的处理方法有2种(XCR2.bit.XFIG):1重传,2忽略同步信号继续传;
对DA来说,1重传肯定不行。2忽略同步信号继续传好像也不行,示波器上看DATA脚的信号完全不对。
该怎么办好呢!
-
打错了,是tcp_close()。
这么快就出现错误,惭愧死
-
有些文章介绍TCP连接分为长连接和短连接。TI http服务器的例子应该是短连接,发送回调函数里有pcb_close(),之后TCP连接关闭。
LwIP RAW api 在没有建立TCP连接的情况下,如果要接收数据,必须调用tcp_listen_with_backlog(),也就是tcp_listen()。不管板子做Server还是Client,都需要这个调用。
不知道这两个理解对不对。
-
include\ipv4\lwip\ip_addr.h
PACK_STRUCT_BEGIN
struct ip_addr {
PACK_STRUCT_FIELD(u32_t addr);
} PACK_STRUCT_STRUCT;
PACK_STRUCT_END
如果设置一个 sturct ip_addr 变量的话,下面是一种方式,注意IP地址的分隔符是“逗号”
struct ip_addr;
IP4_ADDR(&ip_addr,192,168,0,33);
-
TI 的http 例程使用的是RAW API,做服务器监听的绑定方式如下,不知道是否可以参考。
struct tcp_pcb *pcb;
pcb = tcp_new();
tcp_bind(pcb, IP_ADDR_ANY, 80);
pcb = tcp_listen(pcb);
tcp_accept(pcb, http_accept);
-
netconn_bind()是Sequential AP么?
现在只是在模仿例子程序,能看明白的只是回调函数一小块。
至于TCP从连接建立到关闭的过程,tpc_pcb在各种状态下的含义和处理方法等等,这些应该是TCP处理流程的主体。
用LwIP的代码来讲解这一流程的资料较少。
-
求关注!!!
-
接收数据时进入tcp_recv_null是因为之前TCP_EVENT_ACCEPT(pcb, ERR_OK, err);没有被执行。
此时pcb->state == ESTABLISHED
只有当pcb->state == SYN_RCVD的时候才能有机会执行TCP_EVENT_ACCEPT 。
tcp的发送和接受是否使用同一个pcb?
还是发送和接受各需要一个pcb?
pcb与端口是一一对应,还是可以一对多,多对一?
谢谢楼上的
求关注!!!
-
tcp_accept(pcb_send, tcp_acceptset);
tcp_connect(pcb_send, &ipaddr, 4000, tcp_connected);
我把回调函数tcp_acceptset、 tcp_connected
里面的tcp_close(pcb);删掉了,这个pcb还要用呢,为什么要close呢?
-
打开TCP_INPUT_DEBUT调试宏,发现板子实际已经接收到数据,而且接收的字节数与PC发送的字节数相等。
但是无法进入接收回调函数。接收TCP数据包如下:
tcp_input()
{......
TCP_EVENT_RECV(pcb, recv_data, ERR_OK, err);
......}
#define TCP_EVENT_RECV(pcb,p,err,ret) \
do { \
if((pcb)->recv != NULL) { \
(ret) = (pcb)->recv((pcb)->callback_arg,(pcb),(p),(err)); \
} else {
//进入到这里,(pcb->recv == NULL) \
(ret) = tcp_recv_null(NULL, (pcb), (p), (err)); \
} \
} while (0)
debug结果是进入到tcp_recv_null(NULL, (pcb), (p), (err));
也就是说pcb->recv并没有指向回调函数。
调了一天,哇哇大哭呀!!!
-
tcp_connect(pcb,&IPAddr,port,callConnect);里处理的是板子发送设置。
这个时候该怎么设置接收回调函数呢?
我改成下面的初始化设置,但还是不行,能发送,不能接收。
IP4_ADDR(&ipaddr, 119,78,208,24); //Server PC IP address
pcb_send = tcp_new();
tcp_bind(pcb_send, IP_ADDR_ANY, 4000);
tcp_accept(pcb_send, tcp_acceptset);
tcp_connect(pcb_send, &ipaddr, 4000, tcp_connected);
-
感谢二位回复!
是想让板子做客户端。
板子发送是参考周立功“LwIP的RAW API接口及编程指南”的例子。
板子接收是参考斑竹帖子“以太网学习的一点心得”和TI的httpd的HTTP接收代码。
单独调试基本上都可以了,放在一起就不行。
回o0pingu0o
考虑到以后要用到长时间连接和数据刷新,选择了TCP。也正好PC上有个VC的TCP例子,呵呵!
周立功的代码我只有上面那个,其他哪里能找到?
回 Study_Stellaris:
pcb = tcp_listen(pcb);
tcp_accept(pcb, tcp_acceptset);
这两句是为了接收。如果板子做Client,接收数据的初始化代码该怎么写呢?
我理解tcp_listen(pcb)是把pcb放到监听队列里。
tcp_accept(pcb, tcp_acceptset)是为了在tcp_input()里调用“tcp_acceptset”这个回调函数。
至于这两句间的关系,从代码上没看懂。
发送和接收在一起的初始化流程该怎么写呢?
-
PC的Server
接收连接:m_sListenSocket.Accept(m_sConnectSocket);
接收数据:m_sConnectSocket.Receive(pBuf, iBufSize);
发送数据:m_sConnectSocket.Send(LPCTSTR(m_strSpeed), iLen);
Server程序并没有明确设定客户端IP和端口的语句,至少我没写,但是却能向另一个PC上的Client程序发送数据。
MFC的Socket程序接收和发送用的是同一个端口么?
LwIP的接收和发送用的是同一个端口么?
尽情的鄙视我吧,鄙视完了给讲讲哈!
:funk:
-
设定板子向PC发送10遍数据, 但实际只发了7遍
-
板子初始化:
pcb = tpc_new(); //接收pcb
pcb_send = tpc_new(); //发送pcb
tcp_bind(pcb, IP_ADDR_ANY, TCP_PORT_PMSM60);
tcp_bind(pcb_send, IP_ADDR_ANY, TCP_PORT_PMSM60);
收发使用两个pcb,与同一个端口绑定,是否可以这样设置?
PC端使用CAsyncSocket类定义了两个socket:
m_sListenSocket; //监听
m_sConnectSocket; //发送
PC程序与PC程序间收发数据都正常(这两个PC程序类似),但是PC向板子发送数据(下面这句)
m_sConnectSocket.Send(LPCTSTR(m_strSpeed), iLen)
出现错误,错误代码10038:WSAENOTSOCK
对LwIP的TCP收发流程不理解,迷糊呀!
-
PC做Server, 板子做Client。 板子向PC发3个无符号整形数据,接收PC发过来的1个无符号整形数据。就这点功能。改了一下tcpclient_init()
=========================================================
void tcpclient_init()
{
struct tcp_pcb *pcb;
struct ip_addr ipaddr;
struct tcp_pcb *pcb_send;
UARTprintf("tcpclient_init\n");
IP4_ADDR(&ipaddr, 119,78,208,24); //Server PC IP address
pcb = tcp_new();
tcp_bind(pcb, IP_ADDR_ANY, TCP_PORT_PMSM60);
pcb = tcp_listen(pcb);
tcp_accept(pcb, tcp_acceptset);
pcb_send = tcp_new();
tcp_bind(pcb_send, IP_ADDR_ANY, TCP_PORT_PMSM60);
tcp_connect(pcb_send, &ipaddr, TCP_PORT_PMSM60, tcp_connected);
}
这回板子发送数据后,PC程序出现Debug Assertion Failed!错误。忽略后能显示收到的数据。但是板子收不到PC发来的数据。
-
物价一直在涨啊