在cubietruck上使用c ++发送命令

时间:2015-04-01 14:07:01

标签: c++ at-command

我有cubieboard3(cubietruck)并且我试图将来自cb的AT命令发送到我的调制解调器,但我仍然坚持从调制解调器读取答案。 这是我的C ++代码:

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>

using namespace std;


int main(void)
{
  int fd; /* file descryptor for port */

  fd = open("/dev/ttyS1", O_RDWR | O_NOCTTY | O_NDELAY);
  if (fd == -1)//if could not open the port
  {
    perror("open_port: Unable to open /dev/ttyS1 - ");
  }
  else //if port opened
  {
    fcntl(fd, F_SETFL, FNDELAY);
      //sending data
    std::cout<<"Port opened!"<<endl;
    std::cout<<"Sending 'ATZ\r' "<<endl;
    int n = write(fd, "ATZ\r", 4);
    if (n < 0)
      fputs("write() of 4 bytes failed!\n", stderr);
    else std::cout<<"Data send!"<<endl;

    //reading data
    char buf [10];
    int f = read(fd, buf, sizeof(buf));
    if (f < 0) fputs("Reading failed!\n", stderr);
    else std::cout<<f<<endl;
  }
  return (fd);
}

然后它返回我:

Port opened!
Sending ATZ
Data send!
Reading failed!

我做错了什么?

2 个答案:

答案 0 :(得分:0)

我改变了 fcntl(fd,F_SETFL,FNDELAY);到fcntl(fd,F_SETFL,0); 并且它开始正确读取,但它开始发送某种垃圾来回答。

答案 1 :(得分:0)

读取你的代码我没有看到任何奇怪的东西(除了返回fd,但这与任何调制解调器行为无关)。在我的机器上测试代码它工作正常,虽然我用AT而不是ATZ测试,并且读取返回0因为程序太快并且在调制解调器提供之前尝试读取一个回应。注释掉fcntl调用会使程序读取6个字节。

要进一步调试,您可以尝试使用AT而不是ATZ运行,看看是否有任何区别,因为ATZ会进行一些重置并清除它是不可能的,可能会有一些副作用导致你的问题(虽然我认为不太可能。但是测试很简单,应该作为可能的原因予以消除。)

然而,我并没有试图抢劫您编写串行通信程序的乐趣,我将指出我编写了一个名为atinout的程序,它已经完成了您尝试使用程序实现的功能。 Atinout用于命令行调用,如下所示:

$ echo ATZ | atinout - /dev/ttyS1 -
ATZ
OK
$