Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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