F103 modbus TCP
Dependencies: BufferedSerial BufferedSoftSerial CRC16 Nucleo_F103RB_W5500HelloWorld MessageQueue WIZnet_Library Watchdog eeprom mbed-rtos mbed
Fork of Nucleo_F103RB_W5500HelloWorld by
main.cpp@3:ec57904a3e81, 2016-11-01 (annotated)
- Committer:
- dragyu
- Date:
- Tue Nov 01 14:30:40 2016 +0000
- Revision:
- 3:ec57904a3e81
- Parent:
- 2:2541ce0cc63e
modbus tcp
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
bangbh | 0:412f9c1172b7 | 1 | #include "mbed.h" |
bangbh | 0:412f9c1172b7 | 2 | #include "WIZnetInterface.h" |
dragyu | 2:2541ce0cc63e | 3 | #include <string> |
dragyu | 2:2541ce0cc63e | 4 | #include "Serial.h" |
dragyu | 2:2541ce0cc63e | 5 | #include "eeprom.h" |
dragyu | 2:2541ce0cc63e | 6 | #include "CRC16.h" |
dragyu | 2:2541ce0cc63e | 7 | #include "Watchdog.h" |
dragyu | 2:2541ce0cc63e | 8 | #include "rtos.h" |
dragyu | 2:2541ce0cc63e | 9 | //Serial mdb232(PA_9,PA_10); |
dragyu | 2:2541ce0cc63e | 10 | //Serial mdb485(PA_2,PA_3); |
dragyu | 2:2541ce0cc63e | 11 | Serial *pc;// |
dragyu | 2:2541ce0cc63e | 12 | DigitalOut pcSendRev(PB_0);//0 rev 1 send |
dragyu | 2:2541ce0cc63e | 13 | Watchdog wd; |
dragyu | 2:2541ce0cc63e | 14 | bool reset_soft = false;// 控制停止喂狗使设备复位 |
dragyu | 2:2541ce0cc63e | 15 | struct CONFIG{ |
dragyu | 2:2541ce0cc63e | 16 | char ipAddr[16]; |
dragyu | 2:2541ce0cc63e | 17 | char ipSubnet[16]; |
dragyu | 2:2541ce0cc63e | 18 | char ipGateway[16]; |
dragyu | 2:2541ce0cc63e | 19 | int16_t port; |
dragyu | 2:2541ce0cc63e | 20 | unsigned char MAC_Addr[6] ; |
dragyu | 2:2541ce0cc63e | 21 | |
dragyu | 2:2541ce0cc63e | 22 | int8_t RTUChoice; //1:RTU模式 0:ascii |
dragyu | 2:2541ce0cc63e | 23 | int8_t bits; //5-8bit |
dragyu | 2:2541ce0cc63e | 24 | SerialBase::Parity parity; // SerialBase::Odd , SerialBase::Even SerialBase::None 分别用int 1,2,3代表 |
dragyu | 2:2541ce0cc63e | 25 | int8_t stop_bits; //1-2bit |
dragyu | 2:2541ce0cc63e | 26 | int16_t baud; |
dragyu | 2:2541ce0cc63e | 27 | int16_t frameTimeOut; |
dragyu | 2:2541ce0cc63e | 28 | int16_t timeOut; |
dragyu | 2:2541ce0cc63e | 29 | int16_t RS ; //485 232 |
dragyu | 2:2541ce0cc63e | 30 | }Config_t = { //默认值 |
dragyu | 2:2541ce0cc63e | 31 | "192.168.31.3", |
dragyu | 2:2541ce0cc63e | 32 | "255.255.255.0", |
dragyu | 2:2541ce0cc63e | 33 | "192.168.31.1", |
dragyu | 2:2541ce0cc63e | 34 | (int16_t)502, //port |
dragyu | 2:2541ce0cc63e | 35 | {0x00,0x08,0xDC,0x12,0x34,0x56},//mac地址 |
dragyu | 2:2541ce0cc63e | 36 | 1, //choice RTU mode |
dragyu | 2:2541ce0cc63e | 37 | 8, //数据位8位 |
dragyu | 2:2541ce0cc63e | 38 | SerialBase::None, |
dragyu | 2:2541ce0cc63e | 39 | 1, //stop |
dragyu | 2:2541ce0cc63e | 40 | (int16_t)19200, //baud |
dragyu | 2:2541ce0cc63e | 41 | 7 , //帧超时7ms |
dragyu | 2:2541ce0cc63e | 42 | 1500 , //等待超时1500ms |
dragyu | 2:2541ce0cc63e | 43 | 485 |
dragyu | 2:2541ce0cc63e | 44 | }; |
dragyu | 2:2541ce0cc63e | 45 | CONFIG Config = Config_t;//备份一个配置信息。 |
dragyu | 2:2541ce0cc63e | 46 | static char buffer[256] ; //接收或者发送用的临时buffer |
dragyu | 2:2541ce0cc63e | 47 | uint16_t buffer_num = 6; |
dragyu | 2:2541ce0cc63e | 48 | struct TCP_BUFFER{ // |
dragyu | 2:2541ce0cc63e | 49 | char xid[2]; |
dragyu | 2:2541ce0cc63e | 50 | char pid[2]; |
dragyu | 2:2541ce0cc63e | 51 | int16_t length; |
dragyu | 2:2541ce0cc63e | 52 | char serialAddr; |
dragyu | 2:2541ce0cc63e | 53 | char data[255]; |
dragyu | 2:2541ce0cc63e | 54 | }tcp_buffer; |
dragyu | 2:2541ce0cc63e | 55 | |
dragyu | 2:2541ce0cc63e | 56 | struct SERIAL_BUFFER{ |
dragyu | 2:2541ce0cc63e | 57 | char serialAddr; //地址 |
dragyu | 2:2541ce0cc63e | 58 | char funCode; //功能码 |
dragyu | 2:2541ce0cc63e | 59 | char data[252]; |
dragyu | 2:2541ce0cc63e | 60 | char crc[2]; //低位前高位后 |
dragyu | 2:2541ce0cc63e | 61 | }serial_buffer; |
dragyu | 2:2541ce0cc63e | 62 | |
dragyu | 2:2541ce0cc63e | 63 | enum flagThread1{ |
dragyu | 2:2541ce0cc63e | 64 | waitThead1, |
dragyu | 2:2541ce0cc63e | 65 | connectedThead1, |
dragyu | 2:2541ce0cc63e | 66 | tcpRecvThead1, |
dragyu | 2:2541ce0cc63e | 67 | serialRecvThead1, |
dragyu | 2:2541ce0cc63e | 68 | tcpSendThead1 |
dragyu | 2:2541ce0cc63e | 69 | }flagThread1; //状态机标识 thread1 |
dragyu | 2:2541ce0cc63e | 70 | |
dragyu | 2:2541ce0cc63e | 71 | enum FlagThead2{ |
dragyu | 2:2541ce0cc63e | 72 | waitThead2, |
dragyu | 2:2541ce0cc63e | 73 | connectedThead2, |
dragyu | 2:2541ce0cc63e | 74 | handleDataThead2, |
dragyu | 2:2541ce0cc63e | 75 | getReguestThead2, |
dragyu | 2:2541ce0cc63e | 76 | postReguestThead2 |
dragyu | 2:2541ce0cc63e | 77 | }flagThread2; //状态机标识 thread2 |
dragyu | 2:2541ce0cc63e | 78 | char readline[200]; //解析提交的表单 读取一行数据 再存在这 |
dragyu | 2:2541ce0cc63e | 79 | SPI spi(PA_7, PA_6, PA_5); // mosi, miso, sclk |
dragyu | 2:2541ce0cc63e | 80 | WIZnetInterface ethernet(&spi, PB_6, PB_7);//scs(PB_6), nRESET(PB_7); // reset pin is dummy, don't affect any pin of WIZ550io |
dragyu | 2:2541ce0cc63e | 81 | EEPROM memory(I2C_SDA,I2C_SCL,0,EEPROM::T24C02); |
dragyu | 2:2541ce0cc63e | 82 | |
dragyu | 2:2541ce0cc63e | 83 | TCPSocketServer webserver; |
dragyu | 2:2541ce0cc63e | 84 | TCPSocketConnection webclient; |
dragyu | 2:2541ce0cc63e | 85 | TCPSocketServer server; |
dragyu | 2:2541ce0cc63e | 86 | TCPSocketConnection client; |
dragyu | 2:2541ce0cc63e | 87 | int rev_num;//tcp收到的直接数 |
dragyu | 2:2541ce0cc63e | 88 | |
dragyu | 2:2541ce0cc63e | 89 | /*****************************计算超时用到的函数及变量*************************************************/ |
dragyu | 2:2541ce0cc63e | 90 | bool flagT35 = false; //是否接受了串口数据标志 ture 接收到串口数据 |
dragyu | 2:2541ce0cc63e | 91 | Timer timeout; //1s 超时 |
dragyu | 2:2541ce0cc63e | 92 | Timer timeoutT35;//t3.5超时 |
dragyu | 2:2541ce0cc63e | 93 | void timeoutTest(); //串口中断服务程序 |
bangbh | 0:412f9c1172b7 | 94 | |
dragyu | 2:2541ce0cc63e | 95 | /*********************状态机处理函数*************************************/ |
dragyu | 2:2541ce0cc63e | 96 | |
dragyu | 2:2541ce0cc63e | 97 | void InitDefault(void); |
dragyu | 2:2541ce0cc63e | 98 | void InitEEprom(void); |
bangbh | 0:412f9c1172b7 | 99 | |
dragyu | 2:2541ce0cc63e | 100 | |
dragyu | 2:2541ce0cc63e | 101 | void TcpRecvThead1(void); |
dragyu | 2:2541ce0cc63e | 102 | void SerialRecvThead1(void); |
dragyu | 2:2541ce0cc63e | 103 | void TcpSendThead1(void); |
bangbh | 0:412f9c1172b7 | 104 | |
dragyu | 2:2541ce0cc63e | 105 | int webclientReadline(); |
dragyu | 2:2541ce0cc63e | 106 | int readSubmit( char *d,char a); |
dragyu | 2:2541ce0cc63e | 107 | void webServerHandleData (void const *args) |
dragyu | 2:2541ce0cc63e | 108 | { |
dragyu | 2:2541ce0cc63e | 109 | string sbuffer; |
dragyu | 2:2541ce0cc63e | 110 | char *cbuffer = new char[100]; |
dragyu | 2:2541ce0cc63e | 111 | int numRev; |
dragyu | 2:2541ce0cc63e | 112 | string sget = "GET"; |
dragyu | 2:2541ce0cc63e | 113 | string spost = "POST"; |
dragyu | 2:2541ce0cc63e | 114 | while(true) { |
dragyu | 2:2541ce0cc63e | 115 | Thread::signal_wait(0x2); |
dragyu | 2:2541ce0cc63e | 116 | if ( flagThread2 == handleDataThead2 ) { |
dragyu | 2:2541ce0cc63e | 117 | sbuffer.clear(); |
dragyu | 2:2541ce0cc63e | 118 | numRev= webclient.receive(cbuffer,3); |
dragyu | 2:2541ce0cc63e | 119 | if (numRev == 3) { |
dragyu | 2:2541ce0cc63e | 120 | sbuffer.append(cbuffer,3); |
dragyu | 2:2541ce0cc63e | 121 | if (sbuffer == sget) { |
dragyu | 2:2541ce0cc63e | 122 | printf("get\r\n"); |
dragyu | 2:2541ce0cc63e | 123 | flagThread2 = getReguestThead2; |
dragyu | 2:2541ce0cc63e | 124 | do { |
dragyu | 2:2541ce0cc63e | 125 | numRev = webclient.receive(cbuffer,100); |
dragyu | 2:2541ce0cc63e | 126 | } while(numRev == 100) ; |
dragyu | 2:2541ce0cc63e | 127 | }//清空rev buffer |
dragyu | 2:2541ce0cc63e | 128 | else { |
dragyu | 2:2541ce0cc63e | 129 | webclient.receive(cbuffer,1); |
dragyu | 2:2541ce0cc63e | 130 | sbuffer.append(cbuffer,1); |
dragyu | 2:2541ce0cc63e | 131 | if(sbuffer == spost) { |
dragyu | 2:2541ce0cc63e | 132 | printf("post\r\n"); |
dragyu | 2:2541ce0cc63e | 133 | flagThread2 = postReguestThead2; |
dragyu | 2:2541ce0cc63e | 134 | } else { |
dragyu | 2:2541ce0cc63e | 135 | printf("no\r\n"); |
dragyu | 2:2541ce0cc63e | 136 | flagThread2 = waitThead2; |
dragyu | 2:2541ce0cc63e | 137 | webclient.close(); |
dragyu | 2:2541ce0cc63e | 138 | } |
dragyu | 2:2541ce0cc63e | 139 | } |
dragyu | 2:2541ce0cc63e | 140 | } else |
dragyu | 2:2541ce0cc63e | 141 | flagThread2 = waitThead2; |
dragyu | 2:2541ce0cc63e | 142 | } |
dragyu | 2:2541ce0cc63e | 143 | } |
dragyu | 2:2541ce0cc63e | 144 | } |
dragyu | 2:2541ce0cc63e | 145 | |
dragyu | 2:2541ce0cc63e | 146 | void webServerGetReguest(void const *args) |
dragyu | 2:2541ce0cc63e | 147 | { |
dragyu | 2:2541ce0cc63e | 148 | string sbuffer; |
dragyu | 2:2541ce0cc63e | 149 | char str[10]; |
dragyu | 2:2541ce0cc63e | 150 | sbuffer.assign("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n"); |
dragyu | 2:2541ce0cc63e | 151 | sbuffer.append("Connection: close\r\n\r\n<!DOCTYPE HTML>\r\n"); |
dragyu | 2:2541ce0cc63e | 152 | sbuffer.append("<html>\r\n<form id = \"muForm\"action=\"/config\"method=\"post\">\r\n"); |
dragyu | 2:2541ce0cc63e | 153 | sbuffer.append("<table id=\"attfile\">\r\n<tr><td>NETWORK</td></tr>"); |
dragyu | 2:2541ce0cc63e | 154 | |
dragyu | 2:2541ce0cc63e | 155 | sbuffer.append("<tr><td>IP</td>\r\n<td><input type=\"text\"name=\"IP\"size=\"20\"value=\""); |
dragyu | 2:2541ce0cc63e | 156 | sbuffer.append(ethernet.getIPAddress()); |
dragyu | 2:2541ce0cc63e | 157 | sbuffer.append("\"></td><td> e.g. 192.168.1.55</td></tr>"); |
dragyu | 2:2541ce0cc63e | 158 | |
dragyu | 2:2541ce0cc63e | 159 | sbuffer.append("<tr><td>MASK</td><td><input type=\"text\" name=\"MASK\" size=\"20\"value=\""); |
dragyu | 2:2541ce0cc63e | 160 | sbuffer.append(Config.ipSubnet); |
dragyu | 2:2541ce0cc63e | 161 | sbuffer.append("\"></td><td> e.g. 255.255.255.0</td></tr>"); |
dragyu | 2:2541ce0cc63e | 162 | |
dragyu | 2:2541ce0cc63e | 163 | sbuffer.append("<tr><td>gateway</td> <td><input type=\"text\" name=\"gateway\" size=\"20\"value=\""); |
dragyu | 2:2541ce0cc63e | 164 | sbuffer.append(Config.ipGateway); |
dragyu | 2:2541ce0cc63e | 165 | sbuffer.append("\"></td><td> e.g. 192.168.1.1</td></tr>"); |
dragyu | 2:2541ce0cc63e | 166 | |
dragyu | 2:2541ce0cc63e | 167 | sbuffer.append("<tr><td>PORT</td> <td><input type=\"text\" name=\"PORT\" size=\"20\"value=\""); |
dragyu | 2:2541ce0cc63e | 168 | sprintf(str,"%d",Config.port); |
dragyu | 2:2541ce0cc63e | 169 | sbuffer.append(str); |
dragyu | 2:2541ce0cc63e | 170 | sbuffer.append("\"></td><td> e.g. 502</td></tr>"); |
dragyu | 2:2541ce0cc63e | 171 | |
dragyu | 2:2541ce0cc63e | 172 | sprintf(str,"%d",Config.baud); |
dragyu | 2:2541ce0cc63e | 173 | sbuffer.append("<tr><td>Serial</td> </tr><tr><td>baud</td> <td><input type=\"text\" name=\"baud\"size=\"20\"value=\""); |
dragyu | 2:2541ce0cc63e | 174 | sbuffer.append(str); |
dragyu | 2:2541ce0cc63e | 175 | sbuffer.append("\"></td><td> e.g. 115200 19200 9600</td> </tr>"); |
dragyu | 2:2541ce0cc63e | 176 | |
dragyu | 2:2541ce0cc63e | 177 | |
dragyu | 2:2541ce0cc63e | 178 | sbuffer.append("<tr><td>parity</td> <td><input type=\"text\"name=\"parity\"size=\"20\"value=\""); |
dragyu | 2:2541ce0cc63e | 179 | switch(Config.parity) { |
dragyu | 2:2541ce0cc63e | 180 | case SerialBase::Odd: |
dragyu | 2:2541ce0cc63e | 181 | sbuffer.append("odd"); |
dragyu | 2:2541ce0cc63e | 182 | break; |
dragyu | 2:2541ce0cc63e | 183 | case SerialBase::Even: |
dragyu | 2:2541ce0cc63e | 184 | sbuffer.append("even"); |
dragyu | 2:2541ce0cc63e | 185 | break; |
dragyu | 2:2541ce0cc63e | 186 | case SerialBase::None: |
dragyu | 2:2541ce0cc63e | 187 | sbuffer.append("none"); |
dragyu | 2:2541ce0cc63e | 188 | break; |
dragyu | 2:2541ce0cc63e | 189 | } |
dragyu | 2:2541ce0cc63e | 190 | |
dragyu | 2:2541ce0cc63e | 191 | sbuffer.append("\"></td><td> e.g. none even odd</td> </tr>"); |
dragyu | 2:2541ce0cc63e | 192 | |
dragyu | 2:2541ce0cc63e | 193 | sbuffer.append("<tr><td>bits</td> <td><input type=\"text\"name=\"bits\"size=\"20\"value=\""); |
dragyu | 2:2541ce0cc63e | 194 | int t; |
dragyu | 2:2541ce0cc63e | 195 | if(Config.parity != SerialBase::None) |
dragyu | 2:2541ce0cc63e | 196 | t = Config.bits -1; |
dragyu | 2:2541ce0cc63e | 197 | else |
dragyu | 2:2541ce0cc63e | 198 | t=Config.bits; |
dragyu | 2:2541ce0cc63e | 199 | sprintf(str,"%d",t); |
dragyu | 2:2541ce0cc63e | 200 | sbuffer.append(str); |
dragyu | 2:2541ce0cc63e | 201 | sbuffer.append("\"></td><td> e.g. 7-8</td> </tr>"); |
dragyu | 2:2541ce0cc63e | 202 | |
dragyu | 2:2541ce0cc63e | 203 | |
dragyu | 2:2541ce0cc63e | 204 | sbuffer.append("<tr><td>stop_bits</td> <td><input type=\"text\"name=\"stop_bits\"size=\"20\"value=\""); |
dragyu | 2:2541ce0cc63e | 205 | sprintf(str,"%d",Config.stop_bits); |
dragyu | 2:2541ce0cc63e | 206 | sbuffer.append(str); |
dragyu | 2:2541ce0cc63e | 207 | sbuffer.append("\"></td><td> e.g. 1-2</td> </tr>"); |
dragyu | 2:2541ce0cc63e | 208 | |
dragyu | 2:2541ce0cc63e | 209 | sbuffer.append("<tr><td>The frame timeout</td> <td><input type=\"text\"name=\"t35\"size=\"20\"value=\""); |
dragyu | 2:2541ce0cc63e | 210 | sprintf(str,"%d",Config.frameTimeOut); |
dragyu | 2:2541ce0cc63e | 211 | sbuffer.append(str); |
dragyu | 2:2541ce0cc63e | 212 | sbuffer.append("\"></td><td> ms</td> </tr>"); |
dragyu | 2:2541ce0cc63e | 213 | |
dragyu | 2:2541ce0cc63e | 214 | sbuffer.append("<tr><td>timeout</td> <td><input type=\"text\"name=\"timeout\"size=\"20\"value=\""); |
dragyu | 2:2541ce0cc63e | 215 | sprintf(str,"%d",Config.timeOut); |
dragyu | 2:2541ce0cc63e | 216 | sbuffer.append(str); |
dragyu | 2:2541ce0cc63e | 217 | sbuffer.append("\"></td><td> ms</td></tr>"); |
dragyu | 2:2541ce0cc63e | 218 | |
dragyu | 2:2541ce0cc63e | 219 | sbuffer.append("<tr><td>232 or 485</td> <td><input type=\"text\" name=\"232or485\" size=\"20\"value=\""); |
dragyu | 2:2541ce0cc63e | 220 | sprintf(str,"%d",Config.RS); |
dragyu | 2:2541ce0cc63e | 221 | sbuffer.append(str); |
dragyu | 2:2541ce0cc63e | 222 | sbuffer.append("\"></td><td> e.g. 232 485</td> </tr>"); |
dragyu | 2:2541ce0cc63e | 223 | |
dragyu | 2:2541ce0cc63e | 224 | sbuffer.append("</table><input type = \"button\"onclick= \"formSubmit()\" value=\"submit\">"); |
dragyu | 2:2541ce0cc63e | 225 | sbuffer.append("</form><script type=\"text/javascript\">"); |
bangbh | 0:412f9c1172b7 | 226 | |
dragyu | 2:2541ce0cc63e | 227 | sbuffer.append("function formSubmit()"); |
dragyu | 2:2541ce0cc63e | 228 | sbuffer.append("{document.getElementById(\"muForm\").submit()}"); |
dragyu | 2:2541ce0cc63e | 229 | sbuffer.append("</script></html>"); |
dragyu | 2:2541ce0cc63e | 230 | |
dragyu | 2:2541ce0cc63e | 231 | while(true) { |
dragyu | 2:2541ce0cc63e | 232 | Thread::signal_wait(0x3); |
dragyu | 2:2541ce0cc63e | 233 | if(flagThread2 == getReguestThead2 ) { |
dragyu | 2:2541ce0cc63e | 234 | webclient.send_all((char *)sbuffer.c_str(),sbuffer.length()); |
dragyu | 2:2541ce0cc63e | 235 | webclient.close(); |
dragyu | 2:2541ce0cc63e | 236 | flagThread2 = waitThead2; |
dragyu | 2:2541ce0cc63e | 237 | } |
dragyu | 2:2541ce0cc63e | 238 | } |
dragyu | 2:2541ce0cc63e | 239 | } |
dragyu | 2:2541ce0cc63e | 240 | |
dragyu | 2:2541ce0cc63e | 241 | |
dragyu | 2:2541ce0cc63e | 242 | void modbus_tcp_rs(void const *args) |
dragyu | 2:2541ce0cc63e | 243 | { |
dragyu | 2:2541ce0cc63e | 244 | while(true) { |
dragyu | 2:2541ce0cc63e | 245 | |
dragyu | 2:2541ce0cc63e | 246 | if(flagThread1 == connectedThead1) { |
dragyu | 2:2541ce0cc63e | 247 | |
dragyu | 2:2541ce0cc63e | 248 | |
dragyu | 2:2541ce0cc63e | 249 | |
dragyu | 2:2541ce0cc63e | 250 | pcSendRev = 1;//send |
dragyu | 2:2541ce0cc63e | 251 | rev_num = client.receive(buffer,6); |
dragyu | 2:2541ce0cc63e | 252 | |
dragyu | 2:2541ce0cc63e | 253 | if(rev_num == 6) { |
dragyu | 2:2541ce0cc63e | 254 | // client.send_all("connectedThead1",15); |
dragyu | 2:2541ce0cc63e | 255 | tcp_buffer.xid[0] = buffer[0]; |
dragyu | 2:2541ce0cc63e | 256 | tcp_buffer.xid[1] = buffer[1]; |
dragyu | 2:2541ce0cc63e | 257 | tcp_buffer.pid[0] = buffer[2]; |
dragyu | 2:2541ce0cc63e | 258 | tcp_buffer.pid[1] = buffer[3]; |
dragyu | 2:2541ce0cc63e | 259 | tcp_buffer.length = buffer[4]; |
dragyu | 2:2541ce0cc63e | 260 | tcp_buffer.length = tcp_buffer.length <<8; |
dragyu | 2:2541ce0cc63e | 261 | tcp_buffer.length = tcp_buffer.length | buffer[5]; |
dragyu | 2:2541ce0cc63e | 262 | rev_num = client.receive(buffer,tcp_buffer.length); |
dragyu | 2:2541ce0cc63e | 263 | tcp_buffer.serialAddr = buffer[0]; |
dragyu | 2:2541ce0cc63e | 264 | if (rev_num == tcp_buffer.length){ |
dragyu | 2:2541ce0cc63e | 265 | TcpRecvThead1(); //处理tcp接收到的数据包 串口发送出去 |
dragyu | 2:2541ce0cc63e | 266 | SerialRecvThead1();//等待接收串口数据 |
dragyu | 2:2541ce0cc63e | 267 | if(flagThread1 == tcpSendThead1){ |
dragyu | 2:2541ce0cc63e | 268 | tcp_buffer.length = buffer_num-8;//前面空了6个 后面2个crc去掉 |
dragyu | 2:2541ce0cc63e | 269 | buffer[0] = tcp_buffer.xid[0]; |
dragyu | 2:2541ce0cc63e | 270 | buffer[1] = tcp_buffer.xid[1]; |
dragyu | 2:2541ce0cc63e | 271 | buffer[2] = tcp_buffer.pid[0]; |
dragyu | 2:2541ce0cc63e | 272 | buffer[3] = tcp_buffer.pid[1]; |
dragyu | 2:2541ce0cc63e | 273 | buffer[4] = tcp_buffer.length>>8 & 0xff; |
dragyu | 2:2541ce0cc63e | 274 | buffer[5] = tcp_buffer.length & 0xff; |
dragyu | 2:2541ce0cc63e | 275 | client.send_all(buffer,buffer_num-2);//打包发送 mdb tcp |
dragyu | 2:2541ce0cc63e | 276 | flagThread1 = connectedThead1; |
dragyu | 2:2541ce0cc63e | 277 | } |
dragyu | 2:2541ce0cc63e | 278 | } |
dragyu | 2:2541ce0cc63e | 279 | } |
dragyu | 2:2541ce0cc63e | 280 | } |
dragyu | 2:2541ce0cc63e | 281 | Thread::wait(200); |
dragyu | 2:2541ce0cc63e | 282 | } |
dragyu | 2:2541ce0cc63e | 283 | } |
dragyu | 2:2541ce0cc63e | 284 | |
dragyu | 2:2541ce0cc63e | 285 | |
dragyu | 2:2541ce0cc63e | 286 | void webServerPost(void const *args) |
dragyu | 2:2541ce0cc63e | 287 | { string spost; |
dragyu | 2:2541ce0cc63e | 288 | char str[10]; |
dragyu | 2:2541ce0cc63e | 289 | spost.assign("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n"); |
dragyu | 2:2541ce0cc63e | 290 | spost.append("Connection: close\r\n\r\n<!DOCTYPE HTML>\r\n"); |
dragyu | 2:2541ce0cc63e | 291 | spost.append("<html>reset now!! Remember !!! IP:"); |
dragyu | 2:2541ce0cc63e | 292 | |
dragyu | 2:2541ce0cc63e | 293 | while(1) { |
dragyu | 2:2541ce0cc63e | 294 | Thread::signal_wait(0x05); |
dragyu | 2:2541ce0cc63e | 295 | if(flagThread2 == postReguestThead2) { |
dragyu | 2:2541ce0cc63e | 296 | //-----------读取表单参数-------------------------- |
dragyu | 2:2541ce0cc63e | 297 | |
dragyu | 2:2541ce0cc63e | 298 | while(webclientReadline());//返回 0 结束 后面的就是提交的表单内容 ip=192.168.1.3.... |
dragyu | 2:2541ce0cc63e | 299 | |
dragyu | 2:2541ce0cc63e | 300 | readSubmit(readline,'=');//"IP"之类的 |
dragyu | 2:2541ce0cc63e | 301 | |
dragyu | 2:2541ce0cc63e | 302 | readSubmit(Config.ipAddr,'&'); |
dragyu | 2:2541ce0cc63e | 303 | readSubmit(readline,'=');//"mask"之类的 |
dragyu | 2:2541ce0cc63e | 304 | readSubmit(Config.ipSubnet,'&'); |
dragyu | 2:2541ce0cc63e | 305 | readSubmit(readline,'=');//"gateway"之类的 |
dragyu | 2:2541ce0cc63e | 306 | readSubmit(Config.ipGateway,'&'); |
dragyu | 2:2541ce0cc63e | 307 | readSubmit(readline,'=');//"PORT" |
dragyu | 2:2541ce0cc63e | 308 | readSubmit(readline,'&'); |
dragyu | 2:2541ce0cc63e | 309 | Config.port= (int16_t)atoi(readline); |
dragyu | 2:2541ce0cc63e | 310 | readSubmit(readline,'=');//"baud" |
dragyu | 2:2541ce0cc63e | 311 | readSubmit(readline,'&'); |
dragyu | 2:2541ce0cc63e | 312 | Config.baud= (int16_t)atoi(readline); |
dragyu | 2:2541ce0cc63e | 313 | readSubmit(readline,'=');//"parity" |
dragyu | 2:2541ce0cc63e | 314 | readSubmit(readline,'&'); |
dragyu | 2:2541ce0cc63e | 315 | string s = readline; |
dragyu | 2:2541ce0cc63e | 316 | if(s == "none" ) |
dragyu | 2:2541ce0cc63e | 317 | Config.parity= SerialBase::None; |
dragyu | 2:2541ce0cc63e | 318 | if(s == "even" ) |
dragyu | 2:2541ce0cc63e | 319 | Config.parity= SerialBase::Even; |
dragyu | 2:2541ce0cc63e | 320 | if(s == "odd" ) |
dragyu | 2:2541ce0cc63e | 321 | Config.parity= SerialBase::Odd; |
dragyu | 2:2541ce0cc63e | 322 | readSubmit(readline,'=');//"bits" |
dragyu | 2:2541ce0cc63e | 323 | readSubmit(readline,'&'); |
dragyu | 2:2541ce0cc63e | 324 | Config.bits= (int8_t)atoi(readline); |
dragyu | 2:2541ce0cc63e | 325 | readSubmit(readline,'=');//"stop_bits" |
dragyu | 2:2541ce0cc63e | 326 | readSubmit(readline,'&'); |
dragyu | 2:2541ce0cc63e | 327 | Config.stop_bits= (int8_t)atoi(readline); |
dragyu | 2:2541ce0cc63e | 328 | readSubmit(readline,'=');//"T35" |
dragyu | 2:2541ce0cc63e | 329 | readSubmit(readline,'&'); |
dragyu | 2:2541ce0cc63e | 330 | Config.frameTimeOut= (int16_t)atoi(readline); |
dragyu | 2:2541ce0cc63e | 331 | readSubmit(readline,'=');//"timeout" |
dragyu | 2:2541ce0cc63e | 332 | readSubmit(readline,'&'); |
dragyu | 2:2541ce0cc63e | 333 | Config.timeOut= (int16_t)atoi(readline); |
dragyu | 2:2541ce0cc63e | 334 | readSubmit(readline,'=');//"232or485" |
dragyu | 2:2541ce0cc63e | 335 | readSubmit(readline,'&'); |
dragyu | 2:2541ce0cc63e | 336 | Config.RS= (int16_t)atoi(readline); |
dragyu | 2:2541ce0cc63e | 337 | |
bangbh | 0:412f9c1172b7 | 338 | |
dragyu | 2:2541ce0cc63e | 339 | //--------------------发送更新后的 页面 ip port----------------- |
dragyu | 2:2541ce0cc63e | 340 | spost.append(Config.ipAddr); |
dragyu | 2:2541ce0cc63e | 341 | spost.append(" PORT:"); |
dragyu | 2:2541ce0cc63e | 342 | sprintf(str,"%d",Config.port); |
dragyu | 2:2541ce0cc63e | 343 | spost.append(str); |
dragyu | 2:2541ce0cc63e | 344 | spost.append("</html>"); |
dragyu | 2:2541ce0cc63e | 345 | webclient.send_all((char *)spost.c_str(),spost.length()); |
dragyu | 2:2541ce0cc63e | 346 | webclient.close(); |
dragyu | 2:2541ce0cc63e | 347 | |
dragyu | 2:2541ce0cc63e | 348 | //---------- 存进eeprom 参数----------------------- |
dragyu | 2:2541ce0cc63e | 349 | |
dragyu | 2:2541ce0cc63e | 350 | memory.write(1,0xaa); |
dragyu | 2:2541ce0cc63e | 351 | wait_ms(2); |
dragyu | 2:2541ce0cc63e | 352 | memory.write(32,Config.ipAddr,8); |
dragyu | 2:2541ce0cc63e | 353 | |
dragyu | 2:2541ce0cc63e | 354 | wait_ms(2); |
dragyu | 2:2541ce0cc63e | 355 | memory.write(40,Config.ipAddr+8,8); |
dragyu | 2:2541ce0cc63e | 356 | wait_ms(2); |
dragyu | 2:2541ce0cc63e | 357 | memory.write(48,Config.ipSubnet,8); |
dragyu | 2:2541ce0cc63e | 358 | wait_ms(2); |
dragyu | 2:2541ce0cc63e | 359 | memory.write(56,Config.ipSubnet+8,8); |
dragyu | 2:2541ce0cc63e | 360 | wait_ms(2); |
dragyu | 2:2541ce0cc63e | 361 | memory.write(64,Config.ipGateway,8); |
dragyu | 2:2541ce0cc63e | 362 | wait_ms(2); |
dragyu | 2:2541ce0cc63e | 363 | memory.write(72,Config.ipGateway+8,8); |
dragyu | 2:2541ce0cc63e | 364 | wait_ms(2); |
dragyu | 2:2541ce0cc63e | 365 | memory.write(80,Config.MAC_Addr,6); |
dragyu | 2:2541ce0cc63e | 366 | wait_ms(2); |
dragyu | 2:2541ce0cc63e | 367 | memory.write(2,Config.port); |
dragyu | 2:2541ce0cc63e | 368 | wait_ms(2); |
dragyu | 2:2541ce0cc63e | 369 | |
dragyu | 2:2541ce0cc63e | 370 | memory.write(7,Config.bits); |
dragyu | 2:2541ce0cc63e | 371 | wait_ms(2); |
dragyu | 2:2541ce0cc63e | 372 | if(Config.parity == SerialBase::Odd) |
dragyu | 2:2541ce0cc63e | 373 | memory.write(4,int8_t(1)); |
dragyu | 2:2541ce0cc63e | 374 | if(Config.parity == SerialBase::Even) |
dragyu | 2:2541ce0cc63e | 375 | memory.write(4,int8_t(2)); |
dragyu | 2:2541ce0cc63e | 376 | if(Config.parity == SerialBase::None) |
dragyu | 2:2541ce0cc63e | 377 | memory.write(4,int8_t(3)); |
dragyu | 2:2541ce0cc63e | 378 | wait_ms(2); |
dragyu | 2:2541ce0cc63e | 379 | memory.write(8,Config.stop_bits); |
dragyu | 2:2541ce0cc63e | 380 | wait_ms(2); |
dragyu | 2:2541ce0cc63e | 381 | memory.write(5,Config.baud); |
dragyu | 2:2541ce0cc63e | 382 | wait_ms(2); |
dragyu | 2:2541ce0cc63e | 383 | memory.write(10,Config.RS); |
dragyu | 2:2541ce0cc63e | 384 | wait_ms(2); |
dragyu | 2:2541ce0cc63e | 385 | //memory.write(12,Config.frameTimeOut); |
dragyu | 2:2541ce0cc63e | 386 | // wait_ms(2); |
dragyu | 2:2541ce0cc63e | 387 | memory.write(14,Config.timeOut); |
dragyu | 2:2541ce0cc63e | 388 | flagThread2 = waitThead2; |
dragyu | 2:2541ce0cc63e | 389 | reset_soft = true; //复位 |
dragyu | 2:2541ce0cc63e | 390 | |
dragyu | 2:2541ce0cc63e | 391 | |
dragyu | 2:2541ce0cc63e | 392 | } |
dragyu | 2:2541ce0cc63e | 393 | } |
dragyu | 2:2541ce0cc63e | 394 | } |
dragyu | 2:2541ce0cc63e | 395 | |
dragyu | 2:2541ce0cc63e | 396 | //----------------- 以特殊字符结尾的字符串----------- |
dragyu | 2:2541ce0cc63e | 397 | int readSubmit(char *d,char a) |
dragyu | 2:2541ce0cc63e | 398 | { |
dragyu | 2:2541ce0cc63e | 399 | int num = 0; |
dragyu | 2:2541ce0cc63e | 400 | while(1) { |
dragyu | 2:2541ce0cc63e | 401 | //截取 等号 & 前的字符串 |
dragyu | 2:2541ce0cc63e | 402 | |
dragyu | 2:2541ce0cc63e | 403 | if(-1 == webclient.receive(&d[num],1)) { |
dragyu | 2:2541ce0cc63e | 404 | d[num] = '\0'; |
dragyu | 2:2541ce0cc63e | 405 | return num; |
dragyu | 2:2541ce0cc63e | 406 | } |
dragyu | 2:2541ce0cc63e | 407 | if(d[num] != a) |
dragyu | 2:2541ce0cc63e | 408 | num++; |
dragyu | 2:2541ce0cc63e | 409 | else { |
dragyu | 2:2541ce0cc63e | 410 | d[num] = '\0'; |
dragyu | 2:2541ce0cc63e | 411 | return num; |
dragyu | 2:2541ce0cc63e | 412 | } |
dragyu | 2:2541ce0cc63e | 413 | |
dragyu | 2:2541ce0cc63e | 414 | } |
dragyu | 2:2541ce0cc63e | 415 | } |
dragyu | 2:2541ce0cc63e | 416 | |
dragyu | 2:2541ce0cc63e | 417 | |
dragyu | 2:2541ce0cc63e | 418 | |
dragyu | 2:2541ce0cc63e | 419 | |
dragyu | 2:2541ce0cc63e | 420 | |
dragyu | 2:2541ce0cc63e | 421 | |
dragyu | 2:2541ce0cc63e | 422 | |
dragyu | 2:2541ce0cc63e | 423 | |
dragyu | 2:2541ce0cc63e | 424 | //----------返回一行的字节数-------------- |
dragyu | 2:2541ce0cc63e | 425 | int webclientReadline() |
dragyu | 2:2541ce0cc63e | 426 | { |
dragyu | 2:2541ce0cc63e | 427 | int num=0; |
dragyu | 2:2541ce0cc63e | 428 | while(1) { |
dragyu | 2:2541ce0cc63e | 429 | if( -1 == webclient.receive(&readline[num],1)) |
dragyu | 2:2541ce0cc63e | 430 | return -1; |
dragyu | 2:2541ce0cc63e | 431 | if (readline[num] != '\r') |
dragyu | 2:2541ce0cc63e | 432 | num++; |
dragyu | 2:2541ce0cc63e | 433 | else { |
dragyu | 2:2541ce0cc63e | 434 | if(-1 == webclient.receive(&readline[num],1)) |
dragyu | 2:2541ce0cc63e | 435 | return -1; |
dragyu | 2:2541ce0cc63e | 436 | if (readline[num] == '\n') ; |
dragyu | 2:2541ce0cc63e | 437 | return num; |
dragyu | 2:2541ce0cc63e | 438 | } |
dragyu | 2:2541ce0cc63e | 439 | } |
dragyu | 2:2541ce0cc63e | 440 | } |
dragyu | 2:2541ce0cc63e | 441 | |
dragyu | 2:2541ce0cc63e | 442 | |
dragyu | 2:2541ce0cc63e | 443 | |
dragyu | 2:2541ce0cc63e | 444 | |
dragyu | 2:2541ce0cc63e | 445 | //--------------喂狗----------------------- |
dragyu | 2:2541ce0cc63e | 446 | |
dragyu | 2:2541ce0cc63e | 447 | void wd_server(void const *args) { |
dragyu | 2:2541ce0cc63e | 448 | while(true){ |
dragyu | 2:2541ce0cc63e | 449 | if (!reset_soft) |
dragyu | 2:2541ce0cc63e | 450 | wd.Service(); |
dragyu | 2:2541ce0cc63e | 451 | Thread::wait(2000); |
dragyu | 2:2541ce0cc63e | 452 | } |
dragyu | 2:2541ce0cc63e | 453 | } |
dragyu | 2:2541ce0cc63e | 454 | |
bangbh | 0:412f9c1172b7 | 455 | |
bangbh | 0:412f9c1172b7 | 456 | int main() { |
dragyu | 2:2541ce0cc63e | 457 | int16_t t232or485 =0; |
dragyu | 2:2541ce0cc63e | 458 | memory.read(10,t232or485); |
dragyu | 2:2541ce0cc63e | 459 | wait_ms(1); |
bangbh | 0:412f9c1172b7 | 460 | |
dragyu | 2:2541ce0cc63e | 461 | if ((uint16_t)t232or485 == (uint16_t)232) |
dragyu | 2:2541ce0cc63e | 462 | pc = new Serial(PA_9,PA_10);//232 |
dragyu | 2:2541ce0cc63e | 463 | else |
dragyu | 2:2541ce0cc63e | 464 | pc = new Serial(PA_2,PA_3); //485 |
dragyu | 2:2541ce0cc63e | 465 | |
dragyu | 2:2541ce0cc63e | 466 | pcSendRev = 1;//send |
dragyu | 2:2541ce0cc63e | 467 | if(wd.WatchdogCausedReset()) |
dragyu | 2:2541ce0cc63e | 468 | printf("Watchdog caused reset.\r\n"); |
dragyu | 2:2541ce0cc63e | 469 | int8_t initChoice; |
dragyu | 2:2541ce0cc63e | 470 | memory.read(1,initChoice); //查看一下eeprom是否初始化 |
dragyu | 2:2541ce0cc63e | 471 | wait_ms(1); |
dragyu | 2:2541ce0cc63e | 472 | printf("%d",t232or485); |
dragyu | 2:2541ce0cc63e | 473 | printf("int:%c\r\n",initChoice); |
dragyu | 2:2541ce0cc63e | 474 | if( 0xAA == (uint8_t)initChoice )//已经初始化 |
dragyu | 2:2541ce0cc63e | 475 | {printf("aa\r\n"); |
dragyu | 2:2541ce0cc63e | 476 | InitEEprom();} |
dragyu | 2:2541ce0cc63e | 477 | else |
dragyu | 2:2541ce0cc63e | 478 | InitDefault(); |
dragyu | 2:2541ce0cc63e | 479 | |
dragyu | 2:2541ce0cc63e | 480 | //------------listen 502 80 ----------- |
dragyu | 2:2541ce0cc63e | 481 | |
dragyu | 2:2541ce0cc63e | 482 | server.bind(Config.port); //502 |
dragyu | 2:2541ce0cc63e | 483 | server.listen(); |
dragyu | 2:2541ce0cc63e | 484 | server.set_blocking(false, 0); |
dragyu | 2:2541ce0cc63e | 485 | webserver.bind(80); |
dragyu | 2:2541ce0cc63e | 486 | webserver.listen(); |
dragyu | 2:2541ce0cc63e | 487 | webserver.set_blocking(false, 0); |
dragyu | 2:2541ce0cc63e | 488 | client.set_blocking(false, 0); // Timeout=0. |
dragyu | 2:2541ce0cc63e | 489 | webclient.set_blocking(false, 0); |
dragyu | 2:2541ce0cc63e | 490 | flagThread1 = waitThead1; //状态机 初状态 |
dragyu | 2:2541ce0cc63e | 491 | flagThread2 = waitThead2; |
dragyu | 2:2541ce0cc63e | 492 | wd.Configure(4); // sets the timeout interval 大约6.1s |
dragyu | 2:2541ce0cc63e | 493 | //Thread thread1(wd_server) ; |
dragyu | 2:2541ce0cc63e | 494 | |
dragyu | 2:2541ce0cc63e | 495 | //---------------thread 开启 ----------------- |
dragyu | 2:2541ce0cc63e | 496 | Thread thread2(webServerHandleData,(void *)"2",osPriorityHigh ); |
dragyu | 2:2541ce0cc63e | 497 | Thread thread3(webServerGetReguest,(void *)"3",osPriorityHigh ); |
dragyu | 2:2541ce0cc63e | 498 | Thread thread4(modbus_tcp_rs,(void *)"4",osPriorityAboveNormal); |
dragyu | 2:2541ce0cc63e | 499 | Thread thread5(webServerPost,(void *)"5",osPriorityRealtime ); |
bangbh | 0:412f9c1172b7 | 500 | |
dragyu | 2:2541ce0cc63e | 501 | //-----------对线程管理----------socket accept----- |
dragyu | 2:2541ce0cc63e | 502 | while(1) { |
dragyu | 2:2541ce0cc63e | 503 | if (client.is_fin_received()) { |
dragyu | 2:2541ce0cc63e | 504 | client.close(); |
dragyu | 2:2541ce0cc63e | 505 | flagThread1 = waitThead1; |
dragyu | 2:2541ce0cc63e | 506 | } |
dragyu | 2:2541ce0cc63e | 507 | if(flagThread1 == waitThead1) { |
dragyu | 2:2541ce0cc63e | 508 | server.accept(client); |
dragyu | 2:2541ce0cc63e | 509 | if((client.is_connected() == true) ) { |
dragyu | 2:2541ce0cc63e | 510 | flagThread1 = connectedThead1; |
dragyu | 2:2541ce0cc63e | 511 | } |
dragyu | 2:2541ce0cc63e | 512 | } |
dragyu | 2:2541ce0cc63e | 513 | if (!reset_soft) |
dragyu | 2:2541ce0cc63e | 514 | wd.Service(); |
dragyu | 2:2541ce0cc63e | 515 | Thread::wait(50); |
dragyu | 2:2541ce0cc63e | 516 | if(webclient.is_fin_received()) { |
dragyu | 2:2541ce0cc63e | 517 | webclient.close(); |
dragyu | 2:2541ce0cc63e | 518 | flagThread2 = waitThead2; |
dragyu | 2:2541ce0cc63e | 519 | } |
dragyu | 2:2541ce0cc63e | 520 | |
dragyu | 2:2541ce0cc63e | 521 | if(flagThread2 == waitThead2) { |
dragyu | 2:2541ce0cc63e | 522 | webserver.accept(webclient); |
dragyu | 2:2541ce0cc63e | 523 | if((webclient.is_connected() == true) ) { |
dragyu | 2:2541ce0cc63e | 524 | flagThread2 = handleDataThead2; |
dragyu | 2:2541ce0cc63e | 525 | thread2.signal_set(0x2); //启动线程2 给他一个signal |
dragyu | 2:2541ce0cc63e | 526 | } |
dragyu | 2:2541ce0cc63e | 527 | } |
dragyu | 2:2541ce0cc63e | 528 | |
dragyu | 2:2541ce0cc63e | 529 | if (flagThread2 == getReguestThead2) |
dragyu | 2:2541ce0cc63e | 530 | thread3.signal_set(0x3); //启动线程3 给他一个signal |
dragyu | 2:2541ce0cc63e | 531 | if(flagThread2 == postReguestThead2) |
dragyu | 2:2541ce0cc63e | 532 | thread5.signal_set(0x5); |
dragyu | 2:2541ce0cc63e | 533 | if (!reset_soft) |
dragyu | 2:2541ce0cc63e | 534 | wd.Service(); |
dragyu | 2:2541ce0cc63e | 535 | Thread::wait(50); |
dragyu | 2:2541ce0cc63e | 536 | |
dragyu | 2:2541ce0cc63e | 537 | |
dragyu | 2:2541ce0cc63e | 538 | |
dragyu | 2:2541ce0cc63e | 539 | } |
dragyu | 2:2541ce0cc63e | 540 | } |
dragyu | 2:2541ce0cc63e | 541 | |
dragyu | 2:2541ce0cc63e | 542 | void InitDefault(void) |
dragyu | 2:2541ce0cc63e | 543 | { pc->format(Config.bits,Config.parity,Config.stop_bits); |
dragyu | 2:2541ce0cc63e | 544 | pc->baud(Config.baud); |
dragyu | 2:2541ce0cc63e | 545 | int ret = ethernet.init(Config.MAC_Addr,Config.ipAddr,Config.ipSubnet,Config.ipGateway); |
dragyu | 2:2541ce0cc63e | 546 | if (!ret) { |
dragyu | 2:2541ce0cc63e | 547 | printf("Initialized, MAC: %s\r\n", ethernet.getMACAddress()); |
dragyu | 2:2541ce0cc63e | 548 | ret = ethernet.connect(); |
bangbh | 0:412f9c1172b7 | 549 | if (!ret) { |
dragyu | 2:2541ce0cc63e | 550 | printf("IP: %s, MASK: %s, GW: %s\r\n", |
dragyu | 2:2541ce0cc63e | 551 | ethernet.getIPAddress(), ethernet.getNetworkMask(), ethernet.getGateway()); |
bangbh | 0:412f9c1172b7 | 552 | } else { |
dragyu | 2:2541ce0cc63e | 553 | printf("Error ethernet.connect() - ret = %d\r\n", ret); |
bangbh | 0:412f9c1172b7 | 554 | exit(0); |
bangbh | 0:412f9c1172b7 | 555 | } |
bangbh | 0:412f9c1172b7 | 556 | } else { |
dragyu | 2:2541ce0cc63e | 557 | printf("Error ethernet.init() - ret = %d\r\n", ret); |
bangbh | 0:412f9c1172b7 | 558 | exit(0); |
bangbh | 0:412f9c1172b7 | 559 | } |
dragyu | 2:2541ce0cc63e | 560 | |
dragyu | 2:2541ce0cc63e | 561 | pc->attach(&timeoutTest); |
dragyu | 2:2541ce0cc63e | 562 | } |
dragyu | 2:2541ce0cc63e | 563 | |
dragyu | 2:2541ce0cc63e | 564 | |
dragyu | 2:2541ce0cc63e | 565 | void InitEEprom(void) |
dragyu | 2:2541ce0cc63e | 566 | { |
dragyu | 2:2541ce0cc63e | 567 | |
dragyu | 2:2541ce0cc63e | 568 | int8_t t; |
dragyu | 2:2541ce0cc63e | 569 | memory.read(32,Config.ipAddr,16); |
dragyu | 2:2541ce0cc63e | 570 | wait_ms(2); |
dragyu | 2:2541ce0cc63e | 571 | memory.read(48,Config.ipSubnet,16); |
dragyu | 2:2541ce0cc63e | 572 | wait_ms(2); |
dragyu | 2:2541ce0cc63e | 573 | memory.read(64,Config.ipGateway,16); |
dragyu | 2:2541ce0cc63e | 574 | wait_ms(2); |
dragyu | 2:2541ce0cc63e | 575 | memory.read(80,Config.MAC_Addr,6); |
dragyu | 2:2541ce0cc63e | 576 | wait_ms(2); |
dragyu | 2:2541ce0cc63e | 577 | memory.read(2,Config.port); |
dragyu | 2:2541ce0cc63e | 578 | wait_ms(2); |
dragyu | 2:2541ce0cc63e | 579 | memory.read(7,Config.bits); |
dragyu | 2:2541ce0cc63e | 580 | wait_ms(2); |
dragyu | 2:2541ce0cc63e | 581 | memory.read(4,t); |
dragyu | 2:2541ce0cc63e | 582 | if( t==1 ) |
dragyu | 2:2541ce0cc63e | 583 | Config.parity = SerialBase::Odd; |
dragyu | 2:2541ce0cc63e | 584 | if( t==2 ) |
dragyu | 2:2541ce0cc63e | 585 | Config.parity = SerialBase::Even; |
dragyu | 2:2541ce0cc63e | 586 | if(t == 3) |
dragyu | 2:2541ce0cc63e | 587 | Config.parity = SerialBase::None; |
dragyu | 2:2541ce0cc63e | 588 | wait_ms(2); |
dragyu | 2:2541ce0cc63e | 589 | memory.read(8,Config.stop_bits); |
dragyu | 2:2541ce0cc63e | 590 | wait_ms(2); |
dragyu | 2:2541ce0cc63e | 591 | memory.read(5,Config.baud); |
dragyu | 2:2541ce0cc63e | 592 | wait_ms(2); |
dragyu | 2:2541ce0cc63e | 593 | memory.read(10,Config.RS); |
dragyu | 2:2541ce0cc63e | 594 | wait_ms(2); |
dragyu | 2:2541ce0cc63e | 595 | // memory.read(12,Config.frameTimeOut); |
dragyu | 2:2541ce0cc63e | 596 | // wait_ms(2); |
dragyu | 2:2541ce0cc63e | 597 | memory.read(14,Config.timeOut); |
dragyu | 2:2541ce0cc63e | 598 | wait_ms(2); |
dragyu | 2:2541ce0cc63e | 599 | InitDefault(); |
dragyu | 2:2541ce0cc63e | 600 | } |
dragyu | 2:2541ce0cc63e | 601 | |
dragyu | 2:2541ce0cc63e | 602 | |
dragyu | 2:2541ce0cc63e | 603 | |
dragyu | 2:2541ce0cc63e | 604 | void TcpRecvThead1(void) |
dragyu | 2:2541ce0cc63e | 605 | { |
dragyu | 2:2541ce0cc63e | 606 | static CRC16 crc16; |
dragyu | 2:2541ce0cc63e | 607 | int16_t crc; |
dragyu | 2:2541ce0cc63e | 608 | crc = crc16.calculateCRC16(buffer,tcp_buffer.length); |
dragyu | 2:2541ce0cc63e | 609 | buffer[tcp_buffer.length+1] = crc & 0xff; |
dragyu | 2:2541ce0cc63e | 610 | buffer[tcp_buffer.length] = (crc >> 8) & 0xff; |
dragyu | 2:2541ce0cc63e | 611 | |
dragyu | 2:2541ce0cc63e | 612 | for (crc =0 ; crc<tcp_buffer.length+2;crc++) |
dragyu | 2:2541ce0cc63e | 613 | pc->putc(buffer[crc]); |
dragyu | 2:2541ce0cc63e | 614 | |
dragyu | 2:2541ce0cc63e | 615 | |
dragyu | 2:2541ce0cc63e | 616 | |
dragyu | 2:2541ce0cc63e | 617 | flagThread1 = serialRecvThead1; |
dragyu | 2:2541ce0cc63e | 618 | buffer_num = 6; |
dragyu | 2:2541ce0cc63e | 619 | timeout.start(); //开启1s 超时 |
dragyu | 2:2541ce0cc63e | 620 | |
dragyu | 2:2541ce0cc63e | 621 | timeoutT35.start(); |
dragyu | 2:2541ce0cc63e | 622 | wait_ms(3); |
dragyu | 2:2541ce0cc63e | 623 | } |
dragyu | 2:2541ce0cc63e | 624 | |
dragyu | 2:2541ce0cc63e | 625 | void SerialRecvThead1(void) |
dragyu | 2:2541ce0cc63e | 626 | { |
dragyu | 2:2541ce0cc63e | 627 | static int j = 0; |
dragyu | 2:2541ce0cc63e | 628 | //char t; |
dragyu | 2:2541ce0cc63e | 629 | static CRC16 crc16; |
dragyu | 2:2541ce0cc63e | 630 | int16_t crc; |
dragyu | 2:2541ce0cc63e | 631 | pcSendRev = 0;//Rev |
dragyu | 2:2541ce0cc63e | 632 | while(flagThread1 == serialRecvThead1) { |
dragyu | 2:2541ce0cc63e | 633 | if( Config.timeOut < timeout.read_ms() ) { |
dragyu | 2:2541ce0cc63e | 634 | pcSendRev = 1;//Send |
dragyu | 2:2541ce0cc63e | 635 | timeout.reset(); |
dragyu | 2:2541ce0cc63e | 636 | timeout.stop(); |
dragyu | 2:2541ce0cc63e | 637 | timeoutT35.reset(); |
dragyu | 2:2541ce0cc63e | 638 | timeoutT35.stop(); |
dragyu | 2:2541ce0cc63e | 639 | flagThread1 = connectedThead1; |
dragyu | 2:2541ce0cc63e | 640 | /* buffer[7] = buffer[1]|0x80; //存的功能码 上一步 |
dragyu | 2:2541ce0cc63e | 641 | buffer[0] = tcp_buffer.xid[0]; |
dragyu | 2:2541ce0cc63e | 642 | buffer[1] = tcp_buffer.xid[1]; |
dragyu | 2:2541ce0cc63e | 643 | buffer[2] = tcp_buffer.pid[0]; |
dragyu | 2:2541ce0cc63e | 644 | buffer[3] = tcp_buffer.pid[1]; |
dragyu | 2:2541ce0cc63e | 645 | buffer[4] = 0x0; |
dragyu | 2:2541ce0cc63e | 646 | buffer[5] = 0x3; |
dragyu | 2:2541ce0cc63e | 647 | buffer[6] = tcp_buffer.serialAddr; |
dragyu | 2:2541ce0cc63e | 648 | buffer[8] = 0x4; |
dragyu | 2:2541ce0cc63e | 649 | client.send_all(buffer,9);//报错 |
dragyu | 2:2541ce0cc63e | 650 | */ |
dragyu | 2:2541ce0cc63e | 651 | } |
dragyu | 2:2541ce0cc63e | 652 | if( Config.frameTimeOut < timeoutT35.read_ms() && flagT35 ) { // 一帧数据结束 7ms超时 |
dragyu | 2:2541ce0cc63e | 653 | timeoutT35.reset(); |
dragyu | 2:2541ce0cc63e | 654 | timeoutT35.stop(); |
dragyu | 2:2541ce0cc63e | 655 | flagT35 = false; |
dragyu | 2:2541ce0cc63e | 656 | // t = buffer[buffer_num-1];buffer[buffer_num-1]=buffer[buffer_num-2];buffer[buffer_num-2]=t; |
dragyu | 2:2541ce0cc63e | 657 | crc = crc16.calculateCRC16(buffer+6,buffer_num-6) ; //为0没有crc错误 |
dragyu | 2:2541ce0cc63e | 658 | if (!crc ) { //无crc 提取mdb帧数据 |
dragyu | 2:2541ce0cc63e | 659 | serial_buffer.serialAddr = buffer[6]; |
dragyu | 2:2541ce0cc63e | 660 | serial_buffer.funCode = buffer[7]; |
dragyu | 2:2541ce0cc63e | 661 | for(j = 0; j < buffer_num-4 ; j++) |
dragyu | 2:2541ce0cc63e | 662 | serial_buffer.data[j] = buffer[j+8]; |
dragyu | 2:2541ce0cc63e | 663 | serial_buffer.crc[0] = buffer[buffer_num-2]; |
dragyu | 2:2541ce0cc63e | 664 | serial_buffer.crc[1] = buffer[buffer_num-1]; |
dragyu | 2:2541ce0cc63e | 665 | // buffer_num = 0;//提取完一帧数据 计数清零 |
dragyu | 2:2541ce0cc63e | 666 | flagThread1 = tcpSendThead1; //进入下一个状态 |
dragyu | 2:2541ce0cc63e | 667 | } else //有crc 错误 |
dragyu | 2:2541ce0cc63e | 668 | flagThread1 = connectedThead1; |
bangbh | 0:412f9c1172b7 | 669 | } |
bangbh | 0:412f9c1172b7 | 670 | } |
bangbh | 0:412f9c1172b7 | 671 | } |
dragyu | 2:2541ce0cc63e | 672 | |
dragyu | 2:2541ce0cc63e | 673 | void timeoutTest() //串口中断 |
dragyu | 2:2541ce0cc63e | 674 | { |
dragyu | 2:2541ce0cc63e | 675 | if(flagThread1 !=serialRecvThead1) |
dragyu | 2:2541ce0cc63e | 676 | buffer[245]=pc->getc();//丢弃串口数据包 |
dragyu | 2:2541ce0cc63e | 677 | else { |
dragyu | 2:2541ce0cc63e | 678 | buffer[buffer_num++] = pc->getc(); |
dragyu | 2:2541ce0cc63e | 679 | flagT35 = true ; //标志已经接收到串口数据 |
dragyu | 2:2541ce0cc63e | 680 | timeoutT35.reset(); //重新及时只看最后一个接受的字符之后的时间 总线空闲检测 |
dragyu | 2:2541ce0cc63e | 681 | timeout.stop(); |
dragyu | 2:2541ce0cc63e | 682 | } //1s接受超时停止计时 |
dragyu | 2:2541ce0cc63e | 683 | |
dragyu | 2:2541ce0cc63e | 684 | } |