我有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!
我做错了什么?
答案 0 :(得分:0)
答案 1 :(得分:0)
读取你的代码我没有看到任何奇怪的东西(除了返回fd,但这与任何调制解调器行为无关)。在我的机器上测试代码它工作正常,虽然我用AT
而不是ATZ
测试,并且读取返回0因为程序太快并且在调制解调器提供之前尝试读取一个回应。注释掉fcntl调用会使程序读取6个字节。
要进一步调试,您可以尝试使用AT
而不是ATZ
运行,看看是否有任何区别,因为ATZ会进行一些重置并清除它是不可能的,可能会有一些副作用导致你的问题(虽然我认为不太可能。但是测试很简单,应该作为可能的原因予以消除。)
然而,我并没有试图抢劫您编写串行通信程序的乐趣,我将指出我编写了一个名为atinout的程序,它已经完成了您尝试使用程序实现的功能。 Atinout用于命令行调用,如下所示:
$ echo ATZ | atinout - /dev/ttyS1 -
ATZ
OK
$