📄 send.c
字号:
#include <stdio.h>#include <fcntl.h>#include <sys/socket.h>#include <unistd.h>#include <netinet/in.h>#include <stdlib.h>#include <string.h>#include <time.h>#include <arpa/inet.h>#define CLIENT_PORT 10000#define QUEUE_LENGTH 20#define MAXLEN 100#define MCLK 66000000
/*ADC寄存器地址设置*/
#define rADCCON (*(volatile unsigned *)0x1d40000) //控制器
#define rADCPSR (*(volatile unsigned *)0x1d40004) //比例因子
#define rADCDAT (*(volatile unsigned *)0x1d40008) //存结果数据
/*控制位定义**/
#define CON_AIN0 (0<<2)
#define CON_AIN1 (1<<2)
#define CON_AIN2 (2<<2)
#define CON_AIN3 (3<<2)
#define CON_AIN4 (4<<2)
#define CON_AIN5 (5<<2)
#define CON_AIN6 (6<<2)
#define CON_AIN7 (7<<2) //ad转换的通道选择寄存器
#define CON_READ_START (0<<1) //ad转换不允许通过读操作启动转换
#define CON_ENABLE_START (1<<0) //ad转换开始且启动后此位清零
#define CON_SLEEP (1<<5) //省电,休眠模式
#define CON_FLAG (1<<6) //转换结果标志位typedef struct{ float ad1; float ad2; float ad3; float ad4; float ad5; float ad6; float ad7; float ad8; char ip[16]; char id[21]; } ad; //全局变量定义区ad ad_num;float adc[8];//定义一个存放采集数据的数组 int delay_time=5;char serverIP[20]="192.168.0.2";char DEV_ID[21]="00001";char localip[16]="192.168.0.100";char net_mask[16]="255.255.255.0";char gw[16]="192.168.0.1";//char localserverip[16]="172.18.136.123";char localserverip[16]="192.168.0.3";
//启动数据采集
inline void start_adc(int chl)
{
int time_out; clock_t start,end; rADCCON = ((rADCCON | chl ) & 0xfffffffe);
//set_clock(20);
rADCCON = CON_ENABLE_START | chl;
/*避免第一次的标志位错误**/ srand(time(NULL)); start=clock(); time_out=1;
while((rADCCON & CON_ENABLE_START)&&time_out) { end=clock(); if((end-start)<10000) time_out=1 ; else time_out=0; }
}
//休眠模式函数定义
inline void stop_adc(void)
{
rADCCON=CON_SLEEP;
}//采集并处理数据函数
void ADC(float adc[8]){ int i,j,k; int time_out; clock_t start,end;
unsigned long adc_temp,adc_temp1; for(i=0;i<8;i++)
{ adc_temp=0; for(k=0;k<10;k++){
start_adc(i << 2); //im srand(time(NULL)); start=clock(); time_out=1;
while(!(rADCCON & CON_FLAG) && time_out){ end=clock(); if((end-start)<10000) time_out=1 ; else time_out=0; }
for(j=0;j<rADCPSR;j++); //避免第二个标志位有错
adc_temp1 = rADCDAT & 0x000003ff;
adc_temp += adc_temp1; //取出数据 }
adc[i] = adc_temp/10;
adc[i] = adc[i] * 2500;//转化成毫伏
adc[i] = adc[i] / 1024; } }void setnet(char *ip,char *netmask,char *gw){ char buf[100]; char buf1[100]; strcpy(buf,"ifconfig eth0 "); strcat(buf,ip); strcat(buf," "); strcat(buf,"netmask "); strcat(buf,netmask); strcpy(buf1,"route add default gw "); strcat(buf1,gw); system(buf); system(buf1); printf("ifconfig:%s\n",buf); printf("route:%s\n",buf1); printf("config success\n"); }//读取文件中的配置参数void readfile(){ FILE *fp; char *dir; char ch; char fpathname[MAXLEN]; int i,num; char buffer[MAXLEN]; dir="/mnt/"; strcpy(fpathname,dir); strcat(fpathname,"temp"); fp=fopen(fpathname,"r"); if(fp!=NULL){ printf("read config file\n"); memset(buffer,0,MAXLEN); for(num=0;num<7;num++){ i=0; ch=fgetc(fp); while(ch!='\n'){ buffer[i++]=ch; ch=fgetc(fp); } buffer[i]='\0'; switch(num){ case 0: memset(localip,0,sizeof(localip)); strcpy(localip,buffer); printf("localip: %s\n",localip); break; case 1: memset(net_mask,0,sizeof(net_mask)); strcpy(net_mask,buffer); printf("netmask: %s\n",net_mask); break; case 2: memset(gw,0,sizeof(gw)); strcpy(gw,buffer); printf("gateway: %s\n",gw); break; case 3: memset(serverIP,0,sizeof(serverIP)); strcpy(serverIP,buffer); printf("serverIP: %s\n",serverIP); break; case 4: delay_time=atoi(buffer); printf("delayTime: %d\n",delay_time); break; case 6: memset(DEV_ID,0,sizeof(DEV_ID)); strcpy(DEV_ID,buffer); printf("deviceID: %s\n",DEV_ID); break; case 5: memset(localserverip,0,sizeof(localserverip)); strcpy(localserverip,buffer); printf("localServerIP: %s\n",localserverip); break; }//switch end }//for end fclose(fp); }//if end else{ printf("default config\n"); }} void tcpsend(){ struct sockaddr_in sendaddr; int socksend_serv; int socksend_local; int newfd=-1; int flags; while(1) { memset(&ad_num,0,sizeof(ad)); ADC(adc);//取得采集过来的数据,一共八路 ad_num.ad1=adc[0]; ad_num.ad2=adc[1]; ad_num.ad3=adc[2]; ad_num.ad4=adc[3]; ad_num.ad5=adc[4]; ad_num.ad6=adc[5]; ad_num.ad7=adc[6]; ad_num.ad8=adc[7];/* ad_num.ad1=1142.0; ad_num.ad2=12.0; ad_num.ad3=12.0; ad_num.ad4=1200.0; ad_num.ad5=12.0; ad_num.ad6=12.0; ad_num.ad7=12.0; ad_num.ad8=12.0;*/ strcpy(ad_num.ip,localip); strcpy(ad_num.id,DEV_ID); sendaddr.sin_family=AF_INET; sendaddr.sin_port=htons(CLIENT_PORT); sendaddr.sin_addr.s_addr=inet_addr(serverIP); bzero(&(sendaddr.sin_zero),8); socksend_serv=socket(AF_INET,SOCK_STREAM,0); if((newfd=connect(socksend_serv,(struct sockaddr*)&sendaddr,sizeof(sendaddr)))<0){ perror("connect remote"); } else { printf("send remote: %s\n",serverIP); if((send(socksend_serv,(char*)&ad_num,sizeof(ad),0))==-1) perror("send remote"); close(newfd); } close(socksend_serv); sendaddr.sin_family=AF_INET; sendaddr.sin_port=htons(CLIENT_PORT); sendaddr.sin_addr.s_addr=inet_addr(localserverip); bzero(&(sendaddr.sin_zero),8); socksend_local=socket(AF_INET,SOCK_STREAM,0);
/*设置无阻塞模式*/
if((flags=fcntl(socksend_local,F_GETFL,0))<0){
perror("fcntl get socket attributes error");
}
flags |= O_NONBLOCK;
if((flags=fcntl(socksend_local,F_GETFL,0))<0){
perror("fcntl set socket attributes error");
} if((newfd=connect(socksend_local,(struct sockaddr*)&sendaddr,sizeof(sendaddr)))<0){ perror("connect local"); } else { printf("send local: %s\n",localserverip); if((send(socksend_local,(char*)&ad_num,sizeof(ad),0))==-1) perror("send local"); close(newfd); } close(socksend_local); sleep(delay_time); }//end while}//主函数,用于接收服务器发过来的数据以用来设置配置文件int main(int argc,char **argv){ rADCPSR=160; readfile(); setnet(localip,net_mask,gw); tcpsend(); return 0; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -