Jump to content



GSM Modem με σειριακή


profitis

Recommended Posts

Δυο από τα πιο σημαντικά εργαλεία που θα χρειαστείς για την επικοινωνία με τις σειριακές θύρες είναι τα εξής...:

Serial port monitor (SPM), το οποίο είναι το καλύτερο sniffer για rs232 και είναι δωρεάν...

Το terminal του Br@y, κλασσικό εργαλείο τα τελευταία 10 χρόνια και έχει ότι μπορείς να χρειαστείς για την σειριακή... υποστηρίζει macros, scripting και remote server-client για χειρισμό σειριακής μέσω δικτύου...

Θα σου πρότεινα να δουλεύεις με αυτά... το hercules είναι επίσης ωραίο εργαλείο, γιατί υποστηρίζει και tcp/udp client-server, αλλά όσων αφορά την σειριακή δεν έχει καμία σχέση με το terminal...

Όσων αφορά το usb μάλλον πρέπει να είναι οι drivers, μιας και σου δουλεύει στα 7 και όχι στα xp... μπορείς να το εξακριβώσεις και με το SPM ή με κάποιο παλμογράφο αν έχεις πρόσβαση...

Link to comment
Share on other sites

  • Replies 65
  • Created
  • Last Reply
Δυο από τα πιο σημαντικά εργαλεία που θα χρειαστείς για την επικοινωνία με τις σειριακές θύρες είναι τα εξής...:

Serial port monitor (SPM), το οποίο είναι το καλύτερο sniffer για rs232 και είναι δωρεάν...

Το terminal του Br@y, κλασσικό εργαλείο τα τελευταία 10 χρόνια και έχει ότι μπορείς να χρειαστείς για την σειριακή... υποστηρίζει macros, scripting και remote server-client για χειρισμό σειριακής μέσω δικτύου...

Θα σου πρότεινα να δουλεύεις με αυτά... το hercules είναι επίσης ωραίο εργαλείο, γιατί υποστηρίζει και tcp/udp client-server, αλλά όσων αφορά την σειριακή δεν έχει καμία σχέση με το terminal...

Όσων αφορά το usb μάλλον πρέπει να είναι οι drivers, μιας και σου δουλεύει στα 7 και όχι στα xp... μπορείς να το εξακριβώσεις και με το SPM ή με κάποιο παλμογράφο αν έχεις πρόσβαση...

Χρόνια πολλά και με το καλό να μας έρθει το 2011 :)

Ενώ τελικά καταφέραμε να κάνουμε το modem να ανταποκριθεί σε περιβάλλον XP κολλούσε συνέχεια (4/5 φορές) είτε στην εντολή για το PIN (ΑΤ+PIN) είτε στην εντολή για την αποστολή ενός απλου sms. Δεν δοκιμάσαμε βέβαια τα προγράμματα που προτείνεις, είναι το επόμενο που θα κάνουμε όπως επίσης και να το δοουλέψουμε αποκλειστικά σε 7 να έχουμε το κεφάλι μας ήσυχο.

Ομως τα κολλήματα εξηγούνται λόγω των κακων drivers των xp/ λειτουργικου γενικοτερα κτλ ή είναι θέμα του modem;

Επίσης γνωρίζεις κάποιον σύντομο εισαγωγικό οδηγό πάνω στην επικοινωνία over gprs. Απ' όσο έχω δει και έχω καταλάβει υπάρχουν δύο διαφορετικοι τρόποι με τους οποίους μπορείς να επικοινωνήσεις (απευθείας AT εντολές και tcp/ip commands)

Link to comment
Share on other sites

Δεν μπορώ να ξέρω πιο ακριβώς είναι το πρόβλημα με την σειριακή, χωρίς να το δω... Από αυτά που μου έχεις πει, μάλλον φαίνεται να είναι οι drivers στα xp...

Τώρα για το gprs ένας είναι ο τρόπος, απλά έχει δυο σκέλη, το πρώτο έχει να κάνει με το gprs και το δεύτερο με το tcp/ip... δεν είναι το ίδιο πράγμα μην μπερδευτείς...

Το gprs είναι ένα επίπεδο από πάνω από το tcp/ip και στην ουσία κάνει wrap το tcp/ip ώστε να το μεταφέρει μέσω του gsm δικτύου. Σκέψου δηλαδή, κατά κάποιο τρόπο, ότι το gprs είναι για το tcp/ip, ότι το gsm για το voice, δηλαδή και τα δυο κωδικοποιούν το περιεχόμενό τους με τέτοιο τρόπο έτσι ώστε να το μεταδίδουν μεταξύ των endpoints τους...

Επομένως, το πρώτο πράγμα που κάνεις είναι να δημιουργήσεις μια gprs "σύνδεση" (δηλαδή να κάνεις attach το gprs, όπως λέγεται) και αφού το κάνεις αυτό, τότε μπορείς να δημιουργήσεις μια tcp σύνδεση, πάνω στο κανάλι του gprs...

Άρα,

1. Gprs attach

2. Tcp/ip connection (ή udp που είναι και πιο εύκολο και πιο φθηνό)

Υπόψη ότι θα χρειαστείς δυο state machines, ένα για το gprs και ένα για το tcp/ip με master control το state machine του gprs... ένα απλό state machine και για τα δυο ειναι αυτό

GPRS

GPRS_DETACHED

GPRS_ATTACHING

GPRS_ATTACHED (εδώ κάνει loop σε normal συνθήκες και από εδώ τρέχει το tcp state)

TCP/IP

TCP_DISCONNECTED

TCP_CONNECTING

TCP_CONNECTED (εδώ κάνει loop σε normal συνθήκες)

TCP_DISCONNECTING

Τα states είναι κυκλικά και πάει μόνο από πάνω προς τα κάτω και από το τέλος στην αρχή... Όταν είσαι detached, θα χρειαστείς το APN του provider σου για να κάνεις attach...

Αυτό είναι το minimum από τα states που θα χρειαστείς, αλλά κατά περίπτωση και ανάλογα την υλοποίηση που θα κάνεις και τον έλεγχο που θες κατά την διαδικασία, μπορείς να προσθέσεις κάποια επιπλέον states...

Link to comment
Share on other sites

Τhanks a lot για άλλη μία φορά!!!

Σε πρώτη φάση προσπαθούμε να παίξουμε με το gsm modem απο τη κονσόλα μέσω του hercules και βλέπουμε στη πορεία....το πάμε βήμα βήμα....

Και όπως ήταν αναμενόμενο μας έκατσε αμεσως πρόβλημα. Συνδεθήκαμε με το modem, δώσαμε και το pin, ελέγξαμε τη κατάσταση του gsm δικτυου...ολα οκ...Μετά για το GPRS πήγαμε να σετάρουμε το apn αλλα εκεί μας πέταξε error. Η sim είναι σύνδεση cosmote και τα στοιχειά είναι apn:internet, και κενός κωδικος και username

at

OK

AT+CPIN=5869

OK

AT+CREG?

+CREG: 0,1

OK

AT+CSQ

+CSQ: 16,0

OK

AT+CGDCONT=1,"IP","internet"

OK

AT+CSTT="internet","",""

ERROR

κάνουμε κάτι λάθος; Επίσης κάτι ειχες αναφέρει οτι αρχικά αρχικά πρέπει να περιμένουμε για +wind 4. Αυτο ειναι για το Initialization...Μπορούμε να το ανιχνευσουμε αυτό απο το terminal;

Link to comment
Share on other sites

Και επίσης μία άλλη βασική απορία...

Στο manual για το gprs του modem αναφέρεται ότι

"Going on further, it's not possible to carry plain IP packets over a

serial link due to loss of packet boundaries since serial links are not

packet-oriented. So to overcome this and to manage the IP

configuration, a low level protocol named PPP is used. This protocol

embeds IP packets into PPP frames which then are sent over the

serial link. On M$ Windows, PPP is basically refered to as a dial-up

connection which is configured as follows.

"

Ουσιαστικά δεν λέει ότι αυτο που θέλουμε να κάνουμε, να στείλουμε πακέτα σε ένα tcp socket, από το hyperterminal σε πρώτη φάση, είναι αδύνατο;

Link to comment
Share on other sites

Δεν ξέρω τι περίμενες, αλλά όλες αυτές οι συσκευές είναι gprs modem, δηλαδή εννοείται ότι δουλεύουν σαν modem... είναι σα να μιλάς σε ένα pstn modem, δηλαδή για να στείλεις data πρέπει να χρησιμοποιήσεις ppp...

Αν δεν θες να μπλέξεις με ppp, τότε θα πρέπει να χρησιμοποιήσεις το adl (ή wip μετά την 3.10 version του OpenAT) api της wavecom και να γράψεις κώδικα σε C μέσα στο modem... εκεί τα πράγματα είναι πολύ πιο απλά...

Από την άλλη μπορείς να φτιάξεις το ppp από την πλευρά του μC, πχ μπορείς να δεις το source code του pppd...

κάνουμε κάτι λάθος; Επίσης κάτι ειχες αναφέρει οτι αρχικά αρχικά πρέπει να περιμένουμε για +wind 4. Αυτο ειναι για το Initialization...Μπορούμε να το ανιχνευσουμε αυτό απο το terminal;

Αν έχεις ενεργοποιήσει τα indications (at+wind=255 ή 256 δεν θυμάμαι), τότε θα παίρνεις και το indication για το +wind: 4, που σημαίνει ότι το modem σου έχει γίνει subscribed στην κυψέλη και ναι είναι αναγκαίο για οποιαδήποτε επικοινωνία...

Link to comment
Share on other sites

επίσης με τις διάφορες δοκιμές που έχουμε κάνει βάζουμε το pin της κάρτας και μετά στο creg? απαντάει με +CREG: 0,0 που σημαίνει ότι δεν γινεται registered στο network. Γινεται με κάποιον τροπο να κάνουμε force τη σύνδεση; Αρχικά βάζαμε το pin και αμέσως συνδεότανε κανονικά και γυρνούσε +CREG 0,1.

Link to comment
Share on other sites

Καλημέρα!

Προσπαθούμε και το ψάχνουμε ενταντικότατα αλλά μας λείπουν ακόμη κομμάτια απο το puzzle καθως φαινεται ότι το m1306b με το Q2406B module είναι αρκετά παλιό και δεν βρίσκουμε εύκολα feedback και τα κατάλληλα εργαλεία.

1)Μία λύση είναι, όπως ανέφερες, να υλοποιήσουμε το ppp απευθείας πάνω στον mcu και μετά να παίξουμε με τα gprs commands. Αυτό όμως δεν θα ειναι ιδιαίτερα περίπλοκο και επίπονο; Υπαρχουν απευθείας υλοποιήσεις για τον 8051;

2)πάμε στη λύση να χρησιμοποιησουμε το tcp/ip stack. Απ' όσο ψάξαμε υπάρχει πολυ μεγάλη πιθανότητα το modem να εχει παλιο firmware οπότε ψάχνουμε αναγκαστικά τα παλια development tools του open AT. Aν το αναβαθμίσουμε θα πάμε στο οpenAT SDK 3.22 που είναι πολύ πιο flexible και αν έχουμε καταλάβει και καλα, υποστηρίζει το WIPSoft που θα μας επιτρέψει να παρακάμψουμε τελείως το ppp όμως θα πρέπει στον microcontroller να τρέξει το WIPSoft που δεν έχουμε καταλάβει αν ειναι μόνο pc purposed ή απλά είναι ενα γνεικό πρωτόκολλο/κωδικας που θα μπορει φυσικα να τρέξει σε έναν microcontroller. γνωρίζεις περισσότερες λεπτομέρεις για το WIPSoft;

3)Σε πρώτη φάση ομως ούτε το firmware του modem δεν μπορουμε να βρουμε (δεν βρήκα εντολή at γι αυτο ούτε κάποια αναφορά μέσα στα datasheets.

4) Eπισης σε 1-2 περιπτωσεις στο internet άτομα σχολιάζανε οτι το q2406B δεν έχει τελικα tcp/ip stack. βρήκα και ενα presentation (http://www.sendsms.cn/download/20080901_9d20e7881ccfcd01d167qLTtuudzi4ML.pdf) μου με καταμπέρδεψε αν το Q2406B υποστηρίζει ή δεν υποστηριζει tcp/ip stack.

Σορρυ αν σε εχω ζαλισει λιγάκι και ευχαριστώ για την μεγάλη βοήθεια που έχεις δώσει. Ειναι κάτι πολύπλοκο που δεν το έχουμε ξανασυναντήσει και οι πληροφορίες στο internet είναι τελείως σκόρπιες, οπότε η εμπειρία σου είναι πολυτιμότατη!

Link to comment
Share on other sites

Είναι αλήθεια ότι ο κόσμος του gsm ειδικά στο embedded είναι μικρός και δύσκολα θα βρεις κάτι στο google ή σε κάποιο βιβλίο, αλλά αν διαβάσετε γενικά κάποια πράγματα για το gsm και το api του sdk της wavecom θα καταλάβετε πολλά πράγματα... υπόψη ότι είστε τυχεροί από την άποψη ότι επιλέξατε wavecom, γιατί πριν πουληθεί στην sierra ήταν μια γαλλική εταιρία με πολύ καλούς μηχανικούς και πολύ καλή ομάδα ανάπτυξης... έχουν πολύ καλο-γραμμένο api που από μόνο του είναι σχολείο στην C και επίσης το στηρίζουν με καλό documentation... ήταν η Qt του gsm κατά μια άποψη...

Όσων αφορά το firmware θα σου στείλω pm γιατί τα πράγματα είναι λίγο σύνθετα, επικρατεί άκρα μυστικότητα...

Δες με την εντολή ATI3 αν θυμάμαι καλά, ποιο firmware έχεις και πες μου...

Από την εμπειρία μου, το καλύτερο είναι να χρησιμοποιήσεις μέχρι το 6.55 (αν θυμάμαι πάλι καλά) ή τελος πάντων το τελευταίο firmware το οποίο υποστηρίζει το ADL api... Η διαφορά είναι ότι η wavecom μέχρι κάποια version, χρησιμοποιούσε το tcp/ip stack τρίτης εταιρίας με την οποία είχαν σύμβαση έργου (την ADL δηλαδή), αλλά κάποια στιγμή όταν θέλησαν να μειώσουν την τιμή τους ώστε να ανταγωνιστούν την επέλαση της telit, έγραψαν δικό τους tcp/ip stack το οποίο και ονόμασαν wip... το adl είναι καλό, σταθερό, σωστό και βατό api, το οποίο σε βγάζει από την φιλοσοφία του gsm και είναι σα να γράφεις σε windows... το wip από την άλλη έχει την φιλοσοφία του gsm και φαίνεται ότι το έχουν γράψει gsm-άδες, γιατί ακολουθεί την φιλοσοφία των bearers, όπως ακριβώς όταν γράφεις ένα internet application για κάποιο κινητό (πχ Symbian κτλ)... και το wip είναι καλό api, αλλά είναι gsm-άδικο... αν έχεις το sdk documentation και από τα δυο, ρίξε τους μια γρήγορη ματιά να δεις πιο σου είναι πιο κατανοητό... όσων αφορά την απόδοση είναι τα ίδια...

Link to comment
Share on other sites

Όσων αφορά το firmware θα σου στείλω pm γιατί τα πράγματα είναι λίγο σύνθετα, επικρατεί άκρα μυστικότητα...

Δες με την εντολή ATI3 αν θυμάμαι καλά, ποιο firmware έχεις και πες μου...

H εντολή γύρισε το εξής:

657d09gg.Q24PL001 1956364 052907

Να υποθέσω πως έχουμε την 6.57 ;

Link to comment
Share on other sites

Ναι... την Δευτέρα θα μπορέσω να δω ποια version του openAT χρειάζεσαι, αλλά μάλλον με wip θα δουλέψεις... τέσπα, δεν είναι κακό, τουλάχιστον θα δουλέψεις με το νέο OpenAT στο οποίο έχουν κάνει απίστευτη δουλειά στο integration με τον eclipse, το οποίο είναι απλά σταθμός για την ανάπτυξη σε gsm... κάτι είναι και αυτό... θα σου στείλω pm την Δευτέρα...

εδιτ: πολύ πιθανό να είναι και το τελευταίο firmware γιατί νομίζω η σειρά Q24xx έχει σταματήσει εδώ και μερικά χρόνια... πλέον πουλάνε μόνο σε μεγάλους κατασκευαστές που αγοράζουν ποσότητες και νομίζω ότι το έχουν αντικαταστήσει κιόλας με το Q24 plus...

Εδιτ2: Το Q2406B υποστηρίζει κανονικά gprs και το B στο τέλος, σημαίνει ότι έχει την μεγάλη flash... δηλαδή είναι το ίδιο με το 2406A, κοινώς dual-band αλλά με 32/4 Μβιτ flash και ram αντίστοιχα... δηλαδή, μπορείς να γράψεις δεκάδες χιλιάδες γραμμές κώδικα, και να γράψεις πολύ σαβούρα στην flash...

Link to comment
Share on other sites

Σ' ευχαριστούμε και οι δύο που κάνουμε το project απίστευτα πολυ!!! Μας ξελασπώνεις και μας δινεις πολυτιμότατο feedback...

Αφαιιρετικά, είναι ρεαλιστική προσέγγιση το στήσιμο της εφαρμογής για την επικοινωνία πάνω στο wavecom modem και η τροφοδότηση του με δεδομένα απο την σειριακή του microcontroller;

Link to comment
Share on other sites

Μ' αρέσει να βοηθάω, όσο δεν χρειάζεται να κάνω κάτι ή να δώσω απ' ευθείας απάντηση σε μια προφανή λύση, ειδικά όταν πρόκειται για εργασία...

Ξέχασα να σου ρωτήσω, δοκίμασες αν δουλεύουν οι at commands του WIP...? Αν το firmware τις υποστηρίζει θα δουλεύουν... Η αλήθεια είναι ότι το WIP το έχω χρησιμοποιήσει μόνο για να γράψω κώδικα σε C, οπότε δεν ξέρω αν μπορεί να στείλει data από at ή είναι όπως πριν...

Το "ιδανικό" όσων αφορά το development σε C είναι να γράψεις 2-3 βασικές, δικές σου εντολές (μπορείς να γράψεις δικές σου at commands) και να τις χρησιμοποιείς μέσω του μC για να στέλνεις δεδομένα... πχ

AT+JCONNECT="TCP","157.89.15.3",38,10
+JCONNECT: ΟΚ
AT+JSEND="this is data: x23fxa8x39"
+JSEND: 24

To παραπάν' σημαίνει ότι έχεις γράψει μια δική σου at command (αυτό το κάνεις γράφοντας σε C) η οποία λέγεται JCONNECT και παίρνει σαν παραμέτρους τις εξής <protocol:string>,<ip:string>,<port:int>,<timeout_secs:int>, οπότε με την πρώτη πχ μπορείς να διαλέξεις ανάμεσα από TCP/UDP, με την 2η διαλέγεις την ip του server, με την 3η την πόρτα και την 4η σε πόσα δευτερόλεπτα που ο client είναι inactive να σου κάνει timeout το connection... Επομένως, όταν ο μC στέλνει αυτή την εντολή, τότε το πρόγραμμα σου μέσα στο wavecom παίρνει τα στοιχεία που χρειάζεται για να συνδεθεί (εννοείται ότι τα APN κλπ τα έχεις δώσει πιο πριν ή τα έχεις embedded στον κώδικά σου) και τα χρησιμοποιεί για να συνδεθεί... αν τα καταφέρει θα το κάνεις να σου γράφει "+JCONNECT: OK", αλλιώς θα βγάζεις κάποιο error (συνήθως το error που σου επιστρέφει το sdk)... τέλος χρειάζεσαι και μια εντολή για να στέλνεις δεδομένα, αυτή μπορείς να την κάνεις με 10 άδες τρόπους, δηλαδή επειδή είσαι περιορισμένος σε αλφαριθμητικούς χαρακτήρες, θα πρέπει να χρησιμοποιήσεις κάποιο από τα γνωστά πρωτόκολλα για encoding, πχ 64b enc, 7-bit enc (όπως στα PDU των SMS), αυτό που σου δείχνω στο παράδειγμα με το x23f να σημαίνει 0x23F και με το x να μπορείς να χωρίσεις τα bytes κλπ κλπ κλπ... οι τρόποι είναι πολλοί, με στόχο συνήθως το efficiency... τώρα αυτά μπορείς να τα στέλνεις όπως τα βάζεις ή να κάνεις το ανάστροφο decoding μέσα στο wavecom (με C) και να τα στέλνεις κανονικά σαν binary data, ώστε να στέλνεις μικρή πληροφορία... το ίδιο κάνει και από μόνη της η συσκευή όταν στέλνεις ένα pdu sms...

Ελπίζω να σε έβαλα λίγο στο πνεύμα, πως υποτίθεται ότι πρέπει να δουλεύει ένα custom application σε embedded...

Link to comment
Share on other sites

Μ' αρέσει να βοηθάω, όσο δεν χρειάζεται να κάνω κάτι ή να δώσω απ' ευθείας απάντηση σε μια προφανή λύση, ειδικά όταν πρόκειται για εργασία...

Να 'σαι καλα!!! Και εγώ μία από τα ίδια όταν βοηθάω φίλους και συμφοιτητές σε καθαρά project προγραμματισμού... Με embedded applications είναι το πρώτο που μπλέκω και επιπλέον το ότι συνδυάζονται αρκετά επίπεδα (mcu που συγκεντρώνει τα data + το modem που θα τα στέλνει τα δεδομένα+ ο web server που θα κανει collect τα data) Ολα αυτά με ότι συνοδευονται (rs232 link, ppp, gprs, protocols απο τα modem) θέλουν το χρόνο τους να τα καταλάβεις και κυρίως να τα συνδιασεις

εδιτ: πολύ πιθανό να είναι και το τελευταίο firmware γιατί νομίζω η σειρά Q24xx έχει σταματήσει εδώ και μερικά χρόνια... πλέον πουλάνε μόνο σε μεγάλους κατασκευαστές που αγοράζουν ποσότητες και νομίζω ότι το έχουν αντικαταστήσει κιόλας με το Q24 plus...

Εδιτ2: Το Q2406B υποστηρίζει κανονικά gprs και το B στο τέλος, σημαίνει ότι έχει την μεγάλη flash... δηλαδή είναι το ίδιο με το 2406A, κοινώς dual-band αλλά με 32/4 Μβιτ flash και ram αντίστοιχα... δηλαδή, μπορείς να γράψεις δεκάδες χιλιάδες γραμμές κώδικα, και να γράψεις πολύ σαβούρα στην flash...

Οντως αυτό παίζει...πάνω κάτω το pdf που νομιζω σου εδωσα link πιο πάνω αυτο σχολίαζε.

Πολύ καλό αυτό ότι έχει μεγάλη flash, thanks !!!

Ξέχασα να σου ρωτήσω, δοκίμασες αν δουλεύουν οι at commands του WIP...? Αν το firmware τις υποστηρίζει θα δουλεύουν... Η αλήθεια είναι ότι το WIP το έχω χρησιμοποιήσει μόνο για να γράψω κώδικα σε C, οπότε δεν ξέρω αν μπορεί να στείλει data από at ή είναι όπως πριν...

Στο ενδιάμεσο ναι δοκίμασα τις wip εντολες και απάντησε κανονικά το modem το κλασσικο ΟΚ. Οπότε υποστηρίζονται :D :D :D

Aυτό θα κάνουμε και τώρα, θα παίξουμε λιγάκι με τις wip εντολές απο το terminal να τις κατανοήσουμε σε πρώτη φάση!!! :computer: :computer:

Link to comment
Share on other sites

Ναι, δεν το είχα διαβάσει το pdf... :p

Και η πλάκα είναι ότι, βασικά λέει πάνω-κάτω, ότι σου είπα χωρίς τις ιστορικές λεπτομέρειες... :p Δεν ήξερα καν ότι είχαν κάνει τέτοια documentations, δυστυχώς όλες τις αλλαγές ανάμεσα στα versions τις έζησα με τον άσχημο τρόπο από την 3.01 μέχρι την 3.12, γιατί τα πρώτα είχαν πολλά bugs και ουσιαστικά η μορφή που έχει πάρει σήμερα το api τους, οφείλεται και λίγο πολύ και στις δικές μας παρατηρήσεις (true)...

Δυστυχώς, έχω να ξανα-ασχοληθώ χρόνια και τώρα ξανα-θυμάμαι κάποια πράγματα...

Link to comment
Share on other sites

Ναι, δεν το είχα διαβάσει το pdf... :p

Και η πλάκα είναι ότι, βασικά λέει πάνω-κάτω, ότι σου είπα χωρίς τις ιστορικές λεπτομέρειες... :p Δεν ήξερα καν ότι είχαν κάνει τέτοια documentations, δυστυχώς όλες τις αλλαγές ανάμεσα στα versions τις έζησα με τον άσχημο τρόπο από την 3.01 μέχρι την 3.12, γιατί τα πρώτα είχαν πολλά bugs και ουσιαστικά η μορφή που έχει πάρει σήμερα το api τους, οφείλεται και λίγο πολύ και στις δικές μας παρατηρήσεις (true)...

Δυστυχώς, έχω να ξανα-ασχοληθώ χρόνια και τώρα ξανα-θυμάμαι κάποια πράγματα...

Jaco να 'σαι καλά, αυτή η πείρα σου μας έσωσε που μας προσανατόλισες τι ακριβώς παίζει με το modem με το tcp/ip stack!!!

Είμαστε σε πολύ καλό δρόμο αφού πλέον στήνουμε τον web server για να διαβαζει απο το modem over gprs και να τα αποθηκευει.

Μετά βέβαια το interface με τον microcontroller ίσως έχει τις δυσκολίες του...θα δείξει η νεκροψία :p

Yπάρχει περίπτωση το modem να συνδέεται over wap στη cosmote και να μας έρθει κανα φιρμάνι λογαριασμος; Λίγο που το κοιτούσαμε δεν υπάρχουν αλλες ρυθμισεις πέρα από αυτές για το gprs της cosmote

* APN (Access Point Name): Internet

* Number to call: *99# or *99***X# (X is referring to the GPRS connection number as appeared to the handset settings; typically X=1)

* User name: <blank>

* Password: <blank>

πάντως αυτό το project πραγματικά το καταχαιρόμαστε, γιατί κάνουμε κάτι αρκετά συνδυαστικό και δημιουργικο!!!

Link to comment
Share on other sites

Kαλησπέρα!!!

Μετά από μέρες που μας τσουλούσε μία χαρά έχουμε φάει ένα γερό σκάλωμα και έχουμε αρχίσει να εξαντλούμε γνώσεις και λύσεις...

Να γράψουμε εντολές στο modem το έχουμε καταφέρει μία χαρά. Ορίσαμε έναν σταθερό buffer μέσα στον κώδικα που τρέχουμε στον microcontroller και αυτό τον έστειλε κανονικά στον tcp/ip server μας. Αλλά στο read των responses από το modem έχουμε τρομερό πρόβλημα και όπως ειχες πει και εσύ και αυτό χρειάζεται ώστε να μπορούμε να ανακάμπτουμε απο errors, να ξανακάνουμε attach κτλ

1)Ενώ δίνουμε AT+WIND=256 ΑΤ+WIND=4 μετά από το enter του pin δεν έρχεται. Δεν ξέρω αν φταιει που το έχουμε γυρίσει αποκλειστικά σε GPRS και δεν το γυρίζει το +WIND: 4

2)Τις εντολές τις παίρνει το modem με printf("%s","entoliAT"); . Αφού κιόλας έγινε η αποστολή ενός buffer στον tcp ip server σημαίνει ότι τις εντολές το modem τις παίρνει κανονικά.

3)Στο read ξεκινήσαμε με...scanf(); ώστε να πάρουμε πίσω τα ΟΚ από κάθε εντολή και και να ελέγχουμε το ότι το gprs ειναι attached. Δηλαδή να ελεγξουμε αν μας δινει το modem at+cgreg=0,1 . Oμως εδώ έχουμε φάει τώρα δυο μέρες. Απ όσο έχουμε ψάξει manuals και με debug

4)οταν κάνεις printf(); τα γράφει στον buffer της σειριακής και με scanf τα διαβάζεις. Αλλα η scanf δεν φαίνεται να τα αδειάζει. ενώ αν γίνει ενα read byte byte με έλεγχο για interrupt απο το hardware ( while(RI0!=1) RI0=0; c=SUBF0; ) αδειάζει ο buffer.

5)επίσης εννοείται πως μετά απο π.χ. το AT+CPIN περιμέναμε κάποια εκατοντάδες ms στον mcu προτού διαβάσουμε αλλά πάλι συνέχεια διαβάζαμε απο τον buffer την ΑΤ+CPIN (με την scanf εξού και η παραπάνω παρατήρηση στο 1) αντί γι ατο ΟΚ που θα περιμέναμε

6) μπορούμε να φλασάρουμε τον buffer της σειριακής με κάποιον τρόπο (SUBF0)...

Παίζουμε με τον 8051...

το συμπέρασμα είναι ότι το embedded programming είναι τελικά πολυ πιο ζόρικο:1) λίγη μνήμη που οριακα μας φτάνει 2)πολύ δύσκολο debugging :p :P :p

Thanks για άλλη μία φορά για την πολύ μεγάλη σου βοήθεια!Να 'σαι καλα!

edited: με τον ένα ή με τον άλλο τροπο καταφέραμε και προχωρησαμε μ ετους buffers...ομως σε at+cgreg? command το modem επιστρεφει στον mcu "+GREG: 0,1"....να υποθέσω πως καπου γινεται κανα τρελό μπερδεμα στα read και μετά το + παει και σβήνεται το C (η απάντηση κανονικα ειναι +CGREG:0,1)

Link to comment
Share on other sites

Το πρόβλημα που θα έχετε με τον 8051 θα είναι κυρίως η ram, με την rom δεν θα πρέπει να έχετε πρόβλημα, απλά θα πρέπει να διαχειριστείτε λίγο ποιο έξυπνα την μνήμη σας... επίσης επειδή πλέον δουλεύετε με ascii πρωτόκολλα όπως το AT, θα πρέπει να έχετε επίβλεψη του stack έτσι ώστε να μην κάνετε overflow, οπότε θα πρέπει να δουλεύεται με pointers... Όσων αφορά την μνήμη, αν θέλετε να μειώσετε την χρήση της, τότε μπορείτε να δηλώσετε το "ΑΤ+" σαν global ώστε να πιάσει χώρο στο heap και να μην δημιουργείτε ούτε δυναμικά κάθε φορά, αλλά και αν έχετε πολλές εντολές στο heap να πιάνουν 3bytes λιγότερα η κάθε μια... με κάτι τέτοια optimizations θα γλυτώσετε αρκετή μνήμη η οποία θα σας χρειαστεί...

Όσων αφορά την σειριακή επικοινωνία, κρατάτε κυκλικό buffer (circular buffer), είναι το Α και το Ω στις σειριακές επικοινωνίες... υπάρχουν πάρα πολλές υλοποιήσεις για σειριακούς buffers, οι οποίες η κάθε μια εξυπηρετεί και άλλους σκοπούς, πχ ταχύτητα, ευκολία εισαγωγής ή εξαγωγής δεδομένων κτλ... αν και θα έπρεπε λίγο να ψηθείτε για να δείτε πια είναι η πιο βέλτιστη λύση, κυρίως για να καταλάβετε τον λόγο για τον οποίο είναι βέλτιστη, θα σας δώσω αυτό το hint... έχει σημασία, γιατί πρέπει να χρησιμοποιήσετε τέτοιο buffer σε τέτοιου είδους εφαρμογής...

Για το receiving (rx) των δεδομένων, θα το κάνετε με interrupts και ΜΟΝΟ με interrupts... κανονικά και το tx θα έπρεπε να το κάνετε με interrupts και να έχετε μια handling ρουτίνα η οποία μέσα στον κύκλο της main να παρακολουθεί αν υπάρχουν δεδομένα για αποστολή, να τα στέλνει και να παρακολουθεί από το interrupt αν ολοκληρώθηκε η αποστολή... Γενικά σε μC ποτέ blocking states, η main πρέπει να έχει μόνο handler functions που έχουν states, κάνουν polling στα resources του μC και γενικά αναλαμβάνουν πολύ κεντρικές λειτουργείες... πχ

void main()
{
InitHardware();
InitHandlers();
InitTimers();
EnableInterrupts();
while(1) {
RxHandler();
TxHandler();
...
...
}
}

To παραπάνω σημαίνει ότι κρατάς καθαρή την main σου και τρέχεις μόνο κεντρικές handling ρουτίνες οι οποίες δεν είναι blocking και δεν πρέπει σε καμία περίπτωση ο κύκλος την main ρουτίνας σου να είναι μεγαλύτερος από μερικά ms... όλα θα γίνονται με states μέσα στους handlers... άσε τον buffer να γεμίζει, σε κάθε interrupt πέτα το byte μέσα στον buffer και βγες κατ' ευθείαν από τον interrupt, μην κάνεις καμία διαδικασία, άσε τον RxHander(), όταν έρθει η ώρα του να εκτελεστεί να ελέγξει αν υπάρχουν δεδομένα στον buffer και αν πρέπει να τα χειριστεί... βάλε states στο RxHandler, είναι σε RxStateInit, RxStateReceiving, RxStateReceiveingW...? RxStateInit=είναι άδειος και περιμένει, RxStateReceiving=έχει έρθει τουλάχιστον ένα byte, RxStateReceiveingW=έχουν έρθει κάμποσα bytes αλλά έχει έρθει και ένα /r/n που σημαίνει ότι μάλλον έχει κάποια απάντηση, αλλά παρόλ' αυτά συνεχίζει να μαζεύει να δεδομένα...

Ελπίζω να έπιασες το νόημα... η εκτέλεση του κώδικα πρέπει να ρέει, δεν πρέπει να σταματάει πουθενά και να περιμένει...

Τώρα, το AT+WIND=4 δεν είναι εντολή που στέλνεις εσύ στο modem, το ΑΤ+WIND=255 στέλνεις... έχοντας στείλει αυτό και κάνοντας reset (AT+CFUN=1), θα πρέπει να πάρεις κάποια στιγμή το "+WIND: 4"...

Μια ματσακονιά που μπορείς να κάνεις, αλλά στην αναφέρω σαν έσχατη λύση και όχι σαν λύση που θα έμπαινε σε κώδικα προϊόντος, είναι η εντολή AT+WRST, κοίταξέ την στο manual... με αυτήν μπορείς να φτιάξεις ένα τεχνητό και καλά watchdog, το οποίο το ενεργοποιείς πριν κάνεις κάτι χρονοβόρο, πχ αποστολή δεδομένων και να το απενεργοποιείς όταν επιστρέψεις από την αποστολή... δεν λέω κάτι παραπάνω σε αυτό, γιατί είναι κακή πρακτική, απλά έχε το στο νου σου...

Keep on, έχετε φτάσει ήδη στην μέση αν όχι παραπέρα...

Link to comment
Share on other sites

:respect: Jaco, το θέμα το κατέχεις πάρα πολυ!

Το πρόβλημα που θα έχετε με τον 8051 θα είναι κυρίως η ram, με την rom δεν θα πρέπει να έχετε πρόβλημα, απλά θα πρέπει να διαχειριστείτε λίγο ποιο έξυπνα την μνήμη σας... επίσης επειδή πλέον δουλεύετε με ascii πρωτόκολλα όπως το AT, θα πρέπει να έχετε επίβλεψη του stack έτσι ώστε να μην κάνετε overflow, οπότε θα πρέπει να δουλεύεται με pointers... Όσων αφορά την μνήμη, αν θέλετε να μειώσετε την χρήση της, τότε μπορείτε να δηλώσετε το "ΑΤ+" σαν global ώστε να πιάσει χώρο στο heap και να μην δημιουργείτε ούτε δυναμικά κάθε φορά, αλλά και αν έχετε πολλές εντολές στο heap να πιάνουν 3bytes λιγότερα η κάθε μια... με κάτι τέτοια optimizations θα γλυτώσετε αρκετή μνήμη η οποία θα σας χρειαστεί...

Προς το παρόν το πρόβλημα με τη δήλωση των εντολών το αντιμετωπίζουμε με χρήση #defines των string constants. o compiler πάει και τα ενσωματώνει στο memory code οπότε εξοικωνομούμε μνήμη απ' εκεί. Δυναμική δέσμευση δεν έχουμε κάνει πουθενά...Ο λόγος ότι παιδιά που έχουν δουλέψει εδώ στο εργαστήριο πάρα πολύ τον 8051 σε επίπεδο διπλωματικής μας προτείνανε να το αποφύγουμε. Οπότε εξού και τα defines, που όμως για τη περίπτωση μας βολεύουν μία χαρά. Τα constant strings τα χειρίζεται κανονικά οπότε μπορούμε και γράφουμε byte byte με interrupts όπως προτείνεις και εσύ.

Όσων αφορά την σειριακή επικοινωνία, κρατάτε κυκλικό buffer (circular buffer), είναι το Α και το Ω στις σειριακές επικοινωνίες... υπάρχουν πάρα πολλές υλοποιήσεις για σειριακούς buffers, οι οποίες η κάθε μια εξυπηρετεί και άλλους σκοπούς, πχ ταχύτητα, ευκολία εισαγωγής ή εξαγωγής δεδομένων κτλ... αν και θα έπρεπε λίγο να ψηθείτε για να δείτε πια είναι η πιο βέλτιστη λύση, κυρίως για να καταλάβετε τον λόγο για τον οποίο είναι βέλτιστη, θα σας δώσω αυτό το hint... έχει σημασία, γιατί πρέπει να χρησιμοποιήσετε τέτοιο buffer σε τέτοιου είδους εφαρμογής...

Για το receiving (rx) των δεδομένων, θα το κάνετε με interrupts και ΜΟΝΟ με interrupts... κανονικά και το tx θα έπρεπε να το κάνετε με interrupts και να έχετε μια handling ρουτίνα η οποία μέσα στον κύκλο της main να παρακολουθεί αν υπάρχουν δεδομένα για αποστολή, να τα στέλνει και να παρακολουθεί από το interrupt αν ολοκληρώθηκε η αποστολή... Γενικά σε μC ποτέ blocking states, η main πρέπει να έχει μόνο handler functions που έχουν states, κάνουν polling στα resources του μC και γενικά αναλαμβάνουν πολύ κεντρικές λειτουργείες... πχ

void main()
{
InitHardware();
InitHandlers();
InitTimers();
EnableInterrupts();
while(1) {
RxHandler();
TxHandler();
...
...
}
}

Τη main μας έτσι προσπαθούμε να τη δομήσουμε. Κάνουμε initializes των ports/ της σειριακής κτλ και μετά καλούμε τη συνάρτηση που θα λάβει τα δεδομένα απο το radio κομμάτι του κάθε κόμβου μας (mcu+ ένα ραδιοφωνάκι στα 2,4ghz που μιλάει με άλλους κόμβους). Αυτο προς το παρών θεωρούμε ότι απλά είναι ενας ετοιμος buffer. οταν θα προχωρήσουμε θα την ενεργοποιήσουμε και αυτη τη λειτουργικότητα. μετά ακολουθεί το initialize του modem, gprs και tcp/ip και όπως μας έχεις προτείνει θα δομηθεί με states.

Mία αποριούλα. Το read/write εμείς το επιχειρούμε ελέγχοντας τις μεταβλητές RI0/TI0 που σύμφωνα με το manual γίνονται 1 όταν ερχεται κάποιο hardware interrupt από την UART. Aυτό το while(RI0!=1) είναι blocking διαδικασία; Απ' αυτά που ξέρουμε blocking είναι η printf() και η scanf() που "κολλάνε" το σύστημα μέχρι να διαβάσουνε/γραψουνε.

τον κυκλικό buffer αν και δεν αμφιβάλλω ότι έχει μεγάλη αξία δεν έχουμε προλάβει ακομη να το δούμε γιατι προσπαθοούμε με τα απλά πραγματάκια που ξέρουμε (write χαρακτήρα χαρακτήρα και read χαρακτήρα χαρακτήρα) να γράψουεμ και να διαβάσουμε απαντήσεις. Αλλωστε πλέον τελειώνει και ο χρόνος που έχουμε οπότε θα πρέπει να παρουσιάσουμε κάτι οσο πιο ολοκληρωμένο γινεται αφού σε ένα 5ήμερο έχει παρουσίαση της εργασίας.

To παραπάνω σημαίνει ότι κρατάς καθαρή την main σου και τρέχεις μόνο κεντρικές handling ρουτίνες οι οποίες δεν είναι blocking και δεν πρέπει σε καμία περίπτωση ο κύκλος την main ρουτίνας σου να είναι μεγαλύτερος από μερικά ms... όλα θα γίνονται με states μέσα στους handlers... άσε τον buffer να γεμίζει, σε κάθε interrupt πέτα το byte μέσα στον buffer και βγες κατ' ευθείαν από τον interrupt, μην κάνεις καμία διαδικασία, άσε τον RxHander(), όταν έρθει η ώρα του να εκτελεστεί να ελέγξει αν υπάρχουν δεδομένα στον buffer και αν πρέπει να τα χειριστεί... βάλε states στο RxHandler, είναι σε RxStateInit, RxStateReceiving, RxStateReceiveingW...? RxStateInit=είναι άδειος και περιμένει, RxStateReceiving=έχει έρθει τουλάχιστον ένα byte, RxStateReceiveingW=έχουν έρθει κάμποσα bytes αλλά έχει έρθει και ένα /r/n που σημαίνει ότι μάλλον έχει κάποια απάντηση, αλλά παρόλ' αυτά συνεχίζει να μαζεύει να δεδομένα...

Ελπίζω να έπιασες το νόημα... η εκτέλεση του κώδικα πρέπει να ρέει, δεν πρέπει να σταματάει πουθενά και να περιμένει...

Τώρα, το AT+WIND=4 δεν είναι εντολή που στέλνεις εσύ στο modem, το ΑΤ+WIND=255 στέλνεις... έχοντας στείλει αυτό και κάνοντας reset (AT+CFUN=1), θα πρέπει να πάρεις κάποια στιγμή το "+WIND: 4"...

Μια ματσακονιά που μπορείς να κάνεις, αλλά στην αναφέρω σαν έσχατη λύση και όχι σαν λύση που θα έμπαινε σε κώδικα προϊόντος, είναι η εντολή AT+WRST, κοίταξέ την στο manual... με αυτήν μπορείς να φτιάξεις ένα τεχνητό και καλά watchdog, το οποίο το ενεργοποιείς πριν κάνεις κάτι χρονοβόρο, πχ αποστολή δεδομένων και να το απενεργοποιείς όταν επιστρέψεις από την αποστολή... δεν λέω κάτι παραπάνω σε αυτό, γιατί είναι κακή πρακτική, απλά έχε το στο νου σου...

Keep on, έχετε φτάσει ήδη στην μέση αν όχι παραπέρα...

Ειχαμε μπερδευτεί και δίναμε AT+WIND=256 αντι για 255 οπότε παίζει γι'αυτό να μην βλέπαμε το +WIND: 4 ...

Nα 'σαι καλα πάντως, σε τόσο low level επίπεδο δεν ειχαμε προχωρησει ποτε :p

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Δημιουργία...

Important Information

Ο ιστότοπος theLab.gr χρησιμοποιεί cookies για να διασφαλίσει την καλύτερη εμπειρία σας κατά την περιήγηση. Μπορείτε να προσαρμόσετε τις ρυθμίσεις των cookies σας , διαφορετικά θα υποθέσουμε ότι είστε εντάξει για να συνεχίσετε.