问题描述
我已将Arduino Uno与SIM 900a GSM模块连接。我想将在SIM卡中收到的所有短信连续存储到GSM模块中的文本文件中。
我可以通过下面显示的代码发送SMS,但是我无法接收消息并将其保存到文件中。 正确的方法是什么?
#include <SoftwareSerial.h>
SoftwareSerial mySerial(9,10);
void setup() {
mySerial.begin(9600); // Setting the baud rate of GSM Module
Serial.begin(9600); // Setting the baud rate of Serial Monitor (Arduino)
delay(100);
}
void loop() {
if (Serial.available()>0)
switch(Serial.read()) {
case 's':
SendMessage();
break;
case 'r':
RecieveMessage();
break;
}
if (mySerial.available()>0)
Serial.write(mySerial.read());
}
void SendMessage() {
mySerial.println("AT+CMGF=1"); //Sets the GSM Module in Text Mode
delay(1000); // Delay of 1000 milli seconds or 1 second
mySerial.println("AT+CMGS=\"+9779813546162\"\r"); // Replace x with mobile number
delay(1000);
mySerial.println("I am SMS from GSM Module");// The SMS text you want to send
delay(100);
mySerial.println((char)26);// ASCII code of CTRL+Z
delay(1000);
}
void RecieveMessage() {
mySerial.println("AT+CNMI=2,2,0"); // AT Command to receive a live SMS
delay(1000);
}
解决方法
Arduino不能自然地在您的主机系统上创建文件,因此您将需要
- 在主机系统上运行一个独立程序,该程序监视串行连接并记录Arduino产生的消息(我的建议)
- 为Arduino附加一些存储空间(例如SD卡挡板)
- 让Arduino假装成键盘并像输入时一样输出
独立程序
这是我推荐的路线
- 易于使用和测试(只需检查文件中是否包含所需内容)
- 不会“弄乱”您的Arduino
- 可以在系统上进行其他工作和测试
- 不需要处理存储问题
这个简单的Python脚本可以满足您的需求:Serial data logging with python
This post建议您在Linux(对于Mac可能是相同的)和Windows下都使用1-liner来完成此操作,但是可能会遇到串行端口波特率的问题。如果此答案已过时或仅获得部分输出(即单行然后退出),则可以循环运行它或进一步搜索。您需要选择正确的串行端口,因为可能有几个(或者只有一个名称不同)。
附加存储空间
许多供应商都会为此出售盾牌
- Adafruit Assembled Data Logging shield for Arduino(自动处理文件系统,很好)
- SparkFun microSD Shield
- 通常搜索“ Arduino SD卡盾”(可能会找到更便宜的版本,但它们的质量可能不高,没有好的驱动程序,教程等)。
请注意,闪存存储可能会令人烦恼
- 需要弹出(也许换出)卡并定期查看它以查看结果以及结果是否正确
- 文件系统hoopla(我应该使用FAT,exFAT,ext2 ..)
- 确保Arduino可以编写文件系统(尽管现代的防护罩可能会为您做到这一点,至少上面建议的Adafruit可以做到这一点)
键盘仿真
首先,出于以下原因,我不建议您这样做,尽管它非常简洁,并且不需要比您更多的硬件。
- BEWARE可能会使您的Arduino无法使用,而没有一些启动门,例如等待启用开关(计算机的干草输入:无法对其进行编程)
- 需要在运行时完全访问计算机(否则无法使用计算机)
- 比独立的记录器更容易配置(烦扰反复试验/等待/麻烦输入)
官方文档:https://www.arduino.cc/reference/en/language/functions/usb/keyboard/
他们有与我相同的警告
使用鼠标和键盘库的注意事项:如果鼠标或键盘库不断运行,将很难对您的电路板进行编程。
Mouse.move()
和Keyboard.print()
之类的功能将移动光标或将击键发送到已连接的计算机,并且只有在准备好处理它们时才应调用它们。建议使用控制系统来打开此功能,例如物理开关或仅响应您可以控制的特定输入。有关一些解决方法,请参考“鼠标和键盘”示例。