打印
[STM32F1]

请教以太网数据传输问题

[复制链接]
5245|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xialu0908|  楼主 | 2014-3-18 13:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现用STM32+lwip做TCP服务器能和PC建立TCP通信 完成数据收发 现在想通过STM32的串口实现以太网数据的透明传输 请教该对以太网数据怎么操作然后再通过串口发送出去
沙发
prayerwind| | 2014-3-18 13:55 | 只看该作者
With RTOS or without RTOS。
1. Without RTOS
    你需要为tcp_receive函数注册回调函数,回调函数会自动得到以太网数据的指针(pbuf)指针。此时,就可以对数据进行处理了。
2. With RTOS
    遵循BSD规范,你需要为recv函数指定缓冲区,协议栈自动会将数据存放在缓冲区中。

需要注意的:
1. 你的数据量是多少?tcp的一个segment发送的完吗?
2. 如果数据流量较大,由于以太网和串口的数据传输速度相差较大,你可以通过缓冲区的方式来解决。

使用特权

评论回复
板凳
xialu0908|  楼主 | 2014-3-20 15:38 | 只看该作者
那串口接收到的数据又该怎样通过网络回传给PC呢

使用特权

评论回复
地板
xialu0908|  楼主 | 2014-3-20 15:39 | 只看该作者
prayerwind 发表于 2014-3-18 13:55
With RTOS or without RTOS。
1. Without RTOS
    你需要为tcp_receive函数注册回调函数,回调函数会自动 ...

那串口接收到的数据又该怎样通过网络回传给PC呢

使用特权

评论回复
5
prayerwind| | 2014-3-20 20:55 | 只看该作者
xialu0908 发表于 2014-3-20 15:39
那串口接收到的数据又该怎样通过网络回传给PC呢

缓冲区思想类似。
一般通过tcp_write函数(数据的调用同样是利用pbuf指针)将数据写入tcp发送缓冲区(可以不copy,主要是完成tcp的分段操作),在tcp定时器的控制下缓冲区的数据会通过以太网分段发出。

使用特权

评论回复
6
xialu0908|  楼主 | 2014-3-21 13:21 | 只看该作者
prayerwind 发表于 2014-3-20 20:55
缓冲区思想类似。
一般通过tcp_write函数(数据的调用同样是利用pbuf指针)将数据写入tcp发送缓冲区(可 ...

能给个具体例子看看吗 新手实在不解 tcp_write(struct tcp_pcb *pcb, const void *data, u16_t len, u8_t apiflags)
这个函数里的数据地址和数据长度要怎么样和串口接收到数据对应起来呢

使用特权

评论回复
7
FAQ| | 2014-3-21 15:37 | 只看该作者

使用特权

评论回复
8
xialu0908|  楼主 | 2014-3-25 09:57 | 只看该作者

RE: 请教以太网数据传输问题

prayerwind 发表于 2014-3-20 20:55
缓冲区思想类似。
一般通过tcp_write函数(数据的调用同样是利用pbuf指针)将数据写入tcp发送缓冲区(可 ...

调了几天还是无法实现串口数据转网口的发送 贴上代码能帮我看看是哪的问题吗
int main(void)
{
//add a long delay wait for DP83848 finish reset  
unsigned int i,j;
for(i=0;i<36;i++)
{
        for(j=0;j < 65500;j++);
}
//#ifdef SERIAL_DEBUG
//  DebugComPort_Init();
//#endif
  USART_Configuration();
  USART_NVIC_Config();
  /* configure ethernet (GPIOs, clocks, MAC, DMA) */
  ETH_BSP_Config();
   
  /* Initilaize the LwIP stack */
  LwIP_Init();
  
  /* Http webserver Init */
// httpd_init();
  pTCP = tcp_new();
  tcp_echoserver_init();
  while (1)
  {  
    /* check if any packet received */
    if (ETH_CheckFrameReceived())
    {
      /* process received ethernet packet */
      LwIP_Pkt_Handle();
    }
    /* handle periodic timers for LwIP */
    LwIP_Periodic_Handle(LocalTime);
    tcp_send_data(USART_RecvBuff, USART_Counter);//将串口收到的数据转发给网络。
  USART_Counter = 0;
  }  
}

void tcp_send_data(uint8_t* pData, uint16_t len)//TCP发送函数
{
  struct pbuf* buff;
  buff = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM);
  memcpy(buff->payload, pData, len);  
  tcp_write(pTCP, buff->payload, buff->len, 1);       
  /* Free the buffer */
  pbuf_free(buff);  
}

以下是串口中断函数
void USARTx_IRQHANDLER(void)
{
  if(USART_GetITStatus(Open207Z_USARTx, USART_IT_RXNE) != RESET)
  {
  USART_RecvBuff[USART_Counter++] = USART_ReceiveData(Open207Z_USARTx);
//printf("USART Hyperterminal Interrupts Receive a word: %c\r\n",USART_ReceiveData(Open207Z_USARTx));
  }
}

使用特权

评论回复
9
prayerwind| | 2014-3-25 10:09 | 只看该作者
xialu0908 发表于 2014-3-25 09:57
调了几天还是无法实现串口数据转网口的发送 贴上代码能帮我看看是哪的问题吗
int main(void)
{

代码设计有问题:
1. 代码中你没有在并不是在tcp建立连接后才进行数据转发的,因此调用                                   tcp_write(pTCP, buff->payload, buff->len, 1) 这个函数,pTCP是不是所需要的控制块?

2. 请阅读tcp_write的注释。

3. 请用WireShark将你的网络抓包发出来

使用特权

评论回复
10
xialu0908|  楼主 | 2014-3-25 11:10 | 只看该作者
prayerwind 发表于 2014-3-25 10:09
代码设计有问题:
1. 代码中你没有在并不是在tcp建立连接后才进行数据转发的,因此调用                  ...

1.  “代码中你没有在并不是在tcp建立连接后才进行数据转发的”这句话什么意思?  pTCP = tcp_new()这个是建立pTCP控制块 之前有定义struct tcp_pcb* pTCP
2.err_t tcp_write(struct tcp_pcb *pcb, const void *data, u16_t len, u8_t apiflags)

说明:发送TCP数据包,但并不会立即发送。

参数:pcb协议控制块;data要发送的数据指针;len要啊发送的数据长度;apiiflags包括下面两种标识TCP_WRITE_FLAG_COPY表示数据会被复制到栈内缓存后再发送,TCP_WRITE_FLAG_MORE表示在最后的片段上置位PSH选项。

返回:ERR_OK表示发送成功,其它表示发送失败。

实际上这个函数仅是将数据放入发送队列中,但并不会立即发送,它会等待更多的数据一并发送,这样会更有效率。如果需要立即发送的话,这个函数用后要调用tcp_output函数(下一个讲)。

是不是后面还要加tcp_output函数
3.点了串口助手发送一直显示这样的

使用特权

评论回复
11
prayerwind| | 2014-3-25 11:36 | 只看该作者
请参考下这份程序。
你的tcp链接还没有建立。

STM32Fxx7_ETH_USART_Bridge.zip

2.22 MB

使用特权

评论回复
12
xialu0908|  楼主 | 2014-3-25 11:52 | 只看该作者
prayerwind 发表于 2014-3-25 11:36
请参考下这份程序。
你的tcp链接还没有建立。

恩 谢谢 我看看

使用特权

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

本版积分规则

11

主题

21

帖子

0

粉丝