Discuz! REAL TIME TECHNOLOGY
标题: 基于网络的STM32F207数据通信 [打印本页]
作者: ahwwq 时间: 2013-6-9 17:52
标题: 基于网络的STM32F207数据通信
目前只试过TCP方式,分别当做client和server,不过作为client时没有成功。
但是server时,能够成功发送和接收数据。
查看源代码,发现需要修改的不多,不是很难。
关于运行只需根据光盘里面的开发板用户手册上的一步一步做就OK,只需要修改LED对应的IO管脚。
作者: Wjianw 时间: 2013-6-10 13:52
测一下速率是多少
作者: ahwwq 时间: 2013-7-21 21:37
速度测试
固件需要基本不需要修改,接收和发送函数接口很明确,分别是:
/**
* @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 ahwwq@mail.ustc.edu.cn
*/
#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);
}
}
/**@}*/
测得的速度是10.8MB/s。10000字节来回是1761us。
作者: Wjianw 时间: 2013-7-22 10:27
ahwwq 发表于 2013-7-21 21:37 
速度测试
固件需要基本不需要修改,接收和发送函数接口很明确,分别是:
把测试工程打包传上来
作者: ahwwq 时间: 2013-7-22 11:27
Wjianw 发表于 2013-7-22 10:27 
把测试工程打包传上来
这个固件没有修改,直接用的是开发板自带的工程,位于\Code\STM32F2x7_ETH_LwIP_V1.0.2\Project\Standalone \ tcp_echo_server \MDK- ARM
作者: ahwwq 时间: 2013-7-30 09:56
上次测试的数据有些问题,经测试,接收到的数据前1460字节是正确的,但是1460字节后为0,即未接收到数据。
将发送数改为1460字节,测得的时间为660us,速度大约是2.1MB/s。
欢迎光临 Discuz! REAL TIME TECHNOLOGY (http://lodetech.ustc.edu.cn/bbs/) |
Powered by Discuz! X2.5 |