F103 modbus TCP

Dependencies:   BufferedSerial BufferedSoftSerial CRC16 Nucleo_F103RB_W5500HelloWorld MessageQueue WIZnet_Library Watchdog eeprom mbed-rtos mbed

Fork of Nucleo_F103RB_W5500HelloWorld by WIZnet

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?

UserRevisionLine numberNew 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 }