最近做一个项目需要通过以太网通讯,想问一下下位在接收是需不需要进行超时判断?如果哪位能提供一个简单的示例,感激不尽。
贴一下刚完成的接收函数(未测试)
- //W5100 variable define
- #define SF_WAIT_FRAME_HEAD 0X01
- #define SF_WAIT_FRAME_LEN 0X02
- #define SF_WAIT_FRAME_CMD 0X03
- #define SF_WAIT_FRAME_DATA 0X04
- #define SF_WAIT_FRAME_CHK 0X05
- boolean DataReceivedOK = false;
- boolean alreadyConnected = false;
- boolean EnthernetIsOK = false;
- byte PacketBuffer[30];
- unsigned int LocalPort = 8888;
- byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
- IPAddress ip(192, 168, 1, 177);
- IPAddress gateway(192, 168, 1, 1);
- IPAddress subnet(255, 255, 255, 0);
- IPAddress Center(192, 168, 1, 113);
- // Enter the IP address of the server you're connecting to:
- IPAddress server(192, 168, 1, 113);
- EthernetServer AlarmServer;
- // Initialize the Ethernet client library
- // with the IP address and port of the server
- // that you want to connect to (port 23 is default for telnet;
- // if you're using Processing's ChatServer, use port 10002):
- EthernetClient AlarmClient;
- byte ReceiveBuf[100];
- byte SendBuf[]={0xaa,0x03,0x05,0x28,0x11,0xbb};
- String str="";
- void setup()
- {
- // start the Ethernet connection:
- Ethernet.begin(mac, ip);
- // Open serial communications and wait for port to open:
- Serial.begin(9600);
- // if you get a connection, report back via serial:
- if (AlarmClient.connect(server, 9050))
- {
- Serial.println("connected");
- }
- else
- {
- // if you didn't get a connection to the server:
- Serial.println("connection failed");
- }
- }
- void loop()
- {
- // if there are incoming bytes available
- // from the server, read them and print them:
- if (client.available())
- {
-
- /*static char sn=0;
- static char len=0;*/
- char c = client.read();
- Serial.println(c);
- if (c == 0xaa)
- {
- Serial.println("Get Frame HEAD 0xAA");
- }
- else if (c == 0xbb)
- {
- Serial.println("Get Frame Length 0xBB");
- }
- else
- {
- Serial.print("Get other Byte value:");
- Serial.println(c);
- }
- }
- // as long as there are bytes in the serial queue,
- // read them and send them out the socket if it's open:
- while (Serial.available() > 0)
- {
- char inChar = Serial.read();
- if (client.connected())
- {
- client.print(inChar);
- }
- }
- for(int i=0;i<6;i++)
- {
- client.write(SendBuf[i]);
- }
- delay(1000);
- // if the server's disconnected, stop the client:
- if (!client.connected())
- {
- Serial.println();
- Serial.println("disconnecting.");
- client.stop();
- // do nothing:
- while (true);
- }
- }
- void EthernetInit()
- {
- Ethernet.begin(mac, ip, gateway, subnet);
- AlarmServer.begin();
- }
- void AlarmServerStart()
- {
- EthernetClient client = AlarmServer.available();
- if (client)
- {
- if (!alreadyConnected)
- {
- client.flush();
- client.println("Hello,client!");
- alreadyConnected = true;
- }
- if (client.available()>0)
- {
- char thisChar = client.read();
- AlarmServer.write(thisChar);
- }
- }
- }
- //连接server
- void AlarmClientStart()
- {
- if (AlarmClient.connected())
- {
- EnthernetIsOK = true;
- Serial.println("Connected");
- }
- else
- {
- EnthernetIsOK = false;
- AlarmClient.connect(Center, LocalPort);
- }
- }
- //读取一个字节
- byte AlarmClientRead()
- {
- byte c;
- if (AlarmClient.available())
- {
- c = AlarmClient.read();
- FrameStateMachine(c);
- //Serial.print(c);
- }
- return c;
- }
- //接收报文状态机
- /*
- 报文格式:0xAA len cmd data check
- 0xaa : 报文头
- len:data区数据长度,不超过20
- cmd:命令字,一个byte
- data:len个byte
- check:校验字,等于len^cmd^data
- */
- void FrameStateMachine(byte c)
- {
- static byte FSState = SF_WAIT_FRAME_HEAD;
- static byte len = 0;
- static byte CheckSum = 0;
- //static byte TimeOutCounts = 0;//超时计数
- switch (FSState)
- {
- case SF_WAIT_FRAME_HEAD:
- CheckSum = 0;
- len = 0;
- if (c == 0xAA)
- {
- PacketBuffer[0] = c;
- FSState = SF_WAIT_FRAME_LEN;
- }
- break;
- case SF_WAIT_FRAME_LEN:
- if (c <= 0x14 && c >= 0x00) //数据长度不能大于20个字节
- {
- PacketBuffer[1] = c;
- CheckSum = CheckSum^PacketBuffer[1];
- FSState = SF_WAIT_FRAME_CMD;
- }
- else
- {
- FSState = SF_WAIT_FRAME_HEAD;
- }
- break;
- case SF_WAIT_FRAME_CMD:
- if (c>0x01 && c<0x40) //command word is between 0x01 and 0x40
- {
- if (PacketBuffer[1]>0)
- {
- PacketBuffer[2] = c;
- CheckSum = CheckSum^PacketBuffer[2];
- FSState = SF_WAIT_FRAME_DATA;
- }
- else
- {
- PacketBuffer[2] = c;
- CheckSum = CheckSum^PacketBuffer[2];
- FSState = SF_WAIT_FRAME_CHK; //如果数据长度为0,则进入校验值接收
- }
- }
- else
- {
- FSState = SF_WAIT_FRAME_HEAD;
- }
- break;
- case SF_WAIT_FRAME_DATA:
- PacketBuffer[2 + len] = c;
- CheckSum = CheckSum^ c;
- len++;
- if (len>PacketBuffer[1])
- {
- FSState = SF_WAIT_FRAME_CHK;
- }
- break;
- case SF_WAIT_FRAME_CHK:
- if (c == CheckSum)
- {
- FSState = SF_WAIT_FRAME_HEAD;
- DataReceivedOK = true;
- }
- else
- {
- FSState = SF_WAIT_FRAME_HEAD;
- }
- break;
- default:
- FSState = SF_WAIT_FRAME_HEAD;
- break;
- }
- }
复制代码 |