私はArduino UnoにADH8066(Sparkfun)GSMモジュールを接続し、ArduinoとGSMモジュールの間で正しいシリアル接続をしようとしています。それは、(USBまたはTTLラインを介して)直接接続するとうまく動作しますが、Arduino経由で制御されているときはうまく動作しません。いくつかのテキストは正しく出力され、残りは文字通りボーレートが間違っているように文字化けしますが、私はPCから接続するときと同じボー(115200)を使用しています。Arduino - garbleed serial output
以下#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);
}
私はシリアルモニターで見ているものです::
これは電源/接地の問題である可能性があります。 2つのデバイスの電源はどのようになっていますか?彼らは同じ供給を共有していますか? DCコンバータまたはバッテリを使用していますか?十分な電源デカップリング(コンデンサ)がありますか?十分な地面?これらのすべてのことが重要です。特にボーレートが速い場合は、ノイズが激しくなります。 – Floris
これらは同じ12V 2Aの安定化された電源を切ってArduinoに入り、その後5V/GNDをGSMモジュールに引き込みます。 私はそれを考え出したと思います。私はいくつかの読書をして、SoftwareSerialが19200以上のボードのために信頼できないように見えるので、シリアルラインをSoftwareSerialに交換し、Arduinoがハードウェアシリアル(シリアル)上のGSMモジュールと通信することを試みました。 ブーム!ゴミはこれ以上ありません。 GPRSメッセージ: + G:0084E9971343964396971397169716971697161009797439643969797139713 – mabnz
...(今すぐ)モデムから古くなった長い文字列を取得しています(+ CMTI私は期待して)、例えば: GPRSメッセージ:[ + G:0084E9971343964396971397169716971697161009797439643969797139713] – mabnz