【问题标题】:Writing AT commands embedded linux编写AT命令嵌入式linux
【发布时间】:2013-03-15 10:31:16
【问题描述】:

我在将 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();
}

【问题讨论】:

  • 你怎么知道没有错误?除了open 调用之外,您不会对系统调用进行任何错误检查。
  • 另外一点,你还要写完整的command数组,包括终止的'\0'字符。我猜你应该试试"\r\n" 而不是字符串终止符。
  • 因为如果我按原样运行代码,我会得到输出。写 0 读字符串:AT+CSQ 读 8
  • "\r\n" 并从字符串中删除 '\0' 就成功了,你拯救了我的一天! :)

标签: c linux embedded embedded-linux gsm


【解决方案1】:

你应该做的第一件事就是运行

stty -F /dev/ttySP0

在 minicom 运行和您的程序运行时执行此操作。检查一切并进行比较。有很多事情可能会导致您出现问题。

完成这些匹配后,您需要确保发送的数据能够发送出去。

cat /proc/tty/driver/serial

比较发送数据之前和之后的 tx 值,以确保它正在输出。

如果是,那么您可以检查 rx 值。如果您没有得到响应,您可能需要一台示波器来检查线路上的数据。如果你不能这样做,那么三重检查波特率和流量控制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    相关资源
    最近更新 更多