Discuz! REAL TIME TECHNOLOGY

 找回密码
 立即注册
查看: 8166|回复: 5
打印 上一主题 下一主题

基于网络的STM32F207数据通信

[复制链接]

45

主题

0

好友

1639

积分

金牌会员

Rank: 6Rank: 6

跳转到指定楼层
楼主
发表于 2013-6-9 17:52:40 |只看该作者 |倒序浏览
目前只试过TCP方式,分别当做client和server,不过作为client时没有成功。
但是server时,能够成功发送和接收数据。

查看源代码,发现需要修改的不多,不是很难。

关于运行只需根据光盘里面的开发板用户手册上的一步一步做就OK,只需要修改LED对应的IO管脚。
回复

使用道具 举报

405

主题

0

好友

6581

积分

内部组员

Rank: 8Rank: 8

活跃会员 论坛元老

沙发
发表于 2013-6-10 13:52:04 |只看该作者
测一下速率是多少
回复

使用道具 举报

45

主题

0

好友

1639

积分

金牌会员

Rank: 6Rank: 6

板凳
发表于 2013-7-21 21:37:03 |只看该作者
速度测试


固件需要基本不需要修改,接收和发送函数接口很明确,分别是:
/**
  * @brief  This function is the implementation for tcp_recv LwIP callback
  * @param  arg: pointer on a argument for the tcp_pcb connection
  * @param  tpcb: pointer on the tcp_pcb connection
  * @param  pbuf: pointer on the received pbuf
  * @param  err: error information regarding the reveived pbuf
  * @retval err_t: error code
  */
static err_t tcp_echoserver_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err);

/**
  * @brief  This function is used to send data for tcp connection
  * @param  tpcb: pointer on the tcp_pcb connection
  * @param  es: pointer on echo_state structure
  * @retval None
  */
static void tcp_echoserver_send(struct tcp_pcb *tpcb, struct tcp_echoserver_struct *es);

然后就是需要知道固件的ServerIP和端口以及网关(客户端手动设置IP时要一致),均在main.h文件中定义。
固件中收到信息后会调用发送函数将信息返回,即ECHO模式,自己可修改。

客户端,连接开发板后,需要设置ip及网关。
然后可以用以下代码测试速度:
/**
 * @file sockettest.c
 * @author  [url=mailto:ahwwq@mail.ustc.edu.cn]ahwwq@mail.ustc.edu.cn[/url]
*/
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <netinet/in.h>
#include <errno.h>
#include <sys/time.h>
int sockNodeCnn;
/**
 *  @brief 向服务器端请求连接。
 *  @return 连接成功则返回TRUE,失败则返回FALSE.
 */
int ConnectServer()
{
    int                iRet = 0;
    struct sockaddr_in sin;
    // 对分支的每个节点进行连接。
    // 如果g_sockNodeCnn大于零则认为连接已经建立
    if(sockNodeCnn > 0)
    {
    printf("\n>>>>%d<<<<\n",__LINE__);
        return 1;
    }

    bzero(&sin, sizeof(sin));
    sin.sin_family      = AF_INET;
    sin.sin_port        = htons(7);
    sin.sin_addr.s_addr = inet_addr("192.168.1.103");
    bzero(&sin.sin_zero, 8);

    sockNodeCnn = socket(AF_INET, SOCK_STREAM, 0);
    if(sockNodeCnn < 0)
    {
    printf("\n>>>>%d<<<<\n",__LINE__);
        return 0;
    }

    iRet = connect(sockNodeCnn, (struct sockaddr *)&sin, sizeof(sin));
    if(iRet < 0)
    {
        return 0;
    }
    printf("\n>>>>%d<<<<\n",sockNodeCnn);
}
/**
 *  @brief 关闭节点服务器端连接。
 *  @return 成功则返回TRUE,失败则返回FALSE.
 */
int CloseServer(int i)
{
    if(shutdown(sockNodeCnn,SHUT_RDWR))
    {
    }
    else 
    {
        sockNodeCnn = 0;
    }
}

/**@brief 将命令发送至节点服务端
 * @param strCmd 存储命令的缓冲
 * @param nLength  命令缓存的长度,如果为零则不发送任何信息
 * @param iNodeNum  需要发送的节点编号
 * @return 发送成功则返回TRUE.
 */
int SendMsg(const uint8_t *strCmd, int nLength)
{
    int iSockfd = sockNodeCnn;
    int nWrite;
    struct timeval tmvTimeOut;
    tmvTimeOut.tv_sec = 1;
    tmvTimeOut.tv_usec = 0;

    // 如果长度为零,则无需发送
    if(nLength == 0)
    {
        return 1;
    }

    // 如果连接不正常,则退出
    if(iSockfd <= 0)
    {
        return 0;
    }

    nWrite = write(iSockfd, strCmd, nLength);
    if(nWrite < 0)
    {
        return 0;
    }
    return 1;
}

int main()
{
    int i;
    uint8_t str[10000],dest[10000];
    memset(str,1,10000);
    memset(dest,0,10000);
    int iRet = ConnectServer();
    struct  timeval start;
    struct  timeval end;

    gettimeofday(&start,NULL);
    SendMsg(str,10000);
    read(sockNodeCnn,dest,10000);
    gettimeofday(&end,NULL);

    long diff = 1000000 * (end.tv_sec-start.tv_sec)+ end.tv_usec-start.tv_usec;
    printf("thedifference is %ld\n",diff);
    for(i=0; i<100; i++)
    {
        printf("%d",dest[i]);
    }
}
/**@}*/


测得的速度是10.8MB/s。10000字节来回是1761us。
回复

使用道具 举报

405

主题

0

好友

6581

积分

内部组员

Rank: 8Rank: 8

活跃会员 论坛元老

地板
发表于 2013-7-22 10:27:24 |只看该作者
ahwwq 发表于 2013-7-21 21:37
速度测试

固件需要基本不需要修改,接收和发送函数接口很明确,分别是:

把测试工程打包传上来
回复

使用道具 举报

45

主题

0

好友

1639

积分

金牌会员

Rank: 6Rank: 6

5#
发表于 2013-7-22 11:27:43 |只看该作者
Wjianw 发表于 2013-7-22 10:27
把测试工程打包传上来

这个固件没有修改,直接用的是开发板自带的工程,位于\Code\STM32F2x7_ETH_LwIP_V1.0.2\Project\Standalone \  tcp_echo_server \MDK- ARM
回复

使用道具 举报

45

主题

0

好友

1639

积分

金牌会员

Rank: 6Rank: 6

6#
发表于 2013-7-30 09:56:09 |只看该作者
上次测试的数据有些问题,经测试,接收到的数据前1460字节是正确的,但是1460字节后为0,即未接收到数据。
将发送数改为1460字节,测得的时间为660us,速度大约是2.1MB/s。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

Archiver|手机版|Real Time Group

GMT+8, 2025-3-16 03:21 , Processed in 0.025915 second(s), 18 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部