Using the interrupt function to dispose messages

Dependencies:   mbed

Committer:
Zero_YI
Date:
Wed Nov 29 06:22:01 2017 +0000
Revision:
0:0e1ee46c6ffb
SIM_ByIrq

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Zero_YI 0:0e1ee46c6ffb 1 #include "mbed.h"
Zero_YI 0:0e1ee46c6ffb 2 #include "string.h"
Zero_YI 0:0e1ee46c6ffb 3
Zero_YI 0:0e1ee46c6ffb 4 #define MAX_READ_LEN 256
Zero_YI 0:0e1ee46c6ffb 5 #define SEVER "122.5.17.146"
Zero_YI 0:0e1ee46c6ffb 6 #define PORT 9961
Zero_YI 0:0e1ee46c6ffb 7
Zero_YI 0:0e1ee46c6ffb 8 DigitalOut myled(LED1);
Zero_YI 0:0e1ee46c6ffb 9 Timer timer;
Zero_YI 0:0e1ee46c6ffb 10 Serial pc(USBTX,USBRX,9600);
Zero_YI 0:0e1ee46c6ffb 11 Serial sim(PA_9,PA_10,115200);
Zero_YI 0:0e1ee46c6ffb 12
Zero_YI 0:0e1ee46c6ffb 13 char readBuf[MAX_READ_LEN];
Zero_YI 0:0e1ee46c6ffb 14 int bufPtr;
Zero_YI 0:0e1ee46c6ffb 15 bool revOK;
Zero_YI 0:0e1ee46c6ffb 16
Zero_YI 0:0e1ee46c6ffb 17 enum rxMode{
Zero_YI 0:0e1ee46c6ffb 18 CMDMODE = 0;
Zero_YI 0:0e1ee46c6ffb 19 GPSMODE = 1;
Zero_YI 0:0e1ee46c6ffb 20 };
Zero_YI 0:0e1ee46c6ffb 21
Zero_YI 0:0e1ee46c6ffb 22 void uartIrq()
Zero_YI 0:0e1ee46c6ffb 23 {
Zero_YI 0:0e1ee46c6ffb 24 while(sim.readable()&&bufPtr<MAX_READ_LEN)
Zero_YI 0:0e1ee46c6ffb 25 {
Zero_YI 0:0e1ee46c6ffb 26 char buf = sim.getc();
Zero_YI 0:0e1ee46c6ffb 27 if(buf!='\r'&&buf!='\n')
Zero_YI 0:0e1ee46c6ffb 28 {
Zero_YI 0:0e1ee46c6ffb 29 readBuf[bufPtr++] = buf;
Zero_YI 0:0e1ee46c6ffb 30 }
Zero_YI 0:0e1ee46c6ffb 31 if(buf=='\n')
Zero_YI 0:0e1ee46c6ffb 32 {
Zero_YI 0:0e1ee46c6ffb 33 readBuf[bufPtr] = 0;
Zero_YI 0:0e1ee46c6ffb 34 bufPtr = 0;
Zero_YI 0:0e1ee46c6ffb 35 revOK = true;
Zero_YI 0:0e1ee46c6ffb 36 }
Zero_YI 0:0e1ee46c6ffb 37 }
Zero_YI 0:0e1ee46c6ffb 38 }
Zero_YI 0:0e1ee46c6ffb 39
Zero_YI 0:0e1ee46c6ffb 40 int getReply(uint16_t timeOut=1000)
Zero_YI 0:0e1ee46c6ffb 41 {
Zero_YI 0:0e1ee46c6ffb 42 int begin;
Zero_YI 0:0e1ee46c6ffb 43 timer.start();
Zero_YI 0:0e1ee46c6ffb 44 begin = timer.read_ms();
Zero_YI 0:0e1ee46c6ffb 45 while(!revOK)
Zero_YI 0:0e1ee46c6ffb 46 {
Zero_YI 0:0e1ee46c6ffb 47 if(timer.read_ms()-begin>timeOut)
Zero_YI 0:0e1ee46c6ffb 48 {
Zero_YI 0:0e1ee46c6ffb 49 timer.stop();
Zero_YI 0:0e1ee46c6ffb 50 return 0; //time out;
Zero_YI 0:0e1ee46c6ffb 51 }
Zero_YI 0:0e1ee46c6ffb 52 }
Zero_YI 0:0e1ee46c6ffb 53 timer.stop();
Zero_YI 0:0e1ee46c6ffb 54 revOK = false;
Zero_YI 0:0e1ee46c6ffb 55 return 1;
Zero_YI 0:0e1ee46c6ffb 56 }
Zero_YI 0:0e1ee46c6ffb 57
Zero_YI 0:0e1ee46c6ffb 58 bool expectReply(char* eptReply,uint16_t timeOut,uint8_t mulNum=2)
Zero_YI 0:0e1ee46c6ffb 59 {
Zero_YI 0:0e1ee46c6ffb 60 for(int i=0;i<mulNum;i++)
Zero_YI 0:0e1ee46c6ffb 61 {
Zero_YI 0:0e1ee46c6ffb 62 getReply(timeOut);
Zero_YI 0:0e1ee46c6ffb 63 if(0!=strstr(readBuf,eptReply))
Zero_YI 0:0e1ee46c6ffb 64 {
Zero_YI 0:0e1ee46c6ffb 65 return true;
Zero_YI 0:0e1ee46c6ffb 66 }
Zero_YI 0:0e1ee46c6ffb 67 }
Zero_YI 0:0e1ee46c6ffb 68 return false;
Zero_YI 0:0e1ee46c6ffb 69 }
Zero_YI 0:0e1ee46c6ffb 70
Zero_YI 0:0e1ee46c6ffb 71 int sendCheckReply(char* cmd,char* reply,uint16_t timeOut=1000)
Zero_YI 0:0e1ee46c6ffb 72 {
Zero_YI 0:0e1ee46c6ffb 73 sim.printf("%s\r\n",cmd);
Zero_YI 0:0e1ee46c6ffb 74 return expectReply(reply,timeOut,5);
Zero_YI 0:0e1ee46c6ffb 75 }
Zero_YI 0:0e1ee46c6ffb 76
Zero_YI 0:0e1ee46c6ffb 77 bool TCPconnect(char *server, uint16_t port)
Zero_YI 0:0e1ee46c6ffb 78 {
Zero_YI 0:0e1ee46c6ffb 79 if (! sendCheckReply("AT+CIPSHUT", "SHUT OK", 5000) )
Zero_YI 0:0e1ee46c6ffb 80 return false;
Zero_YI 0:0e1ee46c6ffb 81 //pc.printf("%s\r\n",readBuf);
Zero_YI 0:0e1ee46c6ffb 82
Zero_YI 0:0e1ee46c6ffb 83 if (! sendCheckReply("AT+CIPMUX=0", "OK") )
Zero_YI 0:0e1ee46c6ffb 84 return false;
Zero_YI 0:0e1ee46c6ffb 85
Zero_YI 0:0e1ee46c6ffb 86 sim.printf("AT+CIPSTART=\"TCP\",\"%s\",%d\r\n",server,port);
Zero_YI 0:0e1ee46c6ffb 87 if (! expectReply("OK",1000,2)) return false;
Zero_YI 0:0e1ee46c6ffb 88 if (! expectReply("CONNECT OK",1000,3)) return false;
Zero_YI 0:0e1ee46c6ffb 89 return true;
Zero_YI 0:0e1ee46c6ffb 90 }
Zero_YI 0:0e1ee46c6ffb 91
Zero_YI 0:0e1ee46c6ffb 92 bool init()
Zero_YI 0:0e1ee46c6ffb 93 {
Zero_YI 0:0e1ee46c6ffb 94 for(int i=0;i<3;i++)
Zero_YI 0:0e1ee46c6ffb 95 {
Zero_YI 0:0e1ee46c6ffb 96 if(sendCheckReply("AT","OK"))
Zero_YI 0:0e1ee46c6ffb 97 {
Zero_YI 0:0e1ee46c6ffb 98 return true;
Zero_YI 0:0e1ee46c6ffb 99 }
Zero_YI 0:0e1ee46c6ffb 100 wait(0.5);
Zero_YI 0:0e1ee46c6ffb 101 }
Zero_YI 0:0e1ee46c6ffb 102 return false;
Zero_YI 0:0e1ee46c6ffb 103 }
Zero_YI 0:0e1ee46c6ffb 104
Zero_YI 0:0e1ee46c6ffb 105 bool TCPsend(char*sendData)
Zero_YI 0:0e1ee46c6ffb 106 {
Zero_YI 0:0e1ee46c6ffb 107 if(sendCheckReply("AT+CIPSTATUS","CONNECT OK"))
Zero_YI 0:0e1ee46c6ffb 108 {
Zero_YI 0:0e1ee46c6ffb 109 sendCheckReply("AT+CIPSEND",">");
Zero_YI 0:0e1ee46c6ffb 110 sim.printf("%s\r\n",sendData);
Zero_YI 0:0e1ee46c6ffb 111 sim.printf("%c\r\n",char(0x1a));
Zero_YI 0:0e1ee46c6ffb 112 if(expectReply("SEND OK",1000,5))
Zero_YI 0:0e1ee46c6ffb 113 {
Zero_YI 0:0e1ee46c6ffb 114 // pc.printf("SEND OK\r\n");
Zero_YI 0:0e1ee46c6ffb 115 return true;
Zero_YI 0:0e1ee46c6ffb 116 }
Zero_YI 0:0e1ee46c6ffb 117 else
Zero_YI 0:0e1ee46c6ffb 118 {
Zero_YI 0:0e1ee46c6ffb 119 // pc.printf("SEND FAIL:%s\r\n",readBuf);
Zero_YI 0:0e1ee46c6ffb 120 return false;
Zero_YI 0:0e1ee46c6ffb 121 }
Zero_YI 0:0e1ee46c6ffb 122 }
Zero_YI 0:0e1ee46c6ffb 123 return false;
Zero_YI 0:0e1ee46c6ffb 124 }
Zero_YI 0:0e1ee46c6ffb 125
Zero_YI 0:0e1ee46c6ffb 126 bool TCPclose()
Zero_YI 0:0e1ee46c6ffb 127 {
Zero_YI 0:0e1ee46c6ffb 128 if(sendCheckReply("AT+CIPCLOSE","CLOSE OK"))
Zero_YI 0:0e1ee46c6ffb 129 {
Zero_YI 0:0e1ee46c6ffb 130 return true;
Zero_YI 0:0e1ee46c6ffb 131 }
Zero_YI 0:0e1ee46c6ffb 132 else
Zero_YI 0:0e1ee46c6ffb 133 {
Zero_YI 0:0e1ee46c6ffb 134 return false;
Zero_YI 0:0e1ee46c6ffb 135 }
Zero_YI 0:0e1ee46c6ffb 136 }
Zero_YI 0:0e1ee46c6ffb 137
Zero_YI 0:0e1ee46c6ffb 138 int main() {
Zero_YI 0:0e1ee46c6ffb 139 sim.attach(&uartIrq,Serial::RxIrq);
Zero_YI 0:0e1ee46c6ffb 140 pc.printf("Hello World!\r\n");
Zero_YI 0:0e1ee46c6ffb 141 while(pc.readable())
Zero_YI 0:0e1ee46c6ffb 142 pc.getc();
Zero_YI 0:0e1ee46c6ffb 143 if(init())
Zero_YI 0:0e1ee46c6ffb 144 pc.printf("init OK\r\n");
Zero_YI 0:0e1ee46c6ffb 145 else
Zero_YI 0:0e1ee46c6ffb 146 pc.printf("init failed!please try again later!\r\n");
Zero_YI 0:0e1ee46c6ffb 147 if(TCPconnect(SEVER,PORT))
Zero_YI 0:0e1ee46c6ffb 148 pc.printf("TCPconnect OK\r\n");
Zero_YI 0:0e1ee46c6ffb 149 else
Zero_YI 0:0e1ee46c6ffb 150 pc.printf("TCPconnect Fail\r\n");
Zero_YI 0:0e1ee46c6ffb 151 if(TCPsend("I Love Juan"))
Zero_YI 0:0e1ee46c6ffb 152 pc.printf("Send OK\r\n");
Zero_YI 0:0e1ee46c6ffb 153 else
Zero_YI 0:0e1ee46c6ffb 154 pc.printf("Send Fail\r\n");
Zero_YI 0:0e1ee46c6ffb 155 while(1) {
Zero_YI 0:0e1ee46c6ffb 156 myled = !myled;
Zero_YI 0:0e1ee46c6ffb 157 wait(1);
Zero_YI 0:0e1ee46c6ffb 158 }
Zero_YI 0:0e1ee46c6ffb 159 }