2015-10-15 2 views
1

У меня есть модем GSM и проверьте его на шпатлевку. оно работает. Затем я отправляю AT с моей программой на C++, но модем отвечает AT. Это просто перекликается с моей командой и нет ответа.
это мой код:Почему моя команда AT эхо в моем GSM-модемом?

#include <QCoreApplication> 
#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <errno.h> 
#include <termios.h> 
#include <iostream> 
int fd; 
int openport(void) 
{ 

fd=open("/dev/ttyUSB0",O_RDWR|O_NOCTTY|O_NDELAY); 

     if (fd==-1) 
       { 
       perror("open_port: unable to open port /dev/ttyUSB0\n"); 
       return -1; 
       } 
     else 
       { 
       printf("open_port: succesfully open port /dev/ttyUSB0\n"); 
       fcntl(fd,F_SETFL,0); 
       return 1; 
       } 
} 
void closeport(void) 
{ 
    close(fd); 
} 
void configport(void) 
{ 
struct termios options; 
tcgetattr(fd,&options); 
cfsetispeed(&options,B9600); 
cfsetospeed(&options,B9600); 
options.c_cflag |= (CLOCAL | CREAD); 
tcsetattr(fd,TCSANOW,&options); 
options.c_cflag &= ~CSIZE; 
options.c_cflag |= CS8; 
options.c_cflag &= ~ PARENB; 
options.c_cflag &= ~CSTOPB; 
options.c_cflag &= ~CSIZE; 
options.c_cflag |= CS8; 
options.c_iflag &= ~(IXON|IXOFF|IXANY); 
} 
void writeport1(void) 
{ 
    char w[]="AT\r\n"; 

    //std::cout << strlen(w); 
    //std::cout << w; 

    write(fd,w,sizeof(w)); 
} 



int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 
    int aa ; 
    char i[10]; 
    aa=openport(); 
    if (aa==1) 
    { 
     configport(); 
     writeport1(); 
     printf("start reading ..... \n"); 
     aa=read(fd,i,sizeof(i)); 
     i[aa]=0;//terminate the string 
     //std::cout << i << std::endl; 
     printf("finish reading ..... \n"); 

    } 

    closeport(); 
    return a.exec(); 
} 

выход заключается в следующем:

Go открыть порт open_port:
успешно открыт порт/DEV/ttyUSB0 порт
[корень @ FriendlyARM /] # ./SerialPort -qws
open_port: успешно открыть порт/DEV/ttyUSB0
начала чтения .....

где моя ошибка?

+0

Может оказаться полезным найти инструмент, который позволит вам точно видеть байты, проходящие через последовательный порт. У меня есть аппаратное устройство, которое я могу подключить к последовательному кабелю и захватить данные, а также программное обеспечение, которое позволяет просматривать данные по мере прохождения через драйвер последовательного порта. Наблюдение * фактических данных в строке * может быть очень полезно для устранения таких неполадок. Вероятно, вы увидите, что байты, поступающие из вашей программы, не совсем то, что вы ожидаете, или что «ОК» действительно вернется, как раз поздно, как говорят другие, может случиться. – Steve

+0

Как я могу видеть передачу байта с последовательным портом? Я думаю, что это моя проблема. (Я имею в виду, возможно, что данные, отправленные мной, имеют проблему). когда я отправляю AT с моим компьютером на модем, немедленно отвечу OK. –

ответ

1

Вы не расторг строку w, поэтому в то время как write вызов хорошо, вы получите неопределенное поведение, когда вы передаете его cout - изменение:

char w[4]; 
w[0]=65; 
w[1]=84; 
w[2]=13; 
w[3]=10; 
//sprintf(i,"2f9",k); 
std::cout << w; 
write(fd1,w,sizeof(w)); 

к:

char w[5]; 
w[0]='A'; 
w[1]='T'; 
w[2]=13; 
w[3]=10; 
w[4]=0;     // <<< 
//sprintf(i,"2f9",k); 
std::cout << w; 
write(fd1,w,strlen(w)); // <<< 

или, возможно, более лаконично:

char w[] = "AT\r\n" 
std::cout << w; 
write(fd1,w,strlen(w)); 
+0

благодарю моего друга. но после изменения кода. он по-прежнему не работает :( –

+0

У вас, вероятно, есть несколько ошибок, но по крайней мере это исправляет один из них. Обратите внимание, что большинство модемов эхо-команд по умолчанию, поэтому, если вы отправляете «AT», вы получите эхо-сигнал «AT» , а затем «ОК». –

+1

Команды эхо-сигнала могут путать консоль, поэтому отключите команду эхо-сигнала. AT-команда ATE0, затем эхо выключено –

0

Это tak es, чтобы модем ответил OK, попробуйте подождать некоторое время, а затем прочитайте или поместите чтение в цикле.

+0

, когда я тестирую в шпаклере, модем отвечает мне немедленно ОК. (5), но ничего не меняется. –

Смежные вопросы