Discuz! REAL TIME TECHNOLOGY

用户名  找回密码
 立即注册
查看: 8171|回复: 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 |只看该作者
速度测试


固件需要基本不需要修改,接收和发送函数接口很明确,分别是:
1
2
3
4
5
6
7
8
9
/**
  * @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);

1
2
3
4
5
6
7
/**
  * @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及网关。
然后可以用以下代码测试速度:
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/**
 * @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 20:06 , Processed in 0.027771 second(s), 19 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部