我已经将ADH8066(Sparkfun)GSM模块连接到我的Arduino Uno,并试图在Arduino和GSM模块之间进行正确的串行连接。当我直接(通过USB或只是TTL线)连接它时它工作正常,但是当通过Arduino控制时却没有。有些文本会正确输出,其余文本会出现乱码,几乎就像波特率错误一样,但我只是使用与从PC连接时相同的波特率(115200)。
这是我正在使用的Arduino代码:
#include <SoftwareSerial.h>
#define rxPin 7
#define txPin 8
SoftwareSerial mySerial = SoftwareSerial(rxPin, txPin);
// EN: String buffer for the GPRS shield message
String SmsStorePos = String("");
String msg = String("");
String snTmp = String("");
String snFull = String("");
// EN: Set to 1 when the next GPRS shield message will contains the SMS message
int SmsContentFlag = 0;
// EN: Pin of the LED to turn ON and OFF depending on the received message
int ledPin = 5;
int powerPin = 6;
void setup()
{
mySerial.begin(115200); // the GPRS baud rate
mySerial.print("\r");
delay(1000);
Serial.begin(115200); // the Arduino IDE serial
Serial.println("Started!");
pinMode( ledPin, OUTPUT );
digitalWrite( ledPin, LOW );
pinMode( powerPin, OUTPUT);
digitalWrite(powerPin, LOW); // brings ONKEY low to turn on the modem (aka pressing the ONKEY)
delay(3000);
digitalWrite(powerPin, HIGH); // sets the pin HIGH again (restore 5V)
delay(5000);
// test LED pin
digitalWrite ( ledPin, HIGH);
delay(1000);
digitalWrite( ledPin, LOW);
}
void loop()
{
char SerialInByte;
// Send anything we receive from the IDE to the modem
if(Serial.available())
{
mySerial.print((unsigned char)Serial.read());
}
else if(mySerial.available())
{
char SerialInByte;
SerialInByte = (unsigned char)mySerial.read();
//SerialInByte = mySerial.read();
// EN: Relay to Arduino IDE Monitor
Serial.print( SerialInByte );
// -------------------------------------------------------------------
// EN: Program also listen to the GPRS shield message.
// -------------------------------------------------------------------
// EN: If the message ends with <CR> then process the message
if( SerialInByte == 13 ){
// EN: Store the char into the message buffer
ProcessGprsMsg();
}
if( SerialInByte == 10 ){
// EN: Skip Line feed
}
else {
// EN: store the current character in the message string buffer
msg += String(SerialInByte);
}
}
}
// EN: Make action based on the content of the SMS.
// Notice than SMS content is the result of the processing of several GPRS shield messages.
void ProcessSms( String sms ){
sms.toLowerCase();
Serial.print( "ProcessSms for [" );
Serial.print( sms );
Serial.println( "]" );
if( sms.indexOf("on") >= 0 ){
digitalWrite( ledPin, HIGH );
Serial.println( "LED IS ON" );
return;
}
if( sms.indexOf("off") >= 0 ){
digitalWrite( ledPin, LOW );
Serial.println( "LED IS OFF" );
return;
} else {
mySerial.print("AT+CMGF=1\r"); //Because we want to send the SMS in text mode
delay(1000);
mySerial.print("AT+CMGS=\"");
mySerial.print(snFull);
mySerial.print("\"\r");
delay(1000);
mySerial.print("Unknown Command: ");
mySerial.print(sms);
mySerial.print("\r");
delay(1000);
mySerial.write(0x1A); //Equivalent to sending Ctrl+Z
return;
}
}
// EN: Request Text Mode for SMS messaging
void GprsTextModeSMS(){
mySerial.println( "AT+CMGF=1" );
}
void GprsReadSmsStore( String SmsStorePos ){
// Serial.print( "GprsReadSmsStore for storePos " );
// Serial.println( SmsStorePos );
mySerial.print( "AT+CMGR=" );
mySerial.println( SmsStorePos );
}
// EN: Clear the GPRS shield message buffer
void ClearGprsMsg(){
msg = "";
}
// EN: interpret the GPRS shield message and act appropiately
void ProcessGprsMsg() {
Serial.println("");
Serial.print( "GPRS Message: [" );
Serial.print( msg );
Serial.println( "]" );
if( msg.indexOf( "Call Ready" ) >= 0 ){
Serial.println( "*** GPRS Shield registered on Mobile Network ***" );
GprsTextModeSMS();
}
// EN: unsolicited message received when getting a SMS message
if( msg.indexOf( "+CMTI" ) >= 0 ){
Serial.println( "*** SMS Received ***" );
// EN: Look for the coma in the full message (+CMTI: "SM",6)
// In the sample, the SMS is stored at position 6
int iPos = msg.indexOf( "," );
SmsStorePos = msg.substring( iPos+1 );
Serial.print( "SMS stored at " );
Serial.println( SmsStorePos );
// EN: Ask to read the SMS store
GprsReadSmsStore( SmsStorePos );
}
// EN: SMS store read via UART (result of GprsReadSmsStore request)
if( msg.indexOf( "+CMGR:" ) >= 0 ){
// get number of sender
int snPos = msg.indexOf("+1");
Serial.print("SMS From: ");
snTmp = msg.substring(snPos+1);
snFull = "";
for (int i = 0; i < 11; i++){
snFull += snTmp[i];
}
Serial.println(snFull);
// EN: Next message will contains the BODY of SMS
SmsContentFlag = 1;
// EN: Following lines are essentiel to not clear the flag!
ClearGprsMsg();
return;
}
// EN: +CMGR message just before indicate that the following GRPS Shield message
// (this message) will contains the SMS body
if( SmsContentFlag == 1 ){
Serial.println( "*** SMS MESSAGE CONTENT ***" );
Serial.println( msg );
Serial.println( "*** END OF SMS MESSAGE ***" );
ProcessSms( msg );
delSMS();
}
ClearGprsMsg();
// EN: Always clear the flag
SmsContentFlag = 0;
}
void delSMS() {
mySerial.print("AT+CMGD=");
mySerial.println(SmsStorePos);
}
以下是我在串口监视器中看到的内容:
答案 0 :(得分:7)
SoftwareSerial在时间上非常挑剔,并且会导致像你描述的同时出现“太多”的问题。由于你正在做其他事情,它可能会失去同步。
我热烈推荐AltSoftSerial(http://www.pjrc.com/teensy/td_libs_AltSoftSerial.html),它表现得更好,但我仍然建议你使用略低的波特率来提高可靠性。太高的波特率需要非常精确的时序才能不丢失一个位,并且硬件功能不足以在没有问题的情况下在软件中进行串行流量。
答案 1 :(得分:7)
确保&#34;波特&#34;设置与草图匹配。
Ex:Serial.begin(115200); &GT;&GT;&GT;&GT;控制台中有115200波特。
我从kunalbhat上面的评论中得到了这个解决方案。但我想把它作为一个独立的答案发布,因为它解决了我的问题,而且我从来没有想过。所以我认为它会帮助很多其他人。
答案 2 :(得分:2)
如前所述,问题在于&#34;波特&#34;设置(与串行通信有关 - 另一个答案)。这可以(通常)在草图的顶部找到,可能如下所示:
Serial.begin(9600);
或者这个:
Serial.begin(115200);
对于Arduino Uno,一个&#34;波特&#34; 9600以外的设置将导致文本乱码。因此,请确保在草图的开头有一行:
Serial.begin(9600);
随时询问您是否需要任何进一步的帮助。
答案 3 :(得分:1)
我正在使用Arduino编程ATtiny84,但输出乱码或串口在第一行后停止,直到我重置Arduino。
问题是Arduino加载了“Arduino as ISP”草图,干扰了来自ATtiny84的串行数据。
将空白草图上传到Arduino修复它。
答案 4 :(得分:1)
原因是,你需要设置命令 AT + UART_DEF = 9600,8,1,0,0 将ESP的波特率重置为9600,或者您也可以使用 AT + CIOBAUD = 9600 !
试试吧,它对我有用!
我在一些ESP-01和ESP-12模块上尝试了 AT + IPR ,有时候它正在工作,有时候没有(和非常糟糕的情况,波特完全改变了!)
答案 5 :(得分:0)
我不得不将“波特”设置更改为9600。
Serial.begin(9600);
答案 6 :(得分:0)
我必须回到我的mega上的硬件序列才能让它工作。从来没有好运与sw连载
硬件串口sim900到mega: //在sim900上的中间rx / tx引脚到mega上的引脚tx1 / rx1
答案 7 :(得分:0)
您应该使用串行库,而不是软件串行。串行是Arduino IDE中的官方版本,默认包含在每个程序中。确保显示器和程序上的波特率相等,这是乱码的常见错误。建议使用9600波特率,您可以使用Serial.begin(9600),Serial.read(),Serial.print(“”)和Serial.println(“”)之类的命令。