Click here to Skip to main content
13,297,266 members (63,123 online)
Rate this:
Please Sign up or sign in to vote.
See more:
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));
		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");
       /* read characters into our string buffer*/
	bufptr = buffer;
	nbytes = read(fd, bufptr, buffer + sizeof(buffer) - bufptr - 1);
    char *p;
    p = strstr(buffer, "tin");
	p = strstr(buffer, "server");
	if(p == NULL) printf("not from server\n");
	*bufptr = '\0';
	return 0;
Posted 4-Jul-11 2:30am
Updated 4-Jul-11 3:13am

1 solution

Rate this: bad
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.
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)

  Print Answers RSS
Top Experts
Last 24hrsThis month

Advertise | Privacy |
Web02 | 2.8.171207.1 | Last Updated 4 Jul 2011
Copyright © CodeProject, 1999-2017
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