我有一个字符串,特别是一个从串口(pc)输入11位数的手机号码,我打算将它发送给arduino。我输入字符串并将其打印到串行缓冲区没有问题,我很困惑的是,arduino是否真正正确读取了我刚刚输入的手机号码?另外,让我们假设arduino已经读取了字符串,我如何在我的arduino代码中正确插入字符串并处理所有内容以便它现在可以发送短信?我只能使用GSMSMS代码发送短信。我能够通过手动输入特定的手机号码来实现。但是下面的第一个arduino代码,我有错误。我错过了什么吗?我非常需要一些建议和提示。提前致谢! :))) 这是我的arduino代码:
char text[11];
int bufferIndex = 0;
char Rx_data[50];
unsigned char Rx_index = 0;
int i = 0;
char msg[160];
int sig;
void setup(){
Serial.begin(38400);
initGSM();
loop_Serial();
send_msg(text, "Your sample has been tested. You may now get your result. Thank you.");
}
void loop_Serial()
{
if( Serial.available())
{
char ch = (char)Serial.read();
if( ch == '\n') // is this the terminating carriage return
{
text[ bufferIndex ] = 0; // terminate the string with a 0
bufferIndex = 0; // reset the index ready for another string
// do something with the string
Serial.println(text);
}
else
text[ bufferIndex++ ] = ch; // add the character into the buffer
}
}
void loop() {
//none
}
void send_msg(char *number, char *msg)
{
char at_cmgs_cmd[30] = {'\0'};
char msg1[160] = {'\0'};
char ctl_z = 0x1A;
sprintf(msg1, "%s%c", msg, ctl_z);
sprintf(at_cmgs_cmd, "AT+CMGS=\"%s\"\r\n",number);
sendGSM(at_cmgs_cmd);
delay(100);
delay(100);
delay(100);
sendGSM(msg1);
delay(100);
}
void sendGSM(char *string){
Serial.write(string);
delay(90);
}
void clearString(char *strArray) {
int j;
for (j = 100; j > 0; j--)
strArray[j] = 0x00;
}
void send_cmd(char *at_cmd, char clr){
char *stat = '\0';
while(!stat){
sendGSM(at_cmd);
delay(90);
readSerialString(Rx_data);
stat = strstr(Rx_data, "OK");
}
if (clr){
clearString(Rx_data);
delay(200);
stat = '\0';
}
}
void initGSM(){
send_cmd("AT\r\n",1);
// send_cmd("ATE0\r\n",1); // Turn off automatic echo of the GSM Module
send_cmd("AT+CMGF=1\r\n",1); // Set message format to text mode
//Sucess
Serial.println("Success");
delay(1000);
delay(1000);
delay(1000);
}
void readSerialString (char *strArray) {
if(!Serial.available()) {
return;
}
while(Serial.available()) {
strArray[i] = Serial.read();
i++;
}
}
AT
AT + CMGF = 1
成功
AT + CMGS = “S”
您的样本已经过测试。您现在可以获得结果。谢谢。
“S”来自哪里?我的输入字符串在哪里?
答案 0 :(得分:0)
代码有点乱。
首先,你应该循环连续,直到所有11个字符被加入;实际上你只是看看是否有角色,但你没有为他们做什么
在loop_serial()之前做一段时间阻止你的程序,直到11个字符准备好被加入:
while(Serial.available() < 11); //because of ; do nothing until there are 11 char
然后你可以在for中读取这个字符,如果有剩余字符则由你写错误处理代码。
要读取,loop_serial中的代码很好,但是
Serial.print(inData);
inData="";
inData.toCharArray(charBuf, 11);
所以,当你读取inData(实际上你不等待char,所以可能你从未参加过这个循环),你打印它,然后你清除它,你将清除的字符串复制到一个char数组;这也是一个缓冲区溢出,因为你是没有退出到charBuf的copyng char,如果你没有清除inData,你应该检查大小是否为11,或者如果你仍然导致溢出,你可能会破坏很多东西以奇怪的方式。
我的建议是编写一个只能在序列号上重新编号的代码,并对其进行压力测试。当你有它的工作时,很容易将它“连接”到GSM草图,如果该部分看似正确:)