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

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

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

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

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

GSM 模塊經(jīng)常用于物聯(lián)網(wǎng)項(xiàng)目,因?yàn)樗軌蜻h(yuǎn)程發(fā)送和接收數(shù)據(jù)。GSM 模塊沒(méi)有像 Wi-Fi 模塊那樣的依賴(lài)項(xiàng)。雖然其他無(wú)線(xiàn)模塊如Wi-Fi或Zigbee具有短距離和成本等缺點(diǎn),但 GSM 模塊具有可靠性、長(zhǎng)距離,因?yàn)橛行в?jì)劃只需要一張 SIM 卡。盡管 GSM 模塊無(wú)法發(fā)送傳感器生成的大量數(shù)據(jù),但它非常適合需要發(fā)送少量合理數(shù)據(jù)的應(yīng)用。

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

所需組件

STM32F103C8 Cortex-M3微控制器

GSM模塊(本教程使用SIM800C)

16x2 液晶顯示器

按鈕 (2)

10k 電位器

面包板

連接電線(xiàn)

什么是 SIM800C GSM 模塊?

poYBAGMYSPuADWwrAAUzjCioXlc212.png

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

為 SIM800C GSM 模塊供電

SIM800C GSM 模塊使用一個(gè) 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 具有三個(gè) UART 接口,用于連接三個(gè)外部串行外設(shè)。

AT 命令

AT 命令將用于訪(fǎng)問(wèn) GSM 模塊的功能,例如發(fā)送和接收語(yǔ)音呼叫、短信。下面給出了一些 AT 命令,它們?cè)诒窘坛讨泻苤匾?,并且?huì)經(jīng)常使用。

poYBAGMYSO6ADVoiAAA78scxngs295.png

poYBAGMYSOqAAFZ2AAA6ZEW0zf0585.png

電路原理

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

poYBAGMYSOaABK4oAASi5odR7ic410.png

STM32F103C8和GSM SIM800C之間的電路連接

pYYBAGMYSOOAND_DAAANwKaTBTE007.png

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

poYBAGMYSN6ALM2lAACL8_d5vSY349.png

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

poYBAGMYSNuARsXgAAav2Ftkj-0009.png

為 GSM 接口編程 STM32F103C8 微控制器

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

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

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

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

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

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

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

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

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

Serial1.開(kāi)始(9600);

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

發(fā)信息

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

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

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

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

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

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

延遲(1000);
Serial1.println("來(lái)自 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");

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

收到 SMS 后,它包含一個(gè)在 serial1 端口可用的字符串,其中還包含其他數(shù)據(jù),例如時(shí)間、日期等。因此,在出現(xiàn)第六個(gè)雙引號(hào) (“) 后,剩下的就是收到的 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ā)送到代碼中輸入的手機(jī)號(hào)碼。

pYYBAGMYSNKAcBStAAWicFS4Yl4031.png

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

pYYBAGMYSM6AbayvAAX8Nc4wPHs837.png

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


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;


無(wú)效設(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.開(kāi)始(9600);// 設(shè)置GSM模塊的波特率


延遲(1000);





lcd.clear();


}


無(wú)效循環(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) // 取決于按下哪個(gè)按鈕,調(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 替換為手機(jī)號(hào)碼


延遲(1000);


Serial1.println("來(lái)自 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 命令接收實(shí)時(shí)短信


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

    關(guān)注

    48

    文章

    7467

    瀏覽量

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

    關(guān)注

    134

    文章

    9030

    瀏覽量

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

    關(guān)注

    0

    文章

    87

    瀏覽量

    16410
  • STM32F103C8
    +關(guān)注

    關(guān)注

    1

    文章

    23

    瀏覽量

    8068
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    使用ESP8266將STM32F103C8連接到互聯(lián)網(wǎng)的方法

    在本教程中,我們使用 ESP8266 將 STM32F103C8 連接到互聯(lián)網(wǎng)。在這里,我們將 ESP8266 Wi-Fi 模塊與我們的藍(lán)丸 STM32F103C8 板接口,并將數(shù)據(jù)發(fā)送
    的頭像 發(fā)表于 10-28 17:25 ?1.1w次閱讀
    使用ESP8266將<b class='flag-5'>STM32F103C8</b>連接到互聯(lián)網(wǎng)的方法

    sim800c總是自動(dòng)關(guān)機(jī)

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

    SIM800C的透?jìng)髂J降膯?wèn)題

    我搞SIM800C,要進(jìn)入透?jìng)髂J?b class='flag-5'>發(fā)送接收數(shù)據(jù)。 現(xiàn)在有一些疑問(wèn): 先說(shuō)發(fā)送模塊返回CONNECT OK,就說(shuō)明進(jìn)入透?jìng)髂J健?這時(shí)候還要
    發(fā)表于 10-24 18:14

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

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

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

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

    SIM800C模塊接收短信時(shí)會(huì)卡死

    SIM800C模塊接收短信時(shí)會(huì)卡死。發(fā)短信也沒(méi)有回饋,但對(duì)方能收到。是模塊出了問(wèn)題了?
    發(fā)表于 04-28 09:56

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

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

    請(qǐng)問(wèn)有SIM800C固件代碼嗎?

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

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

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

    SIM800C激活開(kāi)機(jī)后自動(dòng)關(guān)機(jī)

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

    STM8單片機(jī)給SIM800C發(fā)送AT指令,請(qǐng)問(wèn)SIM800C串口怎么連接?

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

    SIM800C使用STC89C52單片機(jī)讀寫(xiě)短信的方法

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

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

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

    SIM800C調(diào)試

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

    SIM800C使用STC89C52單片機(jī)讀寫(xiě)短信

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