控制GPRS模块的串口程序

ypyuan   2009-9-21 16:34 楼主
大家好,我想利用程序来控制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       
#include        
#include     
#include     
#include     
#include        
#include     
#include          
#include          

#include           
#include       
#include           


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);
}

回复评论 (8)

顶一个
先连接到电脑上试试,看串口通了没。
点赞  2009-9-23 09:25
引用: 引用 1 楼 liuxu2559 的回复:
顶一个
先连接到电脑上试试,看串口通了没。

通了的
点赞  2009-9-23 17:17
先用   串口调试工具   发   完整的AT命令  试试.
点赞  2009-9-24 13:48
是不是没连地线啊?
点赞  2009-9-24 14:52
建议你去下一个串口监听的软件,看看到底是怎么回事,缩小问题出现的范围·~


我也曾经出现过这种问题,但是却是因为我调式产生的原因
点赞  2009-9-24 16:35
你收发数据都可以吗? 象楼上说的,用串口监听软件调试一下,看收发是不是正常。
点赞  2009-9-24 17:23
建议使用串口调试器按照通信协议调试一下先
点赞  2009-9-24 22:16
嗯,问题已经解决了
其实很无语,因为我是笔记本,用的是USB转串口连接线,在转换过程中貌似与正常的串口有些不同
后来我用台式机的串口,程序基本没有变,一切都正常

谢谢大家们的回复,祝你们好运!
点赞  2009-9-28 14:31
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复