通过C中的串口将命令写入gprs

时间:2014-02-23 00:51:14

标签: c serial-port gprs

我想通过串口将下一个命令“at”发送给我的gprs。 gprs应该回答“ok”,但我无法弄清楚下面的代码。 当我在gtkterm(在我的Debian中)发送命令“at”时我按下输入gprs响应“ok” 没有问题,但在我的代码中出了问题。我认为这是\r,但我不知道。

新代码,但结果相同:

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <stdbool.h>

int main(int argc,char** argv)
{
    char comando[]={'a','t','\r','\0'}; 
        comunicacion(comando);

        return EXIT_SUCCESS;
}
comunicacion(char data[])
{
    struct termios tio;
        struct termios stdio;
        struct termios old_stdio;
        int tty_fd;

        unsigned char c ='d';
        tcgetattr(STDOUT_FILENO,&old_stdio);

        printf("Please start with /dev/ttyS1 (for example)\n");
        memset(&stdio,0,sizeof(stdio));
        stdio.c_iflag=0;
        stdio.c_oflag=0;
        stdio.c_cflag=0;
        stdio.c_lflag=0;
        stdio.c_cc[VMIN]=1;
        stdio.c_cc[VTIME]=0;
        tcsetattr(STDOUT_FILENO,TCSANOW,&stdio);
        tcsetattr(STDOUT_FILENO,TCSAFLUSH,&stdio);
        fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK);       // make the reads non-blocking

        memset(&tio,0,sizeof(tio));
        tio.c_iflag=0;
        tio.c_oflag=0;
        tio.c_cflag=CS8|CREAD|CLOCAL;           // 8n1, see termios.h for more information
        tio.c_lflag=0;
        tio.c_cc[VMIN]=1;
        tio.c_cc[VTIME]=5;

        tty_fd=open("/dev/ttyUSB0", O_RDWR | O_NONBLOCK);      
        cfsetospeed(&tio,B115200);            // 115200 baud
        cfsetispeed(&tio,B115200);            // 115200 baud

        tcsetattr(tty_fd,TCSANOW,&tio);
        // enter \r


        int i =0;
        char caracter = ' ';
        bool ciclo = true;

        while(ciclo)
        {
            c=data[i];
            i++;
            if(c != '\0')
            {
               write(tty_fd,&c,1);    
            }
            else
            {
               if(read(tty_fd,&c,1)>0)
               {
                   write(STDOUT_FILENO,&c,1);
               } 
               else
               {
                   ciclo = false;
               }
            }
        }

        // if new data is available on the serial port, print it out
        // if new data is available on the console, send it to the serial port

        close(tty_fd);
        tcsetattr(STDOUT_FILENO,TCSANOW,&old_stdio);
}

2 个答案:

答案 0 :(得分:0)

您的循环while (ciclo)无限:ciclo永远不会成为false。 基本上,您应该发送命令然后读取响应(并且每个发送的字符的响应可能包含多个字符)。

此外,我不确定您是如何检测到data的结尾:目前您的command仅包含3个字符,而不会终止'\0'

答案 1 :(得分:0)

您的循环很容易在数据结束时运行,从而导致未定义的行为。当ciclo=false为0时,您需要始终设置data[i],因此您应该摆脱(通常无用的)ciclo变量,并使用while (data[i] != 0)作为循环。

如果你想发送你的数据,然后读取响应(似乎很可能),那么你需要两个循环 - 首先是循环写入命令,然后是第二个非嵌套循环来读取响应。