0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用STM32F103C8和SIM800C GSM模塊發(fā)送/接收短信

科技觀察員 ? 來源:circuitdigest ? 作者:Pramoth Thangavel ? 2022-09-07 15:34 ? 次閱讀

GSM 模塊經(jīng)常用于物聯(lián)網(wǎng)項目,因為它能夠遠程發(fā)送和接收數(shù)據(jù)。GSM 模塊沒有像 Wi-Fi 模塊那樣的依賴項。雖然其他無線模塊如Wi-Fi或Zigbee具有短距離和成本等缺點,但 GSM 模塊具有可靠性、長距離,因為有效計劃只需要一張 SIM 卡。盡管 GSM 模塊無法發(fā)送傳感器生成的大量數(shù)據(jù),但它非常適合需要發(fā)送少量合理數(shù)據(jù)的應(yīng)用。

在本教程中,此類GSM 模塊將與 STM32F103C8 ARM 微控制器連接,以從程序中配置的蜂窩移動號碼發(fā)送和接收文本消息 (SMS)。為了顯示接收和發(fā)送的消息,一個16x2 LCD將與兩個按鈕一起使用,這兩個按鈕將在按下相關(guān)按鈕后啟動文本消息的發(fā)送和接收。

所需組件

STM32F103C8 Cortex-M3微控制器

GSM模塊(本教程使用SIM800C)

16x2 液晶顯示器

按鈕 (2)

10k 電位器

面包板

連接電線

什么是 SIM800C GSM 模塊?

poYBAGMYSPuADWwrAAUzjCioXlc212.png

SIM800C 是一種廣泛使用的 GSM 模塊,帶有串行接口調(diào)制解調(diào)器,可在 3.4V-4.4V 電壓等級之間運行。SIM800C 是一款四頻 GSM/GPRS 模塊,用于需要遠程數(shù)據(jù)傳輸?shù)?a target="_blank">嵌入式應(yīng)用。SIM800C 工作在 850/900/1800/1900MHz。它還可以低功耗接收和發(fā)送語音電話,短信。模塊通過 AT 指令控制。它支持一個 SIM 卡接口,并具有 UART(TX 和 RX)引腳以及一個 RS232 串行協(xié)議,可用于與嵌入式應(yīng)用中的不同微控制器接口。

為 SIM800C GSM 模塊供電

SIM800C GSM 模塊使用一個 12V 的 DC 電源適配器供電。

將 SIM 卡插入 SIM800C GSM 模塊

SIM800C GSM 模塊的背面插入了一張 SIM 卡。注意SIM800C不支持4G,所以不要插入4G SIM卡。

poYBAGMYSPeAYnmGAAVsFNIBRLo428.png

GSM SIM800C與STM32F103C8接口

為了將SIM800C 與 STM32F103C8 微控制器連接,將使用 UART 串??行端口,它是 STM32F103C8 的硬件串行接口。下圖表示 STM32F103C8 中的 UART 引腳,分別是 A9 和 A10。

pYYBAGMYSPOAWAVRAArWo3cOF0Y496.png

STM32F103C8 具有三個 UART 接口,用于連接三個外部串行外設(shè)。

AT 命令

AT 命令將用于訪問 GSM 模塊的功能,例如發(fā)送和接收語音呼叫、短信。下面給出了一些 AT 命令,它們在本教程中很重要,并且會經(jīng)常使用。

poYBAGMYSO6ADVoiAAA78scxngs295.png

poYBAGMYSOqAAFZ2AAA6ZEW0zf0585.png

電路原理

GSM 與 STM32的連接如下圖所示。

poYBAGMYSOaABK4oAASi5odR7ic410.png

STM32F103C8和GSM SIM800C之間的電路連接

pYYBAGMYSOOAND_DAAANwKaTBTE007.png

STM32F103C8 和 16x2 LCD 之間的電路連接

poYBAGMYSN6ALM2lAACL8_d5vSY349.png

兩個帶有 10k 下拉電阻的按鈕連接到 STM32 微控制器的引腳 PA0 和 PA1。完整的設(shè)置如下所示:

poYBAGMYSNuARsXgAAav2Ftkj-0009.png

為 GSM 接口編程 STM32F103C8 微控制器

STM32F103C8 微控制器可以使用 ARDUINO IDE 進行編程。在本教程中,無需 FTDI 或 ST-LINK 編程器即可對 STM32 進行編程。要將代碼上傳到 STM32F103C8,只需將 microUSB 端口插入 STM32,然后使用 USB 電纜將 USB 端口插入 PC,然后開始在ARDUINO IDE中編寫代碼。如有任何疑問,請按照我們之前關(guān)于如何在不使用任何外部 FTDI 或 ST-LINK 編程器的情況下對 STM32 進行編程的教程進行操作。

完整的代碼和工作視頻可以在本教程的末尾找到。

首先包括本教程中使用的外圍設(shè)備的必要庫。還要定義 LCD 的引腳配置。

#include                             
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;      
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

接下來,選擇函數(shù)lcd.begin(16,2) 初始化 LCD;其中(16,2)告訴 LCD 類型,例如 16x2 塊 LCD 顯示器。只需打印一條消息以調(diào)試 LCD 是否提供輸出并正確連接。

lcd.開始(16,2);           
lcd.print("STM32 帶 GSM");   
lcd.setCursor(0,1); 
lcd.print("SIM800C");

將 Push button 數(shù)據(jù)方向定義為 Input Mode 并定義使用的引腳號。

pinMode(PA0,輸入);       
pinMode(PA1,輸入);

選擇用于串行通信的波特率。

Serial1.開始(9600);

代碼中有兩個函數(shù),一個是發(fā)送消息,另一個是接收消息。下面給出詳細解釋。

發(fā)信息

此功能用于向某個號碼發(fā)送短信。AT命令被發(fā)送到GSM模塊,指示消息文本模式以及需要發(fā)送消息的號碼。

以下語句通過發(fā)送 AT 命令(AT+CMGF=1)將 GSM 模塊設(shè)置為文本模式。

Serial1.println("AT+CMGF=1"); //將GSM模塊設(shè)置為文本模式

之后,指示發(fā)送帶有手機號碼的 SMS 的 AT 指令(AT+CMGS)通過 serial1 端口發(fā)送到 GSM 模塊。

Serial1.println("AT+CMGS="+91XXXXXXXXXX"\r"); // 將 x 替換為手機號碼

消息每隔一秒使用 AT 命令發(fā)送,然后需要發(fā)送 CLRL+Z,因此 CTRL+Z 的 ASCII 碼通過 Serial1 端口發(fā)送到 GSM 模塊。

延遲(1000);
Serial1.println("來自 GSM 模塊的 Hi 電路文摘"); // 要發(fā)送的短信
Serial1.println((char)26);// CTRL+Z 的 ASCII 碼

然后在 16X2 LCD 顯示屏上顯示“SMS sent”。

lcd.print("短信發(fā)送");

接收消息

在此功能中,信息被接收并打印在 LCD 顯示屏上。

Serial1.println("AT+CNMI=2,2,0,0,0");

因此,要接收實時消息,使用上述 AT 命令。

收到 SMS 后,它包含一個在 serial1 端口可用的字符串,其中還包含其他數(shù)據(jù),例如時間、日期等。因此,在出現(xiàn)第六個雙引號 (“) 后,剩下的就是收到的 SMS。因此,其他信息被省略,接收到的消息的剩余信息顯示在16x2 LCD 顯示屏上。

while(1) 
  { 
           if(Serial1.available()) 
            {
                做
                  { 
                     while ( !Serial1.available() );    
                  } while ( '"' != Serial1.read() );
               做
                  { 
                      while ( !Serial1.available() );     
                  } while ( '"' != Serial1.read() ); 
               做
                 {
                      而 ( !Serial1.available() );    
                  } while ( '"' != Serial1.read() );
               做
                 { 
                    while ( !Serial1.available() );    
                 } while ( '"' != Serial1.read() );
                做
                  { 
                     while ( !Serial1.available() );               
                  } while ( '"' != Serial1.read() ); 
                做
                 {
                    而 ( !Serial1.available() );  
                  } while ( '"' != Serial1.read() ); 
                  while ( !Serial1.available() );
                  接收 = Serial1.read();     
                  而 ( !Serial1.available() );
                  接收 = Serial1.read() ; 
    lcd.clear(); 
    while(1) 
    { 
        while (!Serial1.available());
        接收 = Serial1.read(); 
        if (receive == '\r')   
              中斷;
     否則
             lcd.write(receive); 
     } 
} 
}

使用 STM32 發(fā)送和接收短信的演示

1. 要發(fā)送短信,只需按左按鈕。短信將發(fā)送到代碼中輸入的手機號碼。

pYYBAGMYSNKAcBStAAWicFS4Yl4031.png

2. 要接收短信,只需按右按鈕,短信就會被接收并顯示在液晶顯示屏上。

pYYBAGMYSM6AbayvAAX8Nc4wPHs837.png

這就是將GSM 模塊與 STM32F103C8 ARM微控制器連接起來的全部內(nèi)容。
#include //LCD 顯示庫


const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; //LCD和STM32之間連接的引腳


LiquidCrystal lcd(rs, en, d4, d5, d6, d7);


int接收= 0;


無效設(shè)置()


{



lcd.begin(16,2); //LCD 設(shè)置為 16x2 模式



pinMode(PA0,INPUT); //按鈕作為輸入引腳

pinMode(PA1,INPUT);



lcd.print("STM32 帶 GSM"); //顯示歡迎信息

lcd.setCursor(0,1);

lcd.print("SIM800C");



Serial1.開始(9600);// 設(shè)置GSM模塊的波特率


延遲(1000);





lcd.clear();


}


無效循環(huán)()


{



lcd.clear();

lcd.setCursor(0,0);

lcd.print("S 發(fā)送短信");

lcd.setCursor(0,1);

lcd.print("R 接收短信");

延遲(100);





int a = digitalRead(PA0); //讀取按鈕的狀態(tài)

int b = digitalRead(PA1);



if (a == 1) // 取決于按下哪個按鈕,調(diào)用相應(yīng)的函數(shù)

{

SendMessage();

}



else if( b == 1)

{

RecieveMessage();

}



}



void SendMessage() //發(fā)送消息的函數(shù)

{

lcd.clear();



lcd.print("發(fā)送短信");

延遲(1000);

Serial1.println("AT+CMGF=1"); //將GSM模塊設(shè)置為文本模式


延遲(1000);


Serial1.println("AT+CMGS="+91XXXXXXXXXX"\r"); // 將 x 替換為手機號碼


延遲(1000);


Serial1.println("來自 GSM 模塊的 Hi 電路文摘"); // 您要發(fā)送的 SMS 文本


延遲(100);


Serial1.println((char)26);// CTRL+Z的ASCII碼


延遲(1000);

lcd.clear();

lcd.print("短信發(fā)送");

延遲(1000);

}


void RecieveMessage() //接收消息的函數(shù)


{



lcd.clear();

lcd.print("接收短信");


Serial1.println("AT+CNMI=2,2,0,0,0"); // AT 命令接收實時短信


延遲(1000);



while(1)

{

if(Serial1.available())

{




{


而(!Serial1.available());


} while ( '"' != Serial1.read() );








{


而(!Serial1.available());


} while ( '"' != Serial1.read() );








{


而(!Serial1.available());


} while ( '"' != Serial1.read() );








{


而(!Serial1.available());


} while ( '"' != Serial1.read() );






{


而(!Serial1.available());




} while ( '"' != Serial1.read() );





{



而 ( !Serial1.available() );




} while ( '"' != Serial1.read() );



而(!Serial1.available());


接收 = Serial1.read();


而(!Serial1.available());


接收 = Serial1.read();




lcd.clear();


而(1)


{


而(!Serial1.available());


接收 = Serial1.read();


if (receive == '\r')



中斷;



別的


lcd.write(接收);

}

}

}

}

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 微控制器
    +關(guān)注

    關(guān)注

    48

    文章

    7552

    瀏覽量

    151426
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    9097

    瀏覽量

    367583
  • GPS模塊
    +關(guān)注

    關(guān)注

    0

    文章

    87

    瀏覽量

    16438
  • STM32F103C8
    +關(guān)注

    關(guān)注

    1

    文章

    23

    瀏覽量

    8088
收藏 人收藏

    評論

    相關(guān)推薦

    sim800c總是自動關(guān)機

    單片機控制sim800c上網(wǎng)模塊,插上物聯(lián)卡和GSM天線,激活開機后,5-8秒之后 sim800c就會關(guān)機。測試了電源的電壓是3.74V,關(guān)
    發(fā)表于 09-26 16:15

    SIM800C的透傳模式的問題

    我搞SIM800C,要進入透傳模式發(fā)送接收數(shù)據(jù)。 現(xiàn)在有一些疑問: 先說發(fā)送模塊返回CONNECT OK,就說明進入透傳模式。 這時候還要
    發(fā)表于 10-24 18:14

    sim800c例程不能實現(xiàn)觸摸效果

    );實現(xiàn)了撥號功能,用的是f1戰(zhàn)艦,但是對于短信發(fā)送卻沒有辦法實現(xiàn),sim800c串口測試一切正常,求解答,多謝。
    發(fā)表于 04-11 22:50

    sim800c例程不能實現(xiàn)觸摸效果

    );實現(xiàn)了撥號功能,用的是f1戰(zhàn)艦,但是對于短信發(fā)送卻沒有辦法實現(xiàn),sim800c串口測試一切正常,求解答,多謝。
    發(fā)表于 04-23 06:36

    SIM800c怎么通過傳感器控制模塊發(fā)送短信

    我現(xiàn)在使用sim800c,我想通過傳感器控制模塊發(fā)送短信(我現(xiàn)在就用一個光電管實驗)。我能正確讀到傳感器信號引腳的電平,把這個信號接到PA4,判斷PA4的電平情況來控制
    發(fā)表于 04-24 00:15

    SIM800C模塊接收短信時會卡死

    SIM800C模塊接收短信時會卡死。發(fā)短信也沒有回饋,但對方能收到。是模塊出了問題了?
    發(fā)表于 04-28 09:56

    sim800c的TCP發(fā)包時好時壞

    我使用STM32F103 + SIM800c做的板子。sim800c連接到服務(wù)器之后,使用定時器,每60秒發(fā)一次心跳包。但測試后,有時候全部的心跳包都可以發(fā)送成功,有時候,又會間隔著有
    發(fā)表于 04-30 06:27

    請問有SIM800C固件代碼嗎?

    現(xiàn)在用的開發(fā)板是F407,現(xiàn)在想做遠程監(jiān)控,通過現(xiàn)場傳感器感受到危險后通過短信告訴遠方的主人,買了一個SIM800C模塊,但是由于SIM800C
    發(fā)表于 05-08 23:15

    sim800c使用MQTT時數(shù)據(jù)長度有什么限制?

    sim800c 使用MQTT時,數(shù)據(jù)長度的限制問題?問題:最近在使用STM32F1+SIM800C實現(xiàn)MQTT的時候,遇到一個問題。就是在發(fā)送的數(shù)據(jù)長度達到一定的時候,服務(wù)器收不到數(shù)據(jù)。但使用其他
    發(fā)表于 05-22 04:36

    SIM800C激活開機后自動關(guān)機

    單片機控制sim800c上網(wǎng)模塊,插上物聯(lián)卡和GSM天線,激活開機后,5-8秒之后 sim800c就會關(guān)機。測試了電源的電壓是4V,關(guān)機的時
    發(fā)表于 08-30 20:08

    STM8單片機給SIM800C發(fā)送AT指令,請問SIM800C串口怎么連接?

    通過STM8單片機給SIM800C發(fā)送AT指令,SIM800C串口怎么連接
    發(fā)表于 10-22 00:16

    SIM800C使用STC89C52單片機讀寫短信的方法

    寫英文短信短信是向單片機的SBUF寄存器一位位發(fā)送字符串,從而與SIM800C模塊達到通信的目的void UartPrintf(unsig
    發(fā)表于 12-02 06:38

    sim800c模塊應(yīng)用實例分析

     SIM800C是一款四頻GSM/GPRS模塊,為城堡孔封裝。其性能穩(wěn)定,外觀小巧,性價比高,能滿足客戶的多種需求。SIM800C工作頻率為GSM
    發(fā)表于 11-22 10:18 ?10.3w次閱讀
    <b class='flag-5'>sim800c</b><b class='flag-5'>模塊</b>應(yīng)用實例分析

    SIM800C調(diào)試

    板載SIM800C,電路圖參考正點原子,出現(xiàn)問題:AT+CGATT=1 總返回err。網(wǎng)絡(luò)指示燈總是顯示無網(wǎng)絡(luò)連接查閱SIM800C硬件手冊,發(fā)現(xiàn)電源引腳如下描述:模塊提供2個VBAT 電源引腳
    發(fā)表于 10-22 14:36 ?13次下載
    <b class='flag-5'>SIM800C</b>調(diào)試

    SIM800C使用STC89C52單片機讀寫短信

    寫英文短信短信是向單片機的SBUF寄存器一位位發(fā)送字符串,從而與SIM800C模塊達到通信的目的void UartPrintf(unsig
    發(fā)表于 11-23 17:06 ?35次下載
    <b class='flag-5'>SIM800C</b>使用STC89<b class='flag-5'>C</b>52單片機讀寫<b class='flag-5'>短信</b>