отправка по командам с c ++ на cubietruck

У меня есть cubieboard3 (cubietruck), и я пытаюсь отправить AT-команды из cb на мой модем, но я застрял при чтении ответа от модема.
Это мой код 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

Решение

Я изменился
fcntl (fd, F_SETFL, FNDELAY); в fcntl (fd, F_SETFL, 0);
и он начал правильно читать, но начал посылать какую-то корзину для ответа.

0

Другие решения

Читая ваш код, я не вижу странных вещей (кроме возврата fd, но это не связано ни с каким поведением модема). Тестирование кода на моей машине работает нормально, хотя я проверял с AT вместо ATZи чтение вернуло 0, потому что программа была слишком быстрой и пыталась прочитать, прежде чем модем успел дать ответ. Закомментирование вызова fcntl заставляет программу читать 6 байтов.

Для дальнейшей отладки вы можете попробовать запустить с AT вместо ATZ и посмотрим, имеет ли это какое-то значение, так как ATZ выполняет некоторый сброс и очистку, немыслимо, что могут быть некоторые побочные эффекты, которые вызывают вашу проблему (хотя я не думаю, что это очень вероятно. Но это просто проверить и следует устранено как возможная причина).

Однако, не пытаясь ограбить вас ради забавы написания программы последовательной связи, я укажу, что я написал программу под названием atinout который уже делает то, что вы пытаетесь достичь с помощью вашей программы. Atinout сделан для вызова командной строки, как показано ниже:

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector