2014-04-08 4 views
0

안녕하세요, 우분투 데스크톱의 COM 포트 (ttyS0)를 사용하여 teltonika gsm 모뎀에 AT 명령을 보내려고합니다. 문제는 AT 명령 (또는 다른 명령 또는 문자열)에 "OK"응답을 보내는 대신 동일한 AT 명령이 다시 echo됩니다. 이와 관련하여 도움이 될 것입니다.우분투에서 C를 사용하여 teltonika GSM 모뎀에 AT 명령 보내기 12.04

#include <sys/types.h>             
#include <sys/stat.h>              
#include <fcntl.h>              
#include <termios.h>              
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <time.h> 
#include <errno.h> 
#define BAUDRATE B115200 
#define COM1 "/dev/ttyS0" 
static int fd; 
static struct termios oldtio,newtio; 

//============================================================== 
int tty_read(char *buf1,int nbytes) 
{ 
int temp; 
temp = read(fd,buf1,nbytes); 
printf("Read string: %s\n", buf1); 
return temp; 
} 
//============================================================== 
int tty_end() 
{ 
tcsetattr(fd,TCSANOW,&oldtio); 
close(fd); 
} 
//============================================================== 
int tty_writecmd(char *buf,int nbytes) 
{ 

write(fd,buf,nbytes); 

usleep(1000); 
return tcdrain(fd); 
} 
//============================================================== 
int baud = B115200; 
int tty_init() 
{ 
fd = open(COM1, O_RDWR); 
if (fd <0) { 
    perror(COM1); 
    exit(1); 
} 
tcgetattr(fd,&oldtio); 
bzero(&newtio, sizeof(newtio)); 
newtio.c_cflag = baud | CRTSCTS | CS8 | CLOCAL | CREAD ; 

newtio.c_iflag = IGNPAR | ICRNL; 
newtio.c_oflag = 0; 
newtio.c_lflag = ICANON; 
newtio.c_cc[VINTR] = 0;  
newtio.c_cc[VQUIT] = 0;  
newtio.c_cc[VERASE] = 0;  
newtio.c_cc[VKILL] = 0;  
newtio.c_cc[VEOF]  = 4;  
newtio.c_cc[VTIME] = 0; 
newtio.c_cc[VMIN]  = 1; 
newtio.c_cc[VSWTC] = 0;  
newtio.c_cc[VSTART] = 0;  
newtio.c_cc[VSTOP] = 0; 
newtio.c_cc[VSUSP] = 0; 
newtio.c_cc[VEOL]  = 0; 
newtio.c_cc[VREPRINT] = 0; 
newtio.c_cc[VDISCARD] = 0; 
newtio.c_cc[VWERASE] = 0; 
newtio.c_cc[VLNEXT] = 0; 
newtio.c_cc[VEOL2] = 0; 
tcflush(fd, TCIFLUSH); 
tcsetattr(fd,TCSANOW,&newtio); 
return 0; 
} 
int main(int argc, char *argv[]) 
{ int wr,rd; 
char *buff; 
char recv[15]; 
char command[] = "AT\r\n"; 
tty_init(); 
printf("Write: %d\n", tty_writecmd(command, sizeof(command))); 

usleep(10000); 
printf("Read: %d\n", tty_read(recv ,sizeof(recv))); 
tty_end(); 
} 

and the output is like 
write:0 
Read string: AT 
Read:3 

감사 P.S : 여기에 근무하는 C 코드 m의이 문제는 우분투 데스크탑에서 발생, 프로그램은 VM웨어 스테이션의 직렬 포트에서 아무것도 읽지 않습니다.

+0

linux/termios 등에서 코드를 디버그하는 데 익숙하지 않지만 많은 모뎀의 경우 기본적으로 에코가 설정되어 있습니다. 아마도 "ate0"을 비활성화하십시오. – jayjay

+0

먼저 검증 된 소프트웨어로 모뎀을 테스트하십시오. 미니 콤. 응답이 예상대로 (예 : 'OK'를 반환하면) 되돌아 가서 자신의 프로그램에 집중할 수 있습니다. 그건 그렇고,'sizeof (command)'는 후행하는'\ 0'을 포함하므로 여러분은 그것을 보내고 있습니다. 그게 의도적 인거야? –

+0

@jayjay thnx에 대한 요점은, 내가 만약에 그것이 작동한다면 knw하자. – user3511253

답변

0

대신 usleep (10000); 사용 usleep (1000);

관련 문제