微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > DS80C400的Keil C语言编程

DS80C400的Keil C语言编程

时间:02-01 来源:互联网 点击:

SolarWinds为Windows (平台提供了一个免费的TFTP服务器,它被应用于该演示程序的开发中。在SolarWinds网站(www.solarwinds.net),跟随Downloads - Free Software菜单可找到TFTP服务器下载。安装以后,使用File菜单下的Configure选项来配置现有文件。确保程序使用你的TFTP服务器IP地址(TFTP_IP_MSP, TFTP_IP_2,TFTP_IP_3和TFTP_IP_LSB)。

简单的HTTP服务器
该应用中的HTTP服务器是RFC 2068所描述的HTTP服务器的一个简化版实现。在该版本下,只支持'GET'方法。输入头被忽略,只给出很少的输出头。

服务器套接字通过调用Berkley型套接字函数来创建,这样使得服务器套接字容易建立。以下代码说明了这个简单的HTTP服务器是如何创建、邦定并接受新连接的。

      struct sockaddr local;unsigned int socket_handle, new_socket_handle, temp;socket_handle = socket(0, SOCKET_TYPE_STREAM, 0);local.sin_port = 80;bind(socket_handle, local, sizeof(local));listen(socket_handle, 5);printf("Ready to accept HTTP connections...\r");// here is the main loop of the HTTP serverwhile (1){new_socket_handle = accept(socket_handle, address, sizeof(address));handleRequest(new_socket_handle);closesocket(new_socket_handle);}
请注意,接受了新的套接字后,这个简单的应用并不启动新的线程或进程来处理请求。而是在同一进程中处理该请求。任何非演示版的HTTP服务器都会在新的线程中处理收到的请求,这样就允许多个连接出现并被同时处理。请求处理完后,关闭套接字,等待另一个收到的连接。

handleRequest方法从收到的请求中解析出一个文件名,并确定该方法是'GET'。其它方法(甚至是'POST','HEAD'或'OPTIONS')均不被接受。两个文件名被作为特例处理。当请求文件为time.html时,服务器动态产生一个响应,其中包含来自timeserver的最新结果,以及自上一次查询时间服务器以来的秒数。当请求文件为stats.html时,将显示服务器的正常运行时间和请求次数统计结果。

如果找不到文件或发出的是无效的请求方法,HTTP服务器报告错误码。

SNTP客户端
第二个主要部分是Simple Network Time Protocol客户端,参见RFC 1361的描述。它是Network Time Protocol (RFC 1305)的一个版本。SNTP要求UDP从一个侦听端口123的服务器请求时戳。我们的timeserver使用以下代码周期性地与服务器time.nist.gov同步。请注意,在写这篇文章时,DNS检索还不被支持,因此服务器的IP地址须手动设置。DNS现已被添加到了C库网站,以下代码更新后可通过检索获得IP地址。

      socket_handle = socket(0, SOCKET_TYPE_DATAGRAM, 0);// set a timeout of about 2 secondsbuffer[0] = 0x0;buffer[1] = 0x0;buffer[2] = 0x8;buffer[3] = 0x0;setsockopt(socket_handle, 0, SO_TIMEOUT, buffer, 200);buffer[2] = 0;                            // reset since we used this in call to setsockoptbuffer[0] = 0x23;                         // No warning/NTP Ver 4/Clientaddress.sin_addr[12] = TIME_NIST_GOV_IP_MSB;address.sin_addr[13] = TIME_NIST_GOV_IP_2;address.sin_addr[14] = TIME_NIST_GOV_IP_3;address.sin_addr[15] = TIME_NIST_GOV_IP_LSB;address.sin_port = NTP_PORT;sendto(socket_handle, buffer, 48, 0, address, sizeof(struct sockaddr));recvfrom(socket_handle, buffer, 256, 0, address, sizeof(struct sockaddr));timeStamp = *(unsigned long*)(buffer[40]);timeStamp = timeStamp - NTP_UNIX_TIME_OFFSET;// now we have time since Jan 1 1970formatTimeString(timeStamp, "London", last_time_reading_1);last_reading_seconds = getTimeSeconds();closesocket(socket_handle);
首先生成一个数据报套接字,并给定一个约2秒的超时(0x800==2048ms)。这样可以确保在与我们选择的服务器通信失败时,不必无限期地等待下去。

下一行设定请求选项。关于这些位的描述参见RFC 1361第三节。值0x23要求闰秒时无需告警,要求采用NTP版本4,并声明模式为'Client'。当我们使用公共数据报函数sendto和recvfrom发出请求并收到回答后,时戳的秒部被赋给变量timeStamp,然后调整到参考时间1970年1月1日。formatTimeString函数将时戳转换为易读的字符串,如“In London it is 15:37:37 on March 31, 2003”。

getTimeSeconds函数以DS80C400内部时钟为基础确定上一次更新。由于该程序大约每60秒才更新

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top