首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > Wireless >

控制GPRS模块的串口程序解决思路

2012-03-04 
控制GPRS模块的串口程序大家好,我想利用程序来控制GPRS模块,也就是通过程序来发送AT指令以及接受但是我的

控制GPRS模块的串口程序
大家好,我想利用程序来控制GPRS模块,也就是通过程序来发送AT指令以及接受
但是我的程序只发送了一个简单的“AT”,确不能读到回应,想请教一下大家。
通过minicom或者sscom发送AT指令,GPRS模块都能正确的回应,所以应该是程序问题。
但是通过minicom或者sscom调试程序,接受和发送都与我预想的一致,很困惑。
附上出错信息:
Serial Port Speed:115200bps
/*************************/
now 4 bytes has been written to the serial port
Reading timeout
以下是程序清单:
#include <sys/types.h>  
#include <sys/stat.h>  
#include <sys/ioctl.h>
#include <sys/time.h>
#include <sys/select.h>
#include <stdio.h>  
#include <string.h>
#include <stdlib.h>  
#include <unistd.h>  

#include <fcntl.h>  
#include <termios.h>  
#include <errno.h>  

 
typedef 
enum 
{
  SERIAL_8N1=0,
  SERIAL_7E1=1,
  SERIAL_7O1=2,
  SERIAL_7S1=3
}serial_format;
const char * serial_port[]={
  "/dev/ttyS0",
  "/dev/ttyS1",
  "/dev/ttyS2",
  "/dev/ttyS3",
  "/dev/ttyS4",
"/dev/ttyUSB0"
};
int serial_open(int port)
{
  int fd = open(serial_port[port], O_RDWR);//|O_NONBLOCK);  
  if (-1 == fd)  
  {  
  perror("Can't Open Serial Port");
  exit (-1);  
  }  
  else 
  {
  fcntl(fd, F_SETFL, 0);
  }
  return fd;
}

 
void serial_format_set(int fd,serial_format format)
{
  int status=0;
  struct termios options; 
  if ( tcgetattr( fd,&options) != 0) 
  { 
  perror("serial fomat abnormal");  
  exit (-1);
  }
  options.c_cflag &= ~CSIZE; 
  switch (format)
  {  
  case SERIAL_8N1:
  options.c_cflag &= ~PARENB;
  options.c_cflag &= ~CSTOPB;
  options.c_cflag &= ~CSIZE;
  options.c_cflag |= CS8;
  options.c_iflag &= ~(INPCK | ISTRIP);
  break;  
  case SERIAL_7E1:  
  options.c_cflag |= PARENB;
  options.c_cflag &= ~PARODD;
  options.c_cflag &= ~CSTOPB;
  options.c_cflag &= ~CSIZE;
  options.c_cflag |= CS7;
  options.c_iflag |= (INPCK | ISTRIP);

  break;
  case SERIAL_7O1:
  options.c_cflag |= PARENB;
  options.c_cflag |= PARODD;
  options.c_cflag &= ~CSTOPB;
  options.c_cflag &= ~CSIZE;
  options.c_cflag |= CS7;
  options.c_iflag |= (INPCK | ISTRIP);

  break;
  case SERIAL_7S1:
  options.c_cflag &= ~PARENB;
  options.c_cflag &= ~CSTOPB;
  options.c_cflag &= ~CSIZE;
  options.c_cflag |= CS8;
  options.c_iflag &= ~INPCK;
  options.c_iflag|=ISTRIP;
  break;
  default:  
  perror("serial format abnormal");
  exit (-1);
  } 
  tcflush(fd,TCIOFLUSH); 
  status=tcsetattr(fd, TCSANOW, &options);
  if (status != 0) 


  {  
  perror("tcsetattr format abnormal");  
  exit(-1);  
  }  
}
void serial_speed_set(int fd,int baudrate)
{
  int status; 
  struct termios options;
   
  /*
  * Get the current options for the port
  */
   
  tcgetattr(fd, &options);
   
  /*
  * Set the baud rates to 19200
  */
   
  cfsetispeed(&options, baudrate);
  cfsetospeed(&options, baudrate);
   
  /*
  * Enable the receiver and set local mode
  */
   
  options.c_cflag |= (CLOCAL | CREAD);
   
  /*
  * Set the new options for the port
  */
  tcflush(fd,TCIOFLUSH); 
  status=tcsetattr(fd, TCSANOW, &options);
  if (status != 0) 
  {  
  perror("tcsetattr speed abnormal");  
  exit(-1);  
  }  

}



void serial_etc_config(int fd)
{
  int status=0;
  struct termios options; 
  if ( tcgetattr( fd,&options) != 0) 
  { 
  perror("serial etc abnormal");  
  exit (-1);
  }
   
  //no hardware flow control
  options.c_cflag &= ~CRTSCTS;
  //no soft control
  options.c_iflag &=~(IXON | IXOFF | IXANY);
  //raw set_input
  options.c_lflag &=~(ICANON | ECHO | ECHOE | ISIG);


 

  //no output process , raw set_input
  options.c_oflag &=~OPOST;

   


  //min character
  options.c_cc[VMIN] = 1;
  //time to wait for data
  options.c_cc[VTIME] = 15;

  tcflush(fd,TCIOFLUSH); 
  status=tcsetattr(fd, TCSANOW, &options);
  if (status != 0) 
  {  
  perror("tcsetattr etc abnormal");  
  exit(-1);  
  }  

}

void serial_config(int fd,int baudrate,serial_format format)
{
  serial_speed_set(fd,baudrate);
  serial_format_set(fd,format);
  serial_etc_config(fd);
}



int main(int argc, char **argv)
{

  fd_set set_input;
  int fd;
  char buff[50]={'\0',};
  struct timeval timeout;
  int ret_select=0;
  int bytes=0;
   
  int write_num=0;
  int read_num=0;
  int wait=0;

  fd = serial_open(5);
  serial_config(fd,B115200,SERIAL_8N1);
printf("Serial Port Speed:115200bps\n");
printf("/*************************/\n");
   
  FD_ZERO(&set_input);
  FD_SET(fd,&set_input);
timeout.tv_sec=1;
timeout.tv_usec=0;

write_num=write(fd,"AT\r\n",strlen("AT\r\n"));
printf("now %d bytes has been written to the serial port\n",write_num);

tcflush(fd,TCIOFLUSH);
sleep(1);
ret_select=select(fd+1,&set_input,NULL,NULL,&timeout);
if(ret_select<0)
perror("select failed");
else if(ret_select==0)
printf("Reading timeout\n");
else
{
if(FD_ISSET(fd,&set_input))
{


read_num=read(fd,buff,512);
if(read_num>0)
{
buff[read_num]='\0';
printf("read:%s\n",buff);
}
else if(read_num==0)
{
printf("No Data Ready");
}
else
perror("Read");
}
}


  close(fd);  
  exit (0);
}

[解决办法]
先用 串口调试工具 发 完整的AT命令 试试.
[解决办法]
是不是没连地线啊?
[解决办法]
建议你去下一个串口监听的软件,看看到底是怎么回事,缩小问题出现的范围·~


我也曾经出现过这种问题,但是却是因为我调式产生的原因
[解决办法]
你收发数据都可以吗? 象楼上说的,用串口监听软件调试一下,看收发是不是正常。
[解决办法]
建议使用串口调试器按照通信协议调试一下先

热点排行