اگر به این بخش از کد توجه کنید
while (true)
{
value = gsmSerial.readStringUntil('\n');
if (value.startsWith("OK"))
{
Serial.println(output);
//دستور ارسال پیام
break;
}
else
{
output = output + value + "\n";
}
ما یک حلقه بینهایت ساخته ایم که به صورت یکسره سریال مانیتور را میخواند و به صورت خط به خط داخل مقدار value میریزید.
زمانی که این مقدار برابر با OK باشد این حلقه بینهایت شکسته می شود و بیرون می آید.
در غیر این صورت مقدار ها را جمع کرده با هم و در زمانی که حلقه شکسته شود نمایش داده شود.
حال برای بررسی اینکه چرا این حلقه برای شما کار نمیکند ابتدا این فاکنشن را در انتهای کد خود قرار بدهید تا مورد بررسی قرار بدهیم.
void debug()
{
Serial.println("\ndebug mode");
while (true)
{
while (Serial.available())
{
gsmSerial.write(Serial.read()); // Forward what Serial received to Software Serial Port
}
while (gsmSerial.available())
{
Serial.write(gsmSerial.read()); // Forward what Software Serial received to Serial Port
}
}
}
حال پس از خط
gsmSerial.println("AT+CBC");
دستور
debug();
را بزنید تا برنامه در این بخش وارد فانکشن دیباگ بود.
حال بررسی کنید در سریال مانیتور به چه صورت دیتا برای شما می آید.
منظور بنده از بررسی این می باشد که بعد از ارسال دستور AT+CBC ماژول دقیقا چه چیز هایی را به شما برمیگرداند.
اگر OK برگشتی وجود دارد که یک مساله این می باشد که قبل و بعد این OK آیا Space اضافه وجود دارد یا خیر؟
در صورت وجود می توانید با دستور زیر این مشکل را حل کنید.
value = gsmSerial.readStringUntil('\n');
value.trim();
در صورتی که کلمه OK برای شما نمی آید به احتمال زیاد دستور +CBC برای شما می آید.
که می توانید از طریق همین کلمه کلیدی به جای OK به ادامه برنامه بپردازید.
نکته:
توجه داشته باشید که بعد از قرار دادن دستور debug برنامه اصلی شما در آن نقطه قفل شده و برد شما به عنوان USB-TTL عمل میکند و هر داده ای را در سریال مانیتور ارسال کنید را مستقیم به ماژول GSM ارسال کرده و به صورت برعکس به شما داده را میدهد.
از این رو پیشنهاد میکنم که برای بررسی دستور های AT Command از این دستور استفاده کنید و در پایین این دستور را از کد خود پاک کنید تا برنامه شما به درستی کار کند.
البته برای سیستم کلی پیشنهاد میکنم کل ارسال و دریافت های خود را از طریق یک فانکشن که همه این سیستم را برای شما انجام میدهد استفاده کنید.
مانند این فانکشن
String serialRead(String value, String startOrEndWith, bool startOrEnd)
{
flush();
Serial2.println(value);
delay(50);
while (true)
{
cunter++;
if (Serial2.available())
{
checker = Serial2.readStringUntil('\n');
checker.trim();
if (startOrEnd)
{
if (checker.startsWith(startOrEndWith))
{
return checker;
}
}
else
{
if (checker.endsWith(startOrEndWith))
{
return checker;
}
}
}
delay(50);
if (cunter == 100)
{
cunter = 0;
Serial2.flush();
return "Null";
}
}
}
void flush()
{
Serial2.readStringUntil('\n');
Serial2.readStringUntil('\n');
Serial2.flush();
}
برای مثال برای استفاده از این فانکشن در برنامه خودتان به صورت زیر می شود
Serial.println(serialRead("AT+CBC","+CBC",true));
مقدار خروجی دستور را به صورت String به شما برمیگرداند.
توجه داشته باشید که در این کد به دلیل استفاده از ESP32 از دستور Serial2 استفاده شده است و شما برای کد خود نیاز دارید به gsmSerial تغییر بدهید