Click here to Skip to main content
15,893,381 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Hi,
am trying to read sms messages via serial port in linux a from a sim card which i have placed inside a huawei 3g usb modem. i have to execute the script a number of time before some of the sms messages are displayed on the screen. At times it displays unusual characters. All i want to do is read sms messages from the sim using AT commands, c and serial port. Below is the code i am using.

C++
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <termios.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <time.h>
#include <errno.h>

int main(){
    int fd;
    struct termios options;

    /* open the port */
    fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
	if (fd == -1)
	   {                                              /* Could not open the port */
	     fprintf(stderr, "open_port: Unable to open /dev/ttyS1 - %s\n",strerror(errno));
	   }else{
		printf("port opened\n");
	    }
    fcntl(fd, F_SETFL, 0);

    /* get the current options */
    tcgetattr(fd, &options);

    /* set raw input, 1 second timeout */
    options.c_cflag     |= (CLOCAL | CREAD);
    options.c_lflag     &= ~(ICANON | ECHO | ECHOE | ISIG);
    options.c_oflag     &= ~OPOST;
    options.c_cc[VMIN]  = 0;
    options.c_cc[VTIME] = 10;

    /* set the options */
    tcsetattr(fd, TCSANOW, &options);

	char buffer[400];  /* Input buffer */
      char *bufptr;      /* Current char in buffer */
      int  nbytes;       /* Number of bytes read */
      int  tries;        /* Number of tries so far */

      for (tries = 0; tries < 1; tries ++)
      {
       /* send an AT command*/
	if (write(fd, "AT+CMGL=\"ALL\"\r", strlen("AT+CMGL=\"ALL\"\r")) < 3){
		printf("command sent\n");
	  continue;
	}

       /* read characters into our string buffer*/
	bufptr = buffer;

	nbytes = read(fd, bufptr, buffer + sizeof(buffer) - bufptr - 1);
	printf("%s\n",bufptr);

    char *p;

    p = strstr(buffer, "tin");
    printf("%s",p);

	p = strstr(buffer, "server");
	if(p == NULL) printf("not from server\n");

	*bufptr = '\0';

}
	return 0;
}
Posted
Updated 4-Jul-11 2:13am
v4

1 solution

You are not checking the message returned to filter out any control characters or verify that your received message is complete. Check this document[^], and any other resources that Google may find for you.
 
Share this answer
 
Comments
Edem Kofi 4-Jul-11 8:23am    
thank very much but how do i check or verify if message is complete. I sometimes get the sms message displayed but only after i have runned the application over and over again. Any help is welcomed. Thank you.
Richard MacCutchan 4-Jul-11 8:32am    
Check the results of your read() function call. Do not assume that just because you send a read request to a device that you will get what you expect. This is especially true when reading from network and other communication devices where the data flow can be sporadic and get returned in small chunks.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900