Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
6 years, 5 months ago.
How to read responses from Sim900
Hi,
I'm trying to write a simple program that will allow me to see the responses from the Sim900 chip in a terminal in my PC.
I am currently using the code below. My problem is that is seems that this condition:
while (SIM900.readable())
is not true when the function is called. I can therefore never see the response from the chip. Do you have any advice for me?
Thanking you in advance.
Kind regards
#include "mbed.h" #include <string> Serial pc(SERIAL_TX, SERIAL_RX); // pc comunication Serial SIM900(PA_9, PA_10); //tx, rx SIM 900 string result; char x; DigitalOut my_led(LED1); DigitalOut sim_power(PB_3); void clearString() { result.clear(); } void callback_rx() { pc.printf("\r\n Callback Start\n"); while (SIM900.readable()) { x = SIM900.getc(); pc.printf("x %d",x); result += x; pc.putc(x); // print the answer from SIM900 pc.printf("\r\n Callback Done\n"); } } void power() { sim_power.write(1); // accension gsm wait(1); sim_power.write(0); wait(13); // SIM900.printf("ATE0\r\n"); // DISABLE ECHO // wait(1); } int main() { power(); wait_ms(1000); pc.printf("\r\n GSM 900 TEST\n"); wait_ms(1000); SIM900.attach(&callback_rx); wait_ms(1000); SIM900.baud(9600); // while(1) { wait(1); my_led = !my_led; wait(1); my_led = !my_led; pc.printf("\r\n Send AT\n"); clearString(); SIM900.printf("AT"); //hello wait_ms(100); clearString(); } }
1 Answer
6 years, 5 months ago.
Hi Koos,
I would recommend that you do not do a print to serial(printf) in a interrupt subroutine. Printing out to serial take a very long time so another interrupt might happen while you are waiting to print to serial. Second, it seem that you missing an argument when you called the attach function.
attach function
SIM900.attach(&callback_rx, Serial::RxIrq); //this will link it when there is an interrupt on the Serial Rx
You can reference this Serial_interrupts program example: https://os.mbed.com/users/4180_1/code/Serial_interrupts/
Please let me know if you have any questions!
- Peter, team Mbed
If this solved your question, please make sure to click the "Thanks" link below!
Hi Peter,
Thank you very much for your assistance. I have implemented your suggestions. Unfortunately, I am still unable to display the response from the Sim900 chip on my terminal. My amended code is below. Do you have any suggestions for me? Thanking you in advance. Kind regards Koos
#include "mbed.h" #include <string> Serial pc(SERIAL_TX, SERIAL_RX); // pc comunication Serial SIM900(PA_9, PA_10); //tx, rx SIM 900 string result; char x; DigitalOut my_led(LED1); DigitalOut sim_power(PB_3); void clearString() { result.clear(); } void callback_rx() { while (SIM900.readable()) { result += x; pc.putc(x); // print the answer from SIM900 } } void power() { wait(3); pc.printf("\r\n Start Program\n"); pc.printf("\r\n Power On\n"); sim_power.write(1); // accension gsm wait(1); sim_power.write(0); pc.printf("\r\n Power Off\n"); pc.printf("\r\n Waiting for Network...\n"); wait(13); // SIM900.printf("ATE0\r\n"); // DISABLE ECHO // wait(1); } int main() { power(); wait_ms(500); pc.printf("\r\n GSM 900 TEST\n"); wait_ms(500); SIM900.attach(&callback_rx, Serial::RxIrq); wait_ms(500); SIM900.baud(9600); // while(1) { wait(1); my_led = !my_led; pc.printf("\r\n Send AT\n"); clearString(); SIM900.printf("AT"); //hello } }
Hi Peter,
I have modified my code and it is now doing what I wanted. Please see below. Thanks again for your assistance.
Kind regards
Koos
#include "mbed.h" #include <string.h> Serial pc(SERIAL_TX, SERIAL_RX); // pc comunication Serial gsm(PA_9, PA_10); //tx, rx SIM 900 DigitalOut my_led(LED1); DigitalOut sim_power(PB_3); void power() { wait(3); pc.printf("\r\n Start Program\n"); pc.printf("\r\n Power On\n"); sim_power.write(1); // accension gsm wait(1); sim_power.write(0); pc.printf("\r\n Power Off\n"); pc.printf("\r\n Waiting for Network...\n"); wait(5); } int main() { gsm.baud(9600); pc.baud(9600); char buf[40]; char buf1[40]; power(); pc.printf("\r\n"); pc.printf("Sim900 GSM Test\r\n"); gsm.printf("AT\r\n"); gsm.scanf("%s",buf); pc.printf("%s\r\n",buf); gsm.scanf("%s",buf1); pc.printf("%s\r\n",buf1); while(1) { wait(1); my_led = !my_led; } }
Hello Koos,
Yes I am glad to see that your code work. It seem that you just need to print out the "\r\n" every time you write out to the SIM900. That will tell the SIM900 that this is the end of the command line.
Please let me know if you have any questions!
- Peter, team Mbed
If this solved your question, please make sure to click the "Thanks" link below!
posted by 25 Jun 2018