मैं एक ऐसे एप्लिकेशन पर काम कर रहा हूं जो दो चीजों में से एक के लिए जीएसएम मॉडेम का उपयोग करता है; सर्वर पर GET अनुरोध भेजकर, या सर्वर (डेटा यूडीपी का उपयोग करके) भेजकर निर्मित HTTP स्टैक में निर्मित स्थिति का उपयोग करके इसकी स्थिति जांचें। मैंने इसे यथासंभव विश्वसनीय रखने के लिए कई अलग-अलग तरीकों की कोशिश की है, और मैं आखिरकार सहायता मांगने के लिए तैयार हूं।एक जीएसएम मोडेम ड्राइवर लिखना?
मेरा आवेदन SIMCOM908 मॉड्यूल और पीआईसी 18 मंच (मैं विकास के लिए एक पीआईसी 18 एक्सप्लोरर का उपयोग कर रहा हूं) के लिए लिखा गया है।
तो समस्या कभी-कभी मॉडेम कुछ करने में व्यस्त होती है, और एक आदेश याद करती है। एक इंसान के रूप में, मैं उसे देखता हूं और बस आदेश भेजता हूं। मेरे एमसीयू के लिए टाइमआउट और रिजेंड के लिए एक सुविधा जोड़ना कोई मुद्दा नहीं है।
समस्या यह है कि मॉडेम विभिन्न घटनाओं के बाद अनचाहे प्रतिक्रिया भेजता है। जब मॉडेम पंजीकरण स्थिति बदलता है (सेल टावर के साथ) तो यह +CGREG: 1, ...
या जब जीपीएस तैयार हो जाएगा GPS Ready
के साथ जवाब देगा। ये प्रतिक्रिया किसी भी समय हो सकती है, जिसमें कमांड के बीच (जैसे आईपी कनेक्शन बनाना) शामिल है।
यह एक समस्या है, क्योंकि मैंने इस से निपटने का कोई तरीका नहीं सोचा है। मेरे एप्लिकेशन को एक कमांड भेजने की आवश्यकता है (उदाहरण के लिए सर्वर से कनेक्ट करने के लिए, AT+CIPSTART="UDP","example.com",5000
) यह आदेश 'ओके' के साथ प्रतिक्रिया देगा, और फिर जब आदेश 'कनेक्ट ठीक है' समाप्त हो गया है। हालांकि, मुझे कई अन्य संभावित प्रतिक्रियाओं पर प्रतिक्रिया करने में सक्षम होना चाहिए, और मुझे ऐसा करने का कोई तरीका नहीं पता है। मुझे अपने कोड के साथ क्या करने की ज़रूरत है; मॉडेम से प्रतिक्रिया के लिए प्रतीक्षा करें, प्रतिक्रिया की जांच करें, उस प्रतिक्रिया के आधार पर एक कार्रवाई करें?
मैं कोड सीमित हूं (8-बिट माइक्रोकंट्रोलर होने के नाते!) और न्यूनतम पुनरावृत्ति को रखना चाहूंगा। मैं एक प्रतिक्रिया फ़ंक्शन कैसे लिख सकता हूं जो जीएसएम मॉड्यूल (अनुरोधित या अब) से प्रतिक्रिया लेगा और फिर मेरे बाकी कार्यक्रम को पता चलेगा कि क्या हो रहा है?
आदर्श रूप में, मैं उन प्रतिक्रियाओं के साथ कुछ करना चाहता हूं। जैसा एक आंतरिक स्थिति रखने के (जब मैं GPS Ready
सुना है, मैं जानता हूँ कि मैं जीपीएस आदि संचालित कर सकती हैं
हो सकता है कि वहाँ कुछ चीजें मैं बारे में सोचना चाहिए, या हो सकता है एक खुला स्रोत परियोजना है कि पहले से ही इस समस्या का हल नहीं है कर रहे हैं?
।यहाँ मैं अब तक है:।
/* Command responses */
enum {
// Common
OK = 0,
ERROR,
TIMEOUT,
OTHER,
// CGREG
NOT_REGISTERED,
// CGATT
NOT_ATTACHED,
// Network Status
NO_NETWORK,
// GPRS status
NO_ADDRESS,
// HTTP ACTION
NETWORK_ERROR,
// IP Stack State
IP_INITIAL,
IP_STATUS,
IP_CONFIG,
UDP_CLOSING,
UDP_CLOSED,
UDP_CONNECTING
} gsmResponse;
int gsm_sendCommand(const char * cmd) {
unsigned long timeout = timer_getCurrentTime() + 5000;
uart_clearb(GSM_UART); // Clear the input buffer
uart_puts(GSM_UART, cmd); // Send the command to the module
while (strstr(bf2, "\r") == NULL) { // Keep waiting for a response from the module
if (timeout < timer_getCurrentTime()) { // Check we haven't timed out yet
printf("Command timed out: %s\r\n", cmd);
return TIMEOUT;
}
}
timer_delay(100); // Let the rest of the response be received.
return OK;
}
int gsm_simpleCommand(const char * cmd) {
if (gsm_sendCommand(cmd) == TIMEOUT)
return TIMEOUT;
// Getting an ERROR response is quick, so if there is a response, this will be there
if (strstr(bf2, "ERROR") != NULL)
return ERROR;
// Sometimes the OK (meaning the command ran) can take a while
// As long as there wasn't an error, we can wait for the OK
while (strstr(bf2, "OK") == NULL);
return OK;
}
एक साधारण आदेश आदेश है कि विशेष रूप से जवाब में OK
या ERROR
की तलाश में है पर किसी भी AT
तरह है लेकिन, मैं भी यह और अधिक उन्नत कमांड के लिए AT+CPIN?
की तरह उपयोग करें, क्योंकि यह एम ईन्स मैं पूरी प्रतिक्रिया पर कब्जा कर लिया होगा, और आगे +CPIN: READY
खोज सकते हैं। हालांकि, इनमें से कोई भी वास्तव में अनचाहे प्रतिक्रियाओं का जवाब नहीं देता है। वास्तव में, gsm_sendCommand()
फ़ंक्शन प्रारंभिक रूप से वापस आ जाएगा जब अनचाहे प्रतिक्रिया प्राप्त होती है।
जटिल, कभी-कभी अनचाहे, स्थिति संदेश जैसे प्रबंधन का एक अच्छा तरीका क्या है? कृपया ध्यान दें कि यह एप्लिकेशन सी में लिखा गया है, और 8 बिट माइक्रोकंट्रोलर पर चलता है!
आपको शायद एक राज्य मशीन (एफएसएम) लागू करना होगा: 'newstate = oldstate [message]', और हो सकता है कि दूसरे छोर को राज्य मशीन भी माना जाए। – wildplasser
यह मेरा हिस्सा होगा जो मुझे लगता है। हालांकि, इस मामले में एक पूर्ण एफएसएम सबसे अच्छा विकल्प नहीं लगता है। मुझे एक सिस्टम के कई राज्यों की बजाय कुछ अलग अनचाहे कोडों की बाइनरी स्थिति को ट्रैक करने की आवश्यकता है। ट्रैक रखने के लिए मेरे पास बस कुछ वैश्विक बूलियन प्रकार होंगे। – dantheman