Click here to Skip to main content
11,480,938 members (64,285 online)
Rate this: bad
good
Please Sign up or sign in to vote.
See more: C Linux ATCommands
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.

#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 4-Jul-11 2:30am
Edited 4-Jul-11 3:13am
v4

1 solution

Rate this: bad
good
Please Sign up or sign in to vote.

Solution 1

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.
  Permalink  
Comments
Edem Kofi at 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 at 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)

  Print Answers RSS
0 Sergey Alexandrovich Kryukov 294
1 OriginalGriff 145
2 CPallini 135
3 CHill60 130
4 Member 10254688 65
0 Sergey Alexandrovich Kryukov 8,184
1 OriginalGriff 7,701
2 Sascha Lefèvre 3,114
3 Maciej Los 2,491
4 Richard Deeming 2,335


Advertise | Privacy | Mobile
Web03 | 2.8.150520.1 | Last Updated 4 Jul 2011
Copyright © CodeProject, 1999-2015
All Rights Reserved. Terms of Service
Layout: fixed | fluid

CodeProject, 503-250 Ferrand Drive Toronto Ontario, M3C 3G8 Canada +1 416-849-8900 x 100