老 姚
/
meterRead
meter reader
Embed:
(wiki syntax)
Show/hide line numbers
main.cpp
00001 #include "mbed.h" 00002 #include "EthernetInterface.h" 00003 #include "http_request.h" 00004 #include "http_response.h" 00005 DigitalOut myled(PF_12); 00006 DigitalOut red(PF_14); 00007 DigitalOut dir(PG_15); 00008 RawSerial rs485(PE_1,PE_0,9600); 00009 #define GET_ADDRESS 0x13 00010 #define GET_DATA 0x11 00011 #define SERVER_PORT 8000 00012 #define SERVER_ADDR "192.168.1.10" 00013 static const char* mbedIp = "192.168.1.120"; //IP 00014 static const char* mbedMask = "255.255.255.0"; // Mask 00015 static const char* mbedGateway = "192.168.1.10"; //Gateway 00016 Thread recv; 00017 EthernetInterface eth; 00018 00019 void polling(char *address,uint8_t code,char *sbuf,int slen) 00020 { 00021 char buf[32]; 00022 int len,i,k; 00023 uint8_t checksum; 00024 checksum=0; 00025 i=0; 00026 buf[i++]=0xfe; 00027 buf[i++]=0xfe; 00028 buf[i++]=0xfe; 00029 buf[i++]=0xfe; 00030 buf[i++]=0x68;checksum=0x68; 00031 for (k=0;k<6;k++) 00032 { buf[i++]=address[k]; 00033 checksum=checksum+address[k]; 00034 }; 00035 buf[i++]=0x68;checksum=checksum+0x68; 00036 buf[i++]=code;checksum=checksum+code; 00037 buf[i++]=slen;checksum=checksum+slen; 00038 for (k=0;k<slen;k++) 00039 { 00040 buf[i++]=sbuf[k];checksum=checksum+sbuf[k]; 00041 } 00042 buf[i++]=checksum; 00043 buf[i++]=0x16; 00044 buf[i++]=0xfe; 00045 buf[i++]=0xfe; 00046 len=i; 00047 dir=1; 00048 for (i=0;i<len;i++) 00049 rs485.putc(buf[i]); 00050 // wait(0.03); 00051 dir=0; 00052 } 00053 void CmdParser(uint8_t code,char *rbuf,int len) 00054 { int i; 00055 char value[32]; 00056 double v; 00057 switch(code) 00058 { 00059 case 0x93:{ 00060 printf("meter Address="); 00061 for(i=0;i<6;i++) 00062 printf("%02x",rbuf[5-i]-0x33); 00063 printf("\n"); 00064 break; 00065 } 00066 case 0x91:{ 00067 // printf("meter readout"); 00068 for(i=0;i<4;i++) 00069 { //printf("%02x",rbuf[7-i]-0x33); 00070 value[i]=rbuf[7-i]-0x33; 00071 } 00072 //printf("\n"); 00073 v=((value[0]&0xf0)>>4)*100000; 00074 v=v+(value[0]&0x0f)*10000; 00075 v=v+((value[1]&0xf0)>>4)*1000; 00076 v=v+(value[1]&0x0f)*100; 00077 v=v+((value[2]&0xf0)>>4)*10; 00078 v=v+(value[2]&0x0f); 00079 v=v+((double)((value[3]&0xf0)>>4)/10); 00080 v=v+((double)(value[3]&0x0f)/100); 00081 sprintf(value,"%.2f",v); 00082 // printf(value,"%.2f\n",v); 00083 // uplaod to web server 00084 char body[32] ;//= "{\"value\":\"world\"}"; 00085 strcpy(body,"{\"value\":\""); 00086 strcat(body,value); 00087 strcat(body,"\"}"); 00088 HttpRequest* request = new HttpRequest(ð, HTTP_POST, "http://192.168.1.10:8000/readOut"); 00089 request->set_header("Content-Type", "application/json"); 00090 HttpResponse* response= request->send(body, strlen(body)); 00091 delete request ; 00092 break; 00093 } 00094 } 00095 } 00096 void receive() 00097 { uint8_t state,ch; 00098 int i; 00099 char rbuf[32]; 00100 char address[6]; 00101 uint8_t code,len; 00102 state=0; 00103 while(true) 00104 { 00105 switch(state) 00106 { 00107 case 0:{ 00108 ch=rs485.getc(); 00109 if (ch==0xfe) state=1; 00110 break; 00111 }; 00112 case 1:{ 00113 ch=rs485.getc(); 00114 if (ch==0x68) {state=2;i=0;} 00115 else if (ch!=0xfe) state=0; 00116 00117 break; 00118 } 00119 case 2:{ // read address 00120 ch=rs485.getc() ; 00121 address[i++]=ch; 00122 if (i==6) state=3; 00123 break; 00124 } 00125 case 3:{ 00126 ch=rs485.getc() ; 00127 if (ch==0x68) state=4;else state=0; 00128 break; 00129 } 00130 case 4:{ //code 00131 ch=rs485.getc() ; 00132 code =ch; 00133 state=5; 00134 break; 00135 } 00136 case 5:{ 00137 ch=rs485.getc() ; 00138 i=0;len=ch; 00139 state=6; 00140 break; 00141 } 00142 case 6:{ 00143 ch=rs485.getc() ; 00144 rbuf[i++]=ch; 00145 if (i==len) state=7; 00146 break; 00147 } 00148 case 7:{ 00149 ch=rs485.getc() ; 00150 state=8; 00151 break; 00152 } 00153 case 8:{ 00154 ch=rs485.getc() ; 00155 if (ch==0x16) { 00156 CmdParser(code,rbuf,len); 00157 00158 00159 } 00160 else 00161 printf("err\n"); 00162 state=0; 00163 break; 00164 } 00165 } 00166 } 00167 } 00168 int main() { 00169 00170 char address[6]; 00171 char sbuf[16]; 00172 bool flg; 00173 /*address[0]=0xaa; 00174 address[1]=0xaa; 00175 address[2]=0xaa; 00176 address[3]=0xaa; 00177 address[4]=0xaa; 00178 address[5]=0xaa;*/ 00179 eth.set_network(mbedIp,mbedMask,mbedGateway); 00180 eth.connect(); 00181 printf("\nMy device IP Address is %s\n", eth.get_ip_address()); 00182 printf("\nServer MAC Address is %s\n", eth.get_mac_address()); 00183 flg=true; 00184 dir=0; 00185 //rs485.set_format(8,UARTSerial::None,1); 00186 printf("read electricity meter demo\n"); 00187 recv.start(&receive); 00188 address[0]=0x00; 00189 address[1]=0x40; 00190 address[2]=0x08; 00191 address[3]=0x13; 00192 address[4]=0x00; 00193 address[5]=0x65; 00194 sbuf[0]=0x33; 00195 sbuf[1]=0x33; 00196 sbuf[2]=0x34; 00197 sbuf[3]=0x33; 00198 while(1) { 00199 wait(2); 00200 polling(address,GET_DATA,sbuf,4); 00201 // receive(); 00202 if (flg){flg=false;myled=1;} 00203 else {flg=true;myled=0;} 00204 } 00205 }
Generated on Tue Jul 12 2022 21:37:57 by 1.7.2