簡體   English   中英

編寫嵌入式Linux的AT命令

[英]Writing AT commands embedded linux

我在將AT命令寫入GSM模塊時遇到問題。 當我使用minicom -b 115200 -D / dev / ttySP0 --term = vt100時,它可以完美地工作,但是我無法弄清楚如何在C代碼中執行相同的操作。 我沒有收到任何錯誤,但是模塊對命令沒有任何反應。 有人知道怎么了嗎?

#include <sys/types.h>                                                  
#include <sys/stat.h>                                                      
#include <fcntl.h>                                                       
#include <termios.h>                                                    
#include <stdio.h>    
#define BAUDRATE B115200
#define COM1 "/dev/ttySP0"
static int fd;
static struct termios oldtio,newtio;

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

//==============================================================
int tty_writecmd(char *buf,int nbytes)
{
int i;
for(i=0; i<nbytes; i++) {
write(fd,&buf[i],1);
usleep(100);
}
write(fd,"\n",1); //Tried \0 \r aswell
usleep(300000);
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[])
{
  char recv[10];
  char command[] = "AT+CSQ";
  tty_init();
  printf("Write: %d\n", tty_writecmd(command, sizeof(command)));
  usleep(40000);
  printf("Read: %d\n", tty_read(recv ,sizeof(recv)));
  tty_end();
}

您應該做的第一件事就是運行

stty -F / dev / ttySP0

在minicom運行時和程序運行時執行此操作。 檢查所有內容並進行比較。 有很多事情可能導致您遇到問題。

匹配后,您要確保發送的數據正確無誤。

貓/ proc / tty /驅動程序/序列

在發送數據之前和之后比較tx值,以確保它不會丟失。

如果是,則可以檢查rx值。 如果沒有響應,則可能需要使用示波器檢查線路上的數據。 如果您無法執行此操作,請三重檢查波特率和流量控制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM