我想通过串口将下一个命令“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);
}
答案 0 :(得分:0)
您的循环while (ciclo)
无限:ciclo
永远不会成为false
。
基本上,您应该发送命令然后读取响应(并且每个发送的字符的响应可能包含多个字符)。
此外,我不确定您是如何检测到data
的结尾:目前您的command
仅包含3个字符,而不会终止'\0'
。
答案 1 :(得分:0)
您的循环很容易在数据结束时运行,从而导致未定义的行为。当ciclo=false
为0时,您需要始终设置data[i]
,因此您应该摆脱(通常无用的)ciclo变量,并使用while (data[i] != 0)
作为循环。
如果你想发送你的数据,然后读取响应(似乎很可能),那么你需要两个循环 - 首先是循环写入命令,然后是第二个非嵌套循环来读取响应。