
حل مشکل ارسال نشدن SMS در ماژول SIM800C
ماژولهای خانواده SIM800، از جمله SIM800C و SIM800H هنوز هم در پروژههای کنترل از راه دور، سیستمهای امنیتی، دستگاههای ردیاب، پایش تجهیزات و اینترنت اشیا کاربرد زیادی دارند. یکی از مشکلات گیجکننده هنگام کار با این ماژولها آن است که فرایند ارسال پیامک ظاهراً بدون خطا انجام میشود، ماژول علامت > را نمایش میدهد، متن را دریافت میکند و پس از ارسال کاراکتر Ctrl+Z نیز پاسخ +CMGS و OK میدهد؛ اما پیامک هرگز به گوشی مقصد نمیرسد.
این وضعیت زمانی عجیبتر میشود که تماس صوتی و دریافت پیامک بدون مشکل کار میکنند، شماره مرکز پیام صحیح است و حتی هزینه پیامک از اعتبار سیمکارت کم میشود. در برخی موارد نیز پیامک از یک اپراتور به همان اپراتور ارسال میشود، اما ارسال بین دو اپراتور مختلف با شکست مواجه میشود.
در این مقاله، علتهای احتمالی این مشکل را مرحلهبهمرحله بررسی میکنیم و توضیح میدهیم چرا دستور زیر در بسیاری از ماژولهای SIM800C مشکل را برطرف میکند:
|
1 2 |
AT+CSMP=17,167,0,0 |
همچنین روش کامل آزمایش ارسال پیامک، بررسی وضعیت شبکه، تغذیه، مرکز پیام، قالب متن، گزارش تحویل و مشکلات مربوط به پیامک فارسی را مرور خواهیم کرد.
صورت مسئله: ماژول +CMGS میدهد، اما پیامک نمیرسد
یک فرایند معمول برای ارسال پیامک در حالت متنی یا Text Mode به شکل زیر است:
|
1 2 |
AT+CMGF=1 |
پاسخ:
|
1 2 |
OK |
سپس شماره مقصد وارد میشود:
|
1 2 |
AT+CMGS="09123456789" |
ماژول علامت زیر را نمایش میدهد:
|
1 2 |
> |
پس از آن متن پیام نوشته شده و کاراکتر Ctrl+Z ارسال میشود. در ارتباط سریال، Ctrl+Z همان بایت هگزادسیمال 0x1A است.
اگر عملیات از نظر ماژول موفق باشد، معمولاً پاسخی مشابه زیر دریافت میشود:
|
1 2 3 4 |
+CMGS: 25 OK |
بسیاری از کاربران تصور میکنند نمایش +CMGS به معنی تحویل قطعی پیامک به گوشی مقصد است؛ در حالی که این برداشت دقیق نیست.
پاسخ +CMGS معمولاً نشان میدهد پیام برای ارسال به لایه شبکه یا مرکز پیام ثبت شده است. این پاسخ الزاماً ثابت نمیکند که پیامک به گوشی مقصد تحویل داده شده است. ممکن است پیام در مرکز پیام باقی بماند، به دلیل تنظیم نادرست قالب پیام رد شود، مسیر ارتباطی بین اپراتورها مشکل داشته باشد یا گوشی مقصد نتواند قالب پیام را تفسیر کند.
بنابراین اولین نکته مهم این است:
دریافت
+CMGSبه معنی پذیرفتهشدن درخواست ارسال توسط ماژول یا شبکه است، نه الزاماً تحویل نهایی پیامک به مقصد.
راهحل سریع: تنظیم پارامترهای پیامک با دستور AT+CSMP
“با سلام خدمت دوستان
من یه مشکل عجیب با sim800 دارم!!
موقع ارسال sms کاراکتر > میاد و من متن رو تایپ میکنم و ctrl+z رو هم میزنم و ماژول جواب CMGS+ رو میده اما SMS به مقصد نمیرسه!!
اینم بگم که از لحاظ دریافت SMS و تماس و … ماژول هیچ مشکلی نداره!
ینی مشکل از چی میتونه باشه؟
پ ن ۱ : شماره مرکز پیام رو هم چک کردم درسته!
پ ن ۲ : هزینه پیامک هم موقع ارسال کم میشه
”
در مشکل مطرحشده، پیامک در حالتهای زیر ارسال میشد:
- از سیمکارت همراه اول به ایرانسل
- از سیمکارت ایرانسل به ایرانسل
اما پیامک از سیمکارت ایرانسل داخل SIM800C به شماره همراه اول نمیرسید. همان سیمکارت وقتی داخل گوشی قرار میگرفت، میتوانست به همراه اول پیامک ارسال کند. بنابراین سیمکارت، اعتبار و شماره مقصد سالم بودند و مشکل به تنظیمات ماژول یا نحوه تشکیل پیام مربوط میشد.
دستوری که مشکل را برطرف کرد، این بود:
|
1 2 |
AT+CSMP=17,167,0,0 |
برای آزمایش سریع، بهتر است دستورات زیر را بهترتیب ارسال کنید:
|
1 2 3 4 5 6 7 8 |
AT AT+CPIN? AT+CREG? AT+CSQ AT+CMGF=1 AT+CSMP=17,167,0,0 AT+CMGS="09123456789" |
بعد از ظاهرشدن >، یک متن ساده انگلیسی مانند زیر بفرستید:
|
1 2 |
SIM800 SMS Test |
سپس بایت 0x1A یا همان Ctrl+Z را ارسال کنید.
اگر از Serial Monitor آردوینو استفاده میکنید، توجه داشته باشید که همه نسخههای Serial Monitor امکان ارسال مستقیم Ctrl+Z را ندارند. در چنین شرایطی بهتر است از نرمافزارهایی مانند Hercules، PuTTY، RealTerm یا یک برنامه اختصاصی سریال استفاده کنید. در کد آردوینو نیز میتوان این بایت را بهصورت زیر ارسال کرد:
|
1 2 |
sim800.write(26); |
عدد ۲۶ در مبنای دهدهی همان 0x1A است.
دستور AT+CSMP=17,167,0,0 چه کاری انجام میدهد؟
دستور AT+CSMP پارامترهای پیامک در حالت Text Mode را تنظیم میکند. قالب عمومی آن معمولاً به شکل زیر است:
|
1 2 |
AT+CSMP=<fo>,<vp>,<pid>,<dcs> |
چهار پارامتر این دستور عبارتاند از:
fo: بایت اول پیام یا First Octetvp: مدت اعتبار پیام یا Validity Periodpid: شناسه پروتکل یا Protocol Identifierdcs: طرح کدگذاری داده یا Data Coding Scheme
در دستور موردنظر داریم:
|
1 2 |
AT+CSMP=17,167,0,0 |
پارامتر اول: مقدار 17
مقدار 17 در مبنای دهدهی برابر 0x11 است. این مقدار مشخص میکند پیام از نوع SMS-SUBMIT است و مدت اعتبار آن بهصورت نسبی در پیام قرار میگیرد.
در عمل، این تنظیم برای ارسال یک پیامک متنی استاندارد مناسب است و در بسیاری از نمونههای SIM800 و SIM900 استفاده میشود.
پارامتر دوم: مقدار 167
این پارامتر مدت اعتبار پیام را مشخص میکند. مقدار 167 معمولاً معادل یک بازه اعتبار حدود ۲۴ ساعت در قالب نسبی GSM در نظر گرفته میشود.
مدت اعتبار تعیین میکند مرکز پیام تا چه زمانی تلاش کند پیامک را به مقصد تحویل دهد. برای مثال، اگر گوشی مقصد خاموش یا خارج از دسترس باشد، مرکز پیام میتواند در این بازه زمانی ارسال را دوباره امتحان کند.
پارامتر سوم: مقدار 0
پارامتر pid یا شناسه پروتکل روی مقدار استاندارد صفر قرار گرفته است. برای پیامک متنی معمولی، این مقدار عموماً انتخاب مناسبی است.
پارامتر چهارم: مقدار 0
مقدار dcs=0 پیام را در حالت متداول GSM 7-bit قرار میدهد. این حالت برای پیامهای انگلیسی و کاراکترهای استاندارد الفبای GSM مناسب است.
اگر قصد ارسال متن فارسی، عربی یا کاراکترهای یونیکد را دارید، مقدار صفر کافی نیست و باید از UCS2 یا حالت PDU استفاده کنید. در ادامه این موضوع را دقیقتر بررسی میکنیم.
چرا SIM900 بدون مشکل کار میکند، اما SIM800C نیاز به تنظیم دارد؟
ممکن است یک کد مشخص روی SIM900 کار کند، اما همان کد روی SIM800C رفتار متفاوتی داشته باشد. این موضوع لزوماً به معنی خرابی SIM800C نیست.
دلایل احتمالی عبارتاند از:
- متفاوتبودن تنظیمات کارخانهای یا پروفایل ذخیرهشده
- تفاوت نسخه Firmware ماژولها
- باقیماندن تنظیمات پروژه قبلی در حافظه ماژول
- تفاوت مقدار پیشفرض
CSMP - تفاوت نحوه تفسیر قالب پیام توسط شبکه
- تفاوت در تنظیمات کاراکترست یا Coding Scheme
- تفاوت در نحوه ذخیره و بازیابی تنظیمات SMS
برای مشاهده تنظیم فعلی CSMP میتوانید دستور زیر را ارسال کنید:
|
1 2 |
AT+CSMP? |
پاسخ ممکن است چیزی شبیه این باشد:
|
1 2 |
+CSMP: 17,167,0,0 |
اگر مقدار متفاوتی مشاهده کردید، آن را با دستور پیشنهادی اصلاح کنید:
|
1 2 |
AT+CSMP=17,167,0,0 |
همچنین بهتر است برنامه شما در هر بار روشنشدن ماژول، تنظیمات ضروری را دوباره اعمال کند. اتکا به تنظیمات پیشفرض یا مقادیر ذخیرهشده در حافظه میتواند باعث شود یک دستگاه درست کار کند و دستگاه ظاهراً مشابه دیگری پیامک نفرستد.
در برخی Firmwareها میتوان تنظیمات پیامک را با دستورات ذخیرهسازی پروفایل ذخیره کرد، اما سازگاری این قابلیت در نسخههای مختلف یکسان نیست. مطمئنترین روش این است که برنامه اصلی هنگام راهاندازی، دستورهای CMGF، CSMP، CSCS و سایر تنظیمات لازم را صریحاً ارسال و پاسخ OK را بررسی کند.
مراحل استاندارد عیبیابی ارسال SMS در SIM800C
دستور CSMP راهحل مهمی است، اما اگر مشکل با آن برطرف نشد، باید عیبیابی را به شکل منظم ادامه دهید.
۱. بررسی ارتباط سریال
ابتدا دستور زیر را ارسال کنید:
|
1 2 |
AT |
پاسخ صحیح باید این باشد:
|
1 2 |
OK |
اگر پاسخی دریافت نمیکنید، این موارد را بررسی کنید:
- اتصال TX ماژول به RX میکروکنترلر
- اتصال RX ماژول به TX میکروکنترلر
- مشترکبودن GND
- صحیحبودن Baud Rate
- مناسببودن سطح ولتاژ منطقی پایه RX ماژول
- نبودن نویز یا سیمهای بیش از حد بلند
اتصال TX به TX و RX به RX اشتباه است. در اتصال متقاطع، TX هر دستگاه باید به RX دستگاه دیگر متصل شود.
همچنین همه بردهای SIM800C دقیقاً یکسان نیستند. برخی بردها مبدل سطح ولتاژ دارند و برخی ندارند. قبل از اتصال مستقیم خروجی ۵ ولتی آردوینو UNO به پایه RX ماژول، شماتیک یا مشخصات همان برد را بررسی کنید. در صورت نبود Level Shifter، استفاده از تقسیم مقاومتی یا مبدل سطح منطقی توصیه میشود.
۲. بررسی آمادهبودن سیمکارت
دستور زیر را بفرستید:
|
1 2 |
AT+CPIN? |
پاسخ مناسب:
|
1 2 |
+CPIN: READY |
اگر ماژول درخواست PIN کند، باید رمز سیمکارت را وارد کنید یا قفل PIN را با قرار دادن سیمکارت در گوشی غیرفعال کنید.
۳. بررسی ثبتشدن در شبکه
برای بررسی وضعیت ثبت در شبکه از دستور زیر استفاده کنید:
|
1 2 |
AT+CREG? |
پاسخهای مناسب معمولاً شامل وضعیت 1 یا 5 هستند:
|
1 2 |
+CREG: 0,1 |
یا:
|
1 2 |
+CREG: 0,5 |
وضعیت 1 یعنی ثبت در شبکه خانگی و وضعیت 5 معمولاً به معنی ثبت در حالت رومینگ است.
اگر مقادیری مانند 0، 2 یا 3 دریافت میکنید، ماژول هنوز به شبکه متصل نشده یا ثبت آن رد شده است. در چنین شرایطی، قبل از بررسی SMS باید مشکل شبکه، آنتن، سیمکارت یا پوشش 2G حل شود.
۴. بررسی قدرت سیگنال
دستور زیر را ارسال کنید:
|
1 2 |
AT+CSQ |
پاسخی مانند زیر دریافت میشود:
|
1 2 |
+CSQ: 18,0 |
عدد اول قدرت تقریبی سیگنال را نشان میدهد. مقدار 99 به معنی نامشخصبودن سیگنال است. هرچه مقدار عددی به محدوده بالاتر نزدیکتر باشد، کیفیت دریافت معمولاً بهتر است.
سیگنال ضعیف ممکن است باعث شود ماژول در شبکه ثبت شود، اما هنگام ارسال پیام یا برقراری ارتباط پایدار نباشد. محل آنتن، کیفیت آنتن، کابل، کانکتور و فاصله از منابع نویز را بررسی کنید.
۵. قراردادن ماژول در حالت Text Mode
برای ارسال متنی SMS از دستور زیر استفاده کنید:
|
1 2 |
AT+CMGF=1 |
پاسخ مورد انتظار:
|
1 2 |
OK |
برای مشاهده حالت فعلی نیز میتوانید بنویسید:
|
1 2 |
AT+CMGF? |
اگر مقدار 0 باشد، ماژول در حالت PDU قرار دارد. اگر برنامه شما دستورهای مخصوص Text Mode را ارسال کند، اما ماژول در PDU Mode باشد، نتیجه صحیح نخواهد بود.
۶. بررسی شماره مرکز پیام
برای مشاهده شماره مرکز پیام یا SMSC دستور زیر را وارد کنید:
|
1 2 |
AT+CSCA? |
معمولاً شماره مرکز پیام از اطلاعات سیمکارت خوانده میشود و نیازی به تغییر دستی آن نیست. اگر این مقدار خالی یا اشتباه بود، میتوان شماره صحیح اپراتور را تنظیم کرد؛ با این حال، شماره مرکز پیام باید از منبع معتبر مربوط به همان اپراتور گرفته شود.
تغییر تصادفی CSCA ممکن است وضعیت را بدتر کند. اگر سیمکارت در گوشی پیامک میفرستد، ولی در SIM800C نه، ابتدا CSMP، قالب پیام و تغذیه را بررسی کنید و سپس سراغ تغییر SMSC بروید.
۷. آزمایش با شماره بینالمللی
گاهی استفاده از قالب بینالمللی شماره، نتیجه مطمئنتری دارد. برای یک شماره ایرانی، بهجای صفر ابتدایی از +98 استفاده کنید:
|
1 2 |
AT+CMGS="+989121234567" |
اگر شماره با قالب داخلی ارسال نمیشود، آن را با قالب بینالمللی امتحان کنید. وجود علامت + و کد کشور اهمیت دارد.
مشکل ارسال بین دو اپراتور متفاوت
یکی از نکات مهم در این مشکل آن بود که پیامک درون یک اپراتور ارسال میشد، اما ارسال از ایرانسل به همراه اول انجام نمیشد. این الگو میتواند نشانه یکی از موارد زیر باشد:
- حساسیت مسیر بیناپراتوری به قالب یا DCS پیام
- نامعتبر یا غیرمعمولبودن برخی بیتهای First Octet
- تنظیم اشتباه مدت اعتبار
- مشکل موقت در مسیر ارتباطی اپراتورها
- فیلترشدن پیام به دلیل قالب غیرمعمول
- مشکل Firmware یا تنظیمات ذخیرهشده ماژول
- وجود UDH یا اطلاعات کنترلی نامعتبر
وقتی سیمکارت در گوشی بهدرستی پیام را ارسال میکند، مشخص میشود حساب مشترک، اعتبار و سرویس پایه SMS فعال است. در این حالت باید تفاوت میان پیامی که گوشی تولید میکند و پیامی که SIM800C میسازد بررسی شود. دستور AT+CSMP=17,167,0,0 باعث میشود پارامترهای پیام به یک حالت استاندارد و قابلپیشبینی برگردند؛ به همین دلیل ممکن است مسیر بیناپراتوری نیز آن را بدون مشکل بپذیرد.
بااینحال، اگر مشکل فقط در یک بازه زمانی رخ میدهد و بعد بدون تغییر تنظیمات برطرف میشود، احتمال اختلال موقت اپراتور یا مرکز پیام نیز وجود دارد. بهتر است آزمایش با چند شماره، چند اپراتور و در چند زمان مختلف انجام شود.
چرا هزینه پیامک کم میشود، اما پیام تحویل داده نمیشود؟
کمشدن اعتبار به معنی تحویل قطعی پیام به گوشی مقصد نیست. اپراتور ممکن است هزینه را زمانی محاسبه کند که پیام در مرکز پیام پذیرفته شده باشد. پس از آن، تحویل ممکن است به دلایل زیر انجام نشود:
- خاموشبودن یا خارج از دسترس بودن گوشی مقصد
- منقضیشدن مدت اعتبار پیام
- مسدودبودن سرویس پیامک در مقصد
- مشکل در مسیر بیناپراتوری
- نامعتبر بودن نوع یا قالب پیام
- فیلترشدن پیام توسط شبکه
- خرابی یا شلوغی موقت مرکز پیام
- کدگذاری نادرست متن
- نامعتبر بودن شماره مقصد
بنابراین همزمانی کمشدن اعتبار و دریافت +CMGS فقط نشان میدهد مرحلهای از ارسال انجام شده است.
فعالکردن گزارش تحویل پیامک
برای تشخیص بهتر میتوان از Status Report یا گزارش وضعیت استفاده کرد. در بسیاری از پیادهسازیها، با فعالکردن بیت درخواست گزارش وضعیت در First Octet میتوان از شبکه درخواست کرد نتیجه تحویل را اعلام کند.
برای مثال، بهجای مقدار 17 ممکن است از مقدار 49 استفاده شود:
|
1 2 |
AT+CSMP=49,167,0,0 |
عدد 49 برابر 17+32 است و بیت مربوط به درخواست Status Report را فعال میکند. سپس باید تنظیمات دریافت اعلانهای پیامک، مانند AT+CNMI، متناسب با Firmware و برنامه شما انجام شود.
یک نمونه رایج برای نمایش مستقیم بعضی رویدادهای پیامک روی پورت سریال ممکن است چنین باشد:
|
1 2 |
AT+CNMI=2,1,0,1,0 |
اما رفتار دقیق CNMI و نحوه ارائه گزارش تحویل ممکن است با نسخه Firmware، حالت حافظه پیامک و پشتیبانی اپراتور متفاوت باشد. همه اپراتورها نیز الزاماً گزارش تحویل را برای تمام پیامها و در تمام شرایط ارائه نمیکنند.
پس گزارش تحویل ابزار مفیدی است، اما نبود آن همیشه به معنی ارسالنشدن پیام نیست.
مشکل پیامک فارسی و خطای Content Not Supported
یکی دیگر از مشکلات گزارششده در SIM800C این است که پیام به گوشی میرسد، اما در برخی گوشیهای اندرویدی بهجای متن، عبارتهایی مانند Content not supported نمایش داده میشود. این مشکل معمولاً با ارسالنشدن کامل پیام تفاوت دارد.
اگر پیام به صندوق ورودی گوشی رسیده ولی محتوا نمایش داده نمیشود، احتمالاً یکی از موارد زیر رخ داده است:
- مقدار DCS با محتوای واقعی پیام هماهنگ نیست
- متن فارسی بهصورت یونیکد فرستاده شده، اما DCS روی GSM 7-bit است
- داده UCS2 بهدرستی به هگزادسیمال تبدیل نشده است
- طول پیام اشتباه محاسبه شده است
- پیام PDU ساختار نامعتبر دارد
- هدر UDH بهاشتباه ایجاد شده است
- کاراکترهای خارج از الفبای GSM در حالت
dcs=0ارسال شدهاند
دستور زیر برای متن ساده انگلیسی مناسب است:
|
1 2 |
AT+CSMP=17,167,0,0 |
اما برای فارسی باید از UCS2 استفاده شود. در این حالت DCS معمولاً روی 8 قرار میگیرد:
|
1 2 |
AT+CSMP=17,167,0,8 |
همچنین ممکن است لازم باشد کاراکترست ماژول روی UCS2 تنظیم شود:
|
1 2 |
AT+CSCS="UCS2" |
پس از آن، شماره مقصد و متن باید مطابق انتظار Firmware به رشته هگزادسیمال UCS2 تبدیل شوند. برای مثال، ارسال مستقیم حروف فارسی پس از انتخاب UCS2 معمولاً کافی نیست؛ برنامه باید متن را به کدهای صحیح یونیکد تبدیل کند.
برای پروژههای حرفهای و پیامهای فارسی، استفاده از PDU Mode اغلب کنترل دقیقتری روی موارد زیر فراهم میکند:
- نوع کدگذاری
- شماره مقصد
- طول پیام
- پیامهای چندبخشی
- UDH
- درخواست گزارش تحویل
- UCS2
البته PDU پیچیدهتر است و کوچکترین خطا در طول داده یا هدر میتواند باعث ارسال پیام خراب شود.
نقش بسیار مهم تغذیه در SIM800C
اگر SIM800C هنگام تلاش برای اتصال به شبکه یا ارسال پیام خاموش یا ریست میشود، تقریباً همیشه باید تغذیه را بهعنوان اولین مظنون بررسی کرد.
ماژول هنگام ارسال رادیویی جریان پالسی قابلتوجهی مصرف میکند. ممکن است مولتیمتر ولتاژ ۴ ولت را نشان دهد، اما در یک پالس کوتاه ولتاژ افت کند و ماژول ریست شود. مولتیمترهای معمولی اغلب افتهای بسیار سریع را نمایش نمیدهند.
نکات مهم تغذیه عبارتاند از:
- استفاده از منبعی با توان تأمین جریان پالسی کافی
- کوتاه و ضخیمبودن سیمهای تغذیه
- اتصال زمین مناسب و کممقاومت
- قراردادن خازن Low-ESR نزدیک پایه تغذیه ماژول
- استفاده از خازن سرامیکی در کنار خازن الکترولیتی
- تنظیم ولتاژ در محدوده مجاز برد یا ماژول
- بررسی افت ولتاژ با اسیلوسکوپ
- توجه به کیفیت ماژول کاهنده و سلف آن
استفاده از LM2596 و یک خازن بزرگ بهتنهایی تضمین نمیکند تغذیه مناسب باشد. اگر سیمها بلند و نازک باشند، خازن از ماژول فاصله داشته باشد، منبع ورودی ضعیف باشد یا برد مبدل کیفیت مناسبی نداشته باشد، باز هم افت ولتاژ رخ میدهد.
اینکه ماژول بدون سیمکارت روشن میماند ولی با قراردادن سیمکارت هنگام جستوجو یا ثبت در شبکه خاموش میشود، نشانه بسیار قدرتمندی از مشکل تغذیه است؛ زیرا بدون سیمکارت بخش رادیویی بار کامل خود را ایجاد نمیکند.
نمونه کد ساده آردوینو برای ارسال SMS
نمونه زیر ساختار پایه ارسال پیامک انگلیسی را نشان میدهد. پایهها و Baud Rate را باید با برد واقعی خود تطبیق دهید:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
#include <SoftwareSerial.h> SoftwareSerial sim800(7, 8); // RX, TX void sendCommand(const char* command, unsigned long waitTime = 1000) { sim800.println(command); unsigned long startTime = millis(); while (millis() - startTime < waitTime) { while (sim800.available()) { Serial.write(sim800.read()); } } } void setup() { Serial.begin(9600); sim800.begin(9600); delay(3000); sendCommand("AT"); sendCommand("AT+CPIN?"); sendCommand("AT+CREG?"); sendCommand("AT+CSQ"); sendCommand("AT+CMGF=1"); sendCommand("AT+CSMP=17,167,0,0"); sim800.println("AT+CMGS=\"+989121234567\""); delay(1000); sim800.print("SIM800C SMS Test"); sim800.write(26); delay(10000); while (sim800.available()) { Serial.write(sim800.read()); } } void loop() { while (sim800.available()) { Serial.write(sim800.read()); } while (Serial.available()) { sim800.write(Serial.read()); } } |
در پروژه واقعی بهتر است بهجای delayهای ثابت، پاسخ ماژول تحلیل شود. برنامه باید منتظر OK، علامت >، +CMGS یا خطاهایی مانند +CMS ERROR بماند و برای هر مرحله Timeout مشخص داشته باشد.
همچنین قبل از ارسال پیام باید ثبت شبکه بررسی شود. ارسال دستور CMGS بلافاصله پس از روشنکردن ماژول، بدون انتظار برای اتصال به شبکه، روش قابلاعتمادی نیست.
خطاهایی که باید در برنامه ثبت شوند
برای عیبیابی بهتر، نمایش خطاهای تشریحی را فعال کنید:
|
1 2 |
AT+CMEE=2 |
این دستور باعث میشود در بسیاری از موارد بهجای یک ERROR ساده، توضیح دقیقتری دریافت کنید. البته برای خطاهای SMS ممکن است پاسخهایی با قالب +CMS ERROR نیز نمایش داده شوند.
برنامه باید تمام پاسخهای ماژول را در یک لاگ ذخیره کند، بهخصوص:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
RDY Call Ready SMS Ready +CPIN +CREG +CGREG +CSQ +CMS ERROR +CME ERROR +CMGS NORMAL POWER DOWN UNDER-VOLTAGE WARNING |
وجود لاگ کامل کمک میکند تفاوت میان مشکل شبکه، قالب پیام، تغذیه و ارتباط سریال مشخص شود.
سرعت ارسال پیامک با SIM800C چقدر است؟
برای سرعت ارسال SMS نمیتوان یک عدد ثابت و تضمینشده مانند «چند پیام در دقیقه» اعلام کرد. زمان ارسال به عوامل مختلفی وابسته است:
- کیفیت سیگنال
- شلوغی شبکه
- زمان پاسخ مرکز پیام
- اپراتور فرستنده و گیرنده
- ارسال درونشبکهای یا بیناپراتوری
- طول و تعداد بخشهای پیام
- فاصله بین فرمانها
- Firmware ماژول
- محدودیتهای ضداسپم اپراتور
ارسال پشتسرهم پیامها بدون انتظار برای پاسخ +CMGS روش درستی نیست. هر پیام باید کامل شود و سپس پیام بعدی ارسال گردد. همچنین اپراتورها ممکن است ارسال انبوه از سیمکارت عادی را محدود یا مسدود کنند.
اگر پروژه به ارسال تعداد زیادی پیام در دقیقه نیاز دارد، استفاده از سیمکارت معمولی و یک ماژول GSM ممکن است راهکار مناسبی نباشد. در چنین کاربردهایی باید سرویسهای سازمانی پیامک، پنل SMS، چند مودم مدیریتشده یا راهکارهای مورد تأیید اپراتور بررسی شوند.
چکلیست نهایی رفع مشکل
اگر SIM800C پاسخ +CMGS میدهد ولی پیامک تحویل نمیشود، این مراحل را انجام دهید:
- با
ATارتباط سریال را آزمایش کنید. - با
AT+CPIN?آمادهبودن سیمکارت را بررسی کنید. - با
AT+CREG?از ثبت شبکه مطمئن شوید. - با
AT+CSQقدرت سیگنال را بررسی کنید. - حالت متنی را با
AT+CMGF=1فعال کنید. - تنظیمات پیام را با دستور زیر استاندارد کنید:
12AT+CSMP=17,167,0,0 - شماره مرکز پیام را با
AT+CSCA?بررسی کنید. - شماره مقصد را با قالب بینالمللی
+98امتحان کنید. - ابتدا یک پیام کاملاً انگلیسی و کوتاه ارسال کنید.
- برای پایان متن حتماً بایت
0x1Aرا بفرستید. - سیمکارت را روی گوشی آزمایش کنید.
- ارسال به شمارههای همان اپراتور و اپراتور دیگر را مقایسه کنید.
- تغذیه را هنگام ارسال با اسیلوسکوپ بررسی کنید.
- برای متن فارسی از UCS2 یا PDU صحیح استفاده کنید.
- پاسخ کامل ماژول و خطاهای
CMSرا ثبت کنید. - در صورت نیاز، گزارش تحویل را فعال کنید.
- تنظیمات ضروری را هنگام هر بار راهاندازی دوباره اعمال کنید.
جمعبندی
مشکل ارسالنشدن پیامک در SIM800C، با وجود دریافت +CMGS، الزاماً به خرابی ماژول یا سیمکارت مربوط نیست. در بسیاری از موارد، تنظیم نامناسب پارامترهای SMS باعث میشود پیام در یک مسیر یا اپراتور پذیرفته شود، اما در مسیر دیگری تحویل داده نشود.
دستور زیر یکی از مهمترین راهحلهای این وضعیت است:
|
1 2 |
AT+CSMP=17,167,0,0 |
این دستور پارامترهای پیامک را برای ارسال متن استاندارد تنظیم میکند و در مسئلهای که پیامک از ایرانسل به همراه اول نمیرسید، راهحل مؤثری بوده است.
بااینحال، اگر مشکل ادامه داشت، نباید فقط روی یک فرمان تمرکز کرد. وضعیت ثبت در شبکه، قدرت سیگنال، شماره مرکز پیام، قالب شماره مقصد، کدگذاری متن، نسخه Firmware، تغذیه و نحوه ارسال Ctrl+Z همگی باید بررسی شوند.
برای متن انگلیسی، Text Mode و DCS=0 معمولاً کافی است؛ اما برای پیام فارسی باید UCS2 یا PDU بهدرستی پیادهسازی شود. همچنین اگر ماژول هنگام اتصال به شبکه خاموش یا ریست میشود، حتی در صورت استفاده از رگولاتور و خازن بزرگ، تغذیه همچنان اولین موردی است که باید با ابزار مناسب بررسی شود.
در نهایت، بهترین روش برای ساخت یک سیستم قابلاعتماد این است که برنامه در زمان راهاندازی تمام تنظیمات لازم را اعمال کند، پاسخ هر فرمان را کنترل کند، برای مراحل مختلف Timeout داشته باشد و گزارش کامل ارتباط با ماژول را ذخیره کند. با این رویکرد، مشکلات ظاهراً عجیب SIM800C به خطاهایی مشخص و قابلحل تبدیل خواهند شد.



