物联网实验报告_第1页
物联网实验报告_第2页
物联网实验报告_第3页
物联网实验报告_第4页
物联网实验报告_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、气象信息与网络技术课程设计地面/探空电报码以文件形式存放,固定为8.3格式。地面电报码文件格式是:AAXXmmdd.Thh,探空电报码文件格式是:TTAAmmdd.Thh。其中AAXX表示地面报;TTAA表示探空报;mm表示月份,用2位数字0112;dd表示日,用2位数字0131;hh表示时次,用2位数字,地面有00、03、06、09、12、15、18、21共8个时次,探空有00、06、12、18共4个时次,都用世界时。地面/探空电报译码数据流图如图1所示。地面/探空电码文件电码译码系统各天气资料要素 图1 电码译码系统数据流图1、 地面/探空电报译码程序总流程图根据电码文件名是8.3格式,并

2、且与月日时次形成固定关系,因此可以采用输入年月日时次的数据来组合文件名。地面14位固定为“AAXX”,探空14位为“TTAA”,56位为2位数月份,78位为2位数日,910位为固定为“.T”,1112位为2位数时次。地面/探空电报译码程序流程图如图2所示,读取文件,找到指定台站的位置,并读取指定台站的电码到一个字符串数组中,然后传递给地面或探空处理程序继续处理,分解出天气各要素。最后显示结果。开始输入年月日世界时及台站号输入选择地面或高空文件存在?NY读取电码文件结束显示出错信息根据年月日世界时组成文件名指定台站号?文件结束?YNN地面/高空?Y地面处理程序高空处理程序高空地面 图2 电码译码

3、系统程序流程图一、 详细设计将已打开的电码文件数据分解,将第0-4个字符赋值给台站号,第6-10个字符赋值给iRiXhVV,iRiX指示码,本次不要译码,h最低的云底部高度(米),VV有效能见度(千米),第1216字符赋值给Nddff,N总云量,指观测时云遮蔽天空视野的总成数,dd 风向,以10度为单位编报。静风时,dd编报00。ff风速,以米/秒为单位进行编报。并将这些信息显示出来。给K赋初值为16,利用数组分别对后面的数据进行译码,按照图示所示顺序,每次译码后K加6,直到K的值大于数组长度N结束地面译码。地面各要素地面各要素入口k=18NY返回kn?第k字符为123456789气温露点本站

4、气压海平面气压气压趋势降水量天气现象发报时间云状k=k+6分解已读入的这一行字符串。第04字符台站号IIiii;第610字符iRiXhVV;第1216字符Nddff 图3译出地面各要素功能流程图将已打开的报文资料进行分解,第011字符不用,第1216字符赋值给台站号,并显示出来,给变量K赋初值为18,对气压进行译码,分别将数组第K和第K+1个字符与99,00,9220,15,10进行比较,若相等则对第K+2-K+4个字符进行相应处理,得到相应的本组气压位势米,然后依次对气温,露点温度差,风向,风速译码,将变量K+18赋值给K,进行下一组译码,直到Kn,结束本次探空译码。探空各要素地面各要素入口

5、k=18分解已读入的这一行字符串。第011字符不用;第1216字符台站号NY返回kn?第k:k+1字符为999200857050/4020/15/10地面925hPa1000 hPa850hPa700hPa500/400300/25030/25200/150/100分别译出气压,温度,温度露点差,风向风速。k=k+18 图4译出探空各要素功能流程图二、 编码设计利用计算机高级语言对程序流程图进行编程,采用C语言编程。 #include / 程序中要用到输入/输出函数 #include / 程序中要用到字符串处理函数,如strlen、strcpy等int str2int(char *ch,int

6、 k,int n); / 对字符串从k位置开始,长度为n的子字符串转/ 换为整型值。对于含有非数字字符,则返回-1 void dmdisp(char *ch); / 对字符串ch进行地面译码的功能函数 void updisp(char *ch); / 对字符串ch进行高空译码的功能函数 void main(void) / 主控程序入口 int year,month,day,hour; / 定义年year、月month、日day、时次hour int n,p; / 定义位置计数器n,临时变量p char station6,ch400; / 定义台站号station、存放电码字符串数组ch FIL

7、E *fp; char name30; / 定义读文件指针,文件名name int days=0,31,28,31,30,31,30,31,31,30,31,30,31; / 定义每月天数 printf(请输入年、月、日n);while(1) scanf(%d%d%d,&year,&month,&day); / 输入年月日用空格隔开 if (year % 4 = 0) days2=29; else days2=28; if (month=1 & month =1 & day=0 & hour =21 & hour % 3 =0) break;else printf (输入有错,请重新输入地面世

8、界时:021,间隔为3n); n=strlen(name); / 以下生成电码文件名,存放在name中 namen-2=0+hour/10; namen-1=0+hour%10; / 加入时次,2位数 namen-8=0+month/10; namen-7=0+month%10; / 加入月份,2位数 namen-6=0+day/10; namen-5=0+day%10; / 加入日期,2位数 printf(请输入台站号,南京为58238,北京为54511,上海为58362n); scanf(%s,station); / 台站号存放入station中 if (fp=fopen(name,rt)

9、 / 打开name电码文件,以便读入资料 fgets(ch,80,fp); / 跳空一行fgets(ch,80,fp); / 跳空一行if (p=1) fgets(ch,80,fp); / 如果处理地面,则跳空一行 while(!feof(fp) / 如未找到指定台站号,则一直到文件结束 fgets(ch,80,fp); / 读入一行,存放到ch字符串数组中 n=strlen(ch)-1; / 计算ch字符串实际读入个数 while (n300 & chn-1 != = & !feof(fp) / 一直到读完退出循环 chn= ; / 在ch字符串尾留出一个空格,预备后续存放 fgets(&c

10、hn+1,80,fp); / 继续读入一行,存放到ch字符串数组后面中 n=strlen(ch)-1; / 重新计算ch字符串实际读入个 if (!strncmp(&chp-1,station,5) / 是否找到指定台站号,未找到继续循环 if (p=1) dmdisp(ch); else updisp(ch); / 找到,则作相应的调度处理p=0; break; / 退出循环,准备结束程序运行 fclose(fp); / 关闭文件if (p!=0) printf(你指定的%s-台站未找到,请检查!n,station); else printf(你指定的%s-文件不存在,请检查!n ,name

11、); int str2int(char *ch,int k,int n) / 字符串转换成整数值函数 int i,m=0; / 循环变量i,中间变量m,用于存放结果整数值 for(i=0;in;i+) if (chk+i 9) break; / 字符串中含非数字,中途跳出 m=m*10+chk+i-0; / 字符串转换成整数值 if (i=n) return m; else return -1; / 返回结果值 void updisp(char *ch) / 对ch进行探空译码 int n,i,p,y; / n表示当前字符串位置,p表示转换出的整数值printf(=读出的探空电码=n); pu

12、ts(ch); / 显示读到的字符串电码内容 printf(=探空译码结果=n); n=(ch10= ) ? 11 : 12 ; / 调整好当前位置,如果TTAA后只有一个空格, / 则n取11;若有两个空格,则n取12 y=str2int(ch,n-6,2); / 取出月份给y保存,处理风速时要用到 printf(区站号:); / n已指出台站号位置 for(i=0;i5;i+) printf(%c,chn+i); / 输出台站号 printf(n); / 换行 while(1) / 死循环,中途必须用break跳出循环 n+=6 ; / 调整好当前位置,准备处理hhPPP p=str2in

13、t(ch,n+2,3); / pPPP电码,处理气压,位势米 if (chn=9 & chn+1=9) / 99:地面气压 /此处输出地面气压的位势米高度p,若p100,则加1000;否则p就是位势米。 printf(地面气压:); if(p500,则500-p;否则p就是位势米。 printf(1000hPa气压:); if(p500) p=500-p; printf(%d位势米,p); else if (chn=9 & chn+1=2) / 92:925hPa气压 /此处输出925hPa气压的位势米高度p,p就是位势米。 printf(925hPa气压:); printf(%d位势米,p)

14、; else if (chn=8 & chn+1=5) / 85:850hPa气压 /此处输出850hPa气压的位势米高度p,p加1000。 printf(850hPa气压:); printf(%d位势米,p+1000); else if (chn=7 & chn+1=0) / 70:700hPa气压 /此处输出700hPa气压的位势米高度p,若p300,加2000;否则加3000。 printf(700hPa气压:); if(p300)p=p+2000;p+=3000;printf(%d位势米,p); else if (chn=5| chn=4) & chn+1=0) / 500hPa或40

15、0hPa气压 /此处输出500hPa或400hPa气压的位势米高度p,p乘以10。 printf(%c00hPa气压:,chn); printf(%d位势米,p*10); else if (chn=3 & chn+1=0) | (chn=2 & chn+1=5) / 此处输出300hPa或250hPa气压的位势米高度p, / 若p500,则加1000后乘以10;否则p乘以10。 printf(%c%c00hPa气压:,chn,chn+1); if(p=0) /此处输出温度p,p为偶数表示零上,否则为零下 printf(,温度:); if(p%2=0)printf(%.1f,p/10.0); p

16、=str2int(ch,n+3,2); / pDD电码,处理露点差,单位,。 if (p=0) / 此处输出露点差p,若p50,则减去50;否则除以10 printf(,露点差:);if(p%2) p=-p;printf(%.1f,p/10.0); n+=6; / 调整好当前位置,准备处理dddff p=str2int(ch,n,3); / pddd电码,处理风向 if (p%5=0) / 此处输出风向p,必须是5的倍数,否则缺测 printf(,风向:%d度,p) ; p=str2int(ch,n+3,2); / pff电码,处理风速 if (p=0) / 此处输出风速p,注意风速的单位与y

17、有关? if (y50) printf(,风速:%.1f米/秒,p*0.5); else printf(,风速:%d米/秒,p); printf(n); void dmdisp(char *ch) / 对ch进行地面译码 int n,i,p; / n表示当前字符串位置,p表示转换出的整数值char cl105=无低,淡积,浓积,积雨,积层,层积,碎雨,碎雨,积,鬃积; char cm105=无中,高层,雨层,高积,荚状,层积,积雨,积层,积,散积; char chh105=无高,毛卷,密卷,伪卷,钩卷,卷,辐卷,卷层,层,卷积; char cw79=沙尘暴,雾,毛毛雨,非阵性雨,固体降水,阵雨

18、,雷暴;char vv116=7万,50,50,2百,5百,1千,2千,4千,1万,2万,5万;char nh106= 无云,1成,2-3成,4成,5成,6成,7-8成,9成,10成,有雾;char ww9615= 烟,霾,霾,霾,霾,霾,轻雾,片状浅雾,连续浅雾,闪电,高空有降水,远处有降水,附近有降水,雷暴无雨,飑,龙卷, 毛毛雨, 雨, 雪、米雪,雨夹雪, 雨夹雨淞,阵雨, 阵雪,冰雹,大雾,雨夹雷暴,较轻沙尘暴,轻沙尘暴,中沙尘暴,中强沙尘暴,强沙尘暴,增强沙尘暴,轻低吹雪,强低吹雪,轻高吹雪,强高吹雪,雾散开,散片雾,可辨雾变薄,不可辨轻雾变薄,可辨雾,不可辨雾,可辨雾变浓,不可辨雾

19、变浓,可辨雾淞,不可辨雾淞,间歇轻毛毛雨,连续轻毛毛雨,间歇中毛毛雨,连续中毛毛雨,间歇浓毛毛雨,连续浓毛毛雨,轻毛毛雨,浓毛毛雨,轻毛毛雨夹雨,浓毛毛雨夹雨,间歇小雨,连续小雨,间歇中雨,连续中雨,间歇大雨,连续大雨,小雨夹雨淞,大雨夹雨淞,小雨夹雪,中雨夹雪,间歇小雪,连续小雪,间歇中雪,连续中雪,间歇大雪,连续大雪,冰针,米雪,雪晶,冰粒,小阵雨,中阵雨,大阵雨,小阵性雨夹雪,大阵性雨夹雪,小阵雪,中或大阵雪,小阵性霰,中或大阵性霰,轻冰雹,中或强冰雹,雷暴后小雨,雷暴后中雨,雷暴后小雪,雷暴后大雪,小雷暴伴雨雪,小雷暴伴冰雹,大雷暴伴雨雪,雷暴及沙尘暴,大雷暴伴冰雹; printf(=

20、读出的地面电码=n); puts(ch); / 显示读到的字符串电码内容 printf(=地面译码结果=n); printf(区站号:) ; / 准备处理IIiii for(i=0;i5;i+) printf(%c,chi) ; / 输出台站号 printf(n) ; / 换行,准备处理iRiXhVV switch(ch8) / 处理云底高度h case 0 : printf(云高50米); break; case 1 : printf(云高50-100米); break; case 2 : printf(云高100-200米); break; case 3 : printf(云高200-30

21、0米); break; case 4 : printf(云高300-600米); break; case 5 : printf(云高600-1000米); break; case 6 : printf(云高1000-1500米); break; case 7 : printf(云高1500-2000米); break; case 8 : printf(云高2000-2500米); break; case 9 : if (ch12=0) printf(无云高);else printf(云高2500米); break; p=str2int(ch,9,2); / 处理能见度VV,pVV电码,单位米或

22、千米printf(,能见度为:); / 此处根据p输出能见度资料,注:p88 已处理if(p=0)printf(%s米, =1&p=51&p=30000);if(p=81&p88) printf(%s米,vvp-89); / 准备处理Nddff:总云量N、风向dd、风速ff if (ch12!= /) printf(,总云量:%s,nhch12- 0); / 处理总云量N p=str2int(ch,13,2); / 处理风向dd,要放大10倍,单位度 if (p=0) printf(,静风); if (p0) printf(,风向:%d度,p*10); p=str2int(ch,15,2);

23、/ 处理风速ff,单位米/秒 if (p0) printf(,风速:%d米/秒,p); printf(n); / 换行 n=18; / 调整好当前位置,准备处理温度、露点温度等资料 if (chn= 1) / 处理温度 1sTTT 单位0.1 已处理好 p=str2int(ch,n+2,3); / pTTT电码,即温度资料 if (p=0) /此处根据p输出温度资料,chn+1为零表示正,否则为负。 if (chn+1=1) p= -p; printf(气温:%.1f,p/10.0); n+=6; / 调整好当前位置 if (chn= 2) /处理露点温度 2sTdTdTd 单位0.1 p=s

24、tr2int(ch,n+2,3); / pTdTdTd电码,即露点温度资料 if (p=0) /此处根据p输出露点温度资料,chn+1为零表示正,否则为负。 printf(,露点温度:);if (chn+1=1) p=-p; printf(%.1f,p/10.0); n+=6; / 调整好当前位置 if (chn= 3) /处理本站气压 3P0P0P0P0,单位0.1hPa。 p=str2int(ch,n+1,4); / pP0P0P0P0电码,即本站气压资料 if (p=0) /此处根据p输出本站气压资料。 printf(,本站气压:);if (p=0) / 此处根据p输出海平面气压资料 printf(,海平面气压:);if (p=0) / 此处根据p输出过去三小时气压变化,单位0.1hPa。 printf

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论