C ++ записывает байт в последовательный поток - PullRequest
2 голосов
/ 17 февраля 2012

Я понял, что такого рода вопросы разбросаны по всему Интернету, но, похоже, ничто не указывает на меня правильно.

Я пытаюсь отправить команду на плату управления Propeller через последовательный поток. Кажется, что соединение работает, но оно продолжает выдавать ошибку для любого типа команды, которую я посылаю - он возвращает те же шестнадцатеричные данные: 10 ffffffe1. Кажется, что отправляемые данные не в правильном формате. Плата, похоже, ожидает байтовые данные, и (я думаю) мой код, кажется, делает это, но я просто не могу понять, что я делаю неправильно. Я думаю, что я не конвертирую данные правильно. Вот мой код ниже. Спасибо всем.

Примечание: код ниже не показывает чтение ответа; это сделано в другой моей программе, которая работает, она также правильно читает ответы от последовательных терминалов.

#include <iostream>
#include <SerialStream.h>
using namespace LibSerial;
using namespace std;
int main(int argc, char** argv) {

SerialStream serial;
serial.Open("/dev/ttyUSB0");
serial.SetCharSize(SerialStreamBuf::CHAR_SIZE_8);
serial.SetBaudRate(SerialStreamBuf::DEFAULT_BAUD);
serial.SetNumOfStopBits(1);
serial.SetFlowControl(SerialStreamBuf::FLOW_CONTROL_NONE);
if(serial.good()){
    cout << "SUCCESSFUL: serial port opened at: /dev/ttyUSB0" << endl;
    usleep(5000);
}
else{
    cout << "ERROR: Could not open serial port." << endl;
    return 1;
}

std::string str= "ver\r"; //command to get version of firmware
const char* data = str.data();
serial.write(data, sizeof data);
return 0 ;

}

Ответы [ 3 ]

4 голосов
/ 17 февраля 2012
serial.write(str.data(), str.size());

Ваш текущий код использует sizeof data, который является размером указателя, и ничего не говорит вам о длине указываемых данных.

Использование скорости передачи по умолчанию также маловероятно.

Если у вас все еще есть проблемы после исправления, это, вероятно, ваш нестандартный класс SerialStream (который НЕ является частью стандартной библиотеки C ++ или POSIX). Если вы предоставите ссылку на нее, мы могли бы посмотреть, правильно ли это.

Я бы предложил использовать стандартные функции POSIX open, tcsetattr, read и write для вашего использования последовательного порта, поскольку они широко используются, и любые ошибки давно найдены и исправлены.

0 голосов
/ 18 февраля 2012

Да, после того, как я переключился на использование библиотек, мне удалось решить эту проблему одновременно с другой.Эта моя проблема имеет такое же решение другой.Вот, пожалуйста, ребята: Запись STRINGS на последовательный порт в C ++ linux

Спасибо всем за помощь, правда!

0 голосов
/ 17 февраля 2012

Вы пробовали использовать

str.c_str()

вместо

str.data()

? std :: string.data () не гарантирует возвращение строки c-стиля с нулевым символом в конце. Если вы хотите преобразовать std :: string в const char * в стиле c, используйте .c_str ()

...