5734|6

161

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

网络开发笔记8_数据采集 [复制链接]

TCP Socket

       传输控制协议(TCP)在因特网协议(IP)之上运行。TCP 是一种面向连接的可靠的字节流服务。面向连接是指两个应用程序使用TCP时,须在它们交换数据之前建立TCP连接。

       TCP 是一个双工通信协议,就是说每一个TCP 连接支持一对字节流,收发双方各一个。 它对每一个由于错误没有到达目标文件的数剧进行重传。如果接收数据损坏,它也进行重发。

       当数据被传送时,TCP 协议按相同的序列依次传递数据。

 

打开TCP连接

RL-TCPnet是基于客户/服务器模式的操作,并且TCP连接的设置也是基于此。客户和服务器模式都是通过一个打开操作来准备连接。然而,有两种打开方式: 

       主动打开: 客户机使用TCP扮演积极角色,处理并通过发送TCP信息来启动并初始化连接  (  SYN信息)

       被动打开: 一个服务器进程,设计成使用TCP,使用一个更加宽松的方法。 它通过被动方式打开TCP连接,就像说我在这,我在等待希望与我交谈并通过下面的端口号发送信息给我的客户机。这种打开方式称为被动,是因为除了指示进程以外,服务器没有做任何事。  

被动打开方式,事实上,是服务器在等待一个来自一特殊客户的主动打开。然而,不是所有的  RL-TCPnet APIs 支持该能力。

 

TCP 主动打开

       当试着连接一个远程服务器时,嵌入式应用程序使用TCP Active Open,例如发送邮件。这种情况下,TCPnet 系统是  TCP 连接的发起者.

打开活动的TCP连接,须以下几步:

  Net_Config.c 配置文件中打开TCP socket

  使用 tcp_get_socket() 函数分配TCP socket

  通过调用 tcp_connect() 函数初始化TCP连接。

 

......................................................................详见PDF

网络开发笔记8_数据采集.pdf

160.12 KB, 下载次数: 249

最新回复

我只能真心的说句佩服  详情 回复 发表于 2012-11-26 15:14
 
点赞 关注

回复
举报

161

帖子

0

TA的资源

一粒金砂(高级)

沙发
 

TCP被动打开

       当运行服务器应用程序时TCP被以被动方式打开,例如WEB浏览器。  TCP Socket以被动方式打开,并等待输入连接。

按以下步骤被动打开 TCP 连接:

  net_config.c 配置文件中允许TCP Socket

  调用tcp_get_socket() 函数,分配一闲置的TCP Socket

  调用 tcp_listen() 函数,允许TCP Socket的监听模式。

 

发送TCP数据

       TCP 协议是一种字节流服务。它不关心发送的数据的格式。只是简单的接收数据,将其压缩成TCP包,并发送给远程对等体。之后TCP Socket把最后的包保存在内存里,并等待远程对等体的响应回复。

如果时间超出之后,发送的包仍没有得到对等体的响应,将会重新发送该包。在包得到响应或 Socket连接失败之前,该过程将重复多次。

为了让协议实现尽可能的小一些、不致出现资源短缺。TCP Socket不能让大量的数据在缓冲中而等待响应回复。它只将最后的包的发送保存在内存中,直到其被响应。当被响应以后,释放内存空间。

 
 

回复

161

帖子

0

TA的资源

一粒金砂(高级)

板凳
 

数据的采集与发送(开发板 客户端)

       我现模似一下数据的采集,着重于在数据的发送上。我以tcp客服端为例。

#include <RTL.h>

#include <stdio.h>

#include <LM3Sxxxx.H>

#include <string.h>

//IP 等配置信息

//-------- <<< Use Configuration Wizard in Context Menu >>> -----------------

 

//   <h>Remote IP Address

//   ====================

//

//     <o>IP1: Address byte 1 <0-255>

//     <i> Default: 192

#define IP1            192

 

//     <o>IP2: Address byte 2 <0-255>

//     <i> Default: 168

#define IP2            168

 

//     <o>IP3: Address byte 3 <0-255>

//     <i> Default: 0

#define IP3            14

 

//     <o>IP4: Address byte 4 <0-255>

//     <i> Default: 100

#define IP4            8

 

//   </h>

 

//   <o>Remote Port <1-65535>

//   <i> Do not set number of port too small,

//   <i> maybe it is already used.

//   <i> Default: 1001

#define PORT_NUM       1001

 

//   <o>Communication Protocol <0=> TCP <1=> UDP

//   <i> Selecet a protocol for sending data.

#define PROTOCOL       1

 

//   <o>LED Blinking speed <1-100>

//   <i> Blinking speed = SPEED * 100ms

//   <i> Default: 2

#define SPEED          2

 

 

//------------- <<< end of configuration section >>> -----------------------

 

 

#define BLINKLED 0x01  /* Command for blink the leds on board */

#define SENDLEN  2     /* Number of bytes to send */

#define TCP      1

 

 

BOOL tick;

U8 socket_tcp;

U8 Rem_IP[4] = {IP1,IP2,IP3,IP4};

 

 

static void init () {//初始化

  SysCtlClockSet (SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL |

                  SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ);

 

  SysCtlPeripheralEnable (SYSCTL_PERIPH_GPIOF);

  GPIOPadConfigSet (GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_STRENGTH_2MA,

                    GPIO_PIN_TYPE_STD);

  GPIODirModeSet (GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_DIR_MODE_OUT);

  SysTickPeriodSet(SysCtlClockGet() / 10);

  SysTickEnable();

}

 

 
 
 

回复

161

帖子

0

TA的资源

一粒金砂(高级)

4
 

static void timer_poll () {//RLTCPnet时钟

  if ((HWREG (NVIC_ST_CTRL) >> 16) & 1) {

    /* Timer tick every 100 ms */

    timer_tick ();

    tick = __TRUE;

  }

}

 

 

 

U16 tcp_callback (U8 soc, U8 evt, U8 *ptr, U16 par) {//TCP回调函数

  soc = soc;

  par = par;

  evt = evt;

  ptr = ptr;

  return (0);

}

 

 

 

void send_data (U8 p2val) {//发送数据

  U8 *sendbuf;

  static U16 p2=0;

  U8 *buf;

  if (socket_tcp != 0) {

    switch (tcp_get_state(socket_tcp)) {

      case TCP_STATE_FREE:

      case TCP_STATE_CLOSED:

        tcp_connect (socket_tcp, Rem_IP, PORT_NUM, 0);//连接服务器

        break;

      case TCP_STATE_CONNECT:

        if (tcp_check_send (socket_tcp) == __TRUE) {

          buf = tcp_get_buf(20);//分配buf

                     p2++;                          //模拟发送数据

                     if(p2>10000)

                            p2=0;

                     sprintf(buf,”%6d”,p2);

          tcp_send (socket_tcp, buf, strlen((char*)buf)+1); //发送数据,多发一字                                                                                                         //,便于存结束符。

        }

        break;

    }

  }

}

 

 

 

int main (void) {

  U8 p2val, cnt, lshf;

  U8 protocol;

 

  init ();

  init_TcpNet ();

  socket_tcp = tcp_get_socket (TCP_TYPE_CLIENT, 0, 10, tcp_callback);

 

 

  p2val = 1;

  cnt   = 0;

  lshf  = 1; 

  while (1) {

    timer_poll ();

    main_TcpNet ();

    if (tick == __TRUE) {

      if (++cnt == SPEED) {

        GPIOPinWrite (GPIO_PORTF_BASE, GPIO_PIN_0, p2val & 1);

        send_data(p2val);

        p2val = lshf ? (p2val << 1) : (p2val >> 1);

        if (p2val == 0x80) lshf = 0;

        if (p2val == 0x01) lshf = 1;

        cnt = 0;

      }

      tick = __FALSE;

    }

  }

}

 
 
 

回复

161

帖子

0

TA的资源

一粒金砂(高级)

5
 

数据的接收(PC 服务器端)

       MFC WINSOC编程,这里只是一个简单的DOS环境程序。

 

 

#include <WINSOCK2.H>//包含WinSock

#include <stdio.h>

 

void  main(void)

{

       WORD wVersionRequested;

       WSADATA wsaData;

       int err;

       int sockSrv;

       int  sockClient;

       SOCKADDR_IN addrSrv;

       SOCKADDR_IN addrClient;

       int len;

       char buf[20];

      

       wVersionRequested = MAKEWORD( 1, 1 );//WinSock版本

       err = WSAStartup( wVersionRequested, &wsaData );//提供WinSock环境

       if ( err != 0 ) {

              return;

       }

       if ( LOBYTE( wsaData.wVersion ) != 1 ||              HIBYTE( wsaData.wVersion ) != 1 )

              {

                     WSACleanup();

                     return;

              }

       sockSrv=socket(AF_INET,SOCK_STREAM,0);//创建一个WinSock

       addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

       addrSrv.sin_family=AF_INET;

       addrSrv.sin_port=htons(1001);

      

       bind(sockSrv,(SOCKADDR *)&addrSrv,sizeof(SOCKADDR));//绑定Winsock

      

       listen(sockSrv,2);//监听

 

 

       len=sizeof(SOCKADDR);

       while(1)

       {

              sockClient=accept(sockSrv,(SOCKADDR*)&addrClient,&len);//接受连接

              recv(sockClient,buf,20,0);//接收数据

              closesocket(sockClient);//关闭winsock

              printf(buf);

              printf("\r\n");

 

       }

       closesocket(sockSrv);

       WSACleanup();//清除WinSock环境

}

 

数据采集效果图

[ 本帖最后由 yuhua8688 于 2010-11-6 12:28 编辑 ]

3.jpg (57.14 KB, 下载次数: 5)

3.jpg
 
 
 

回复

209

帖子

1

TA的资源

一粒金砂(中级)

6
 
嗯,不错,但采集设备用做服务器端的比较多!!!
 
 
 

回复

42

帖子

0

TA的资源

一粒金砂(中级)

7
 
我只能真心的说句佩服
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表