C ++将字节写入串行流

时间:2012-02-17 17:06:28

标签: c++ linux serial-port libserial

我意识到这种问题散布在整个互联网上,但似乎没有任何东西指向我。

我正在尝试通过串行流向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 个答案:

答案 0 :(得分:4)

serial.write(str.data(), str.size());

您当前的代码使用sizeof data,它是指针的大小,并且不会告诉您指向数据的长度。

使用“默认”波特率似乎也不太可行。

如果修复后仍然遇到问题,可能是非标准SerialStream类(不属于标准C ++库或POSIX)。如果你提供了一个链接,我们可以看看它是否正确。

我建议您使用POSIX标准函数opentcsetattrreadwrite作为串口使用,因为它们被广泛使用且任何错误都有很久以来一直被发现和修复。

答案 1 :(得分:0)

您是否尝试过使用

str.c_str()

而不是

str.data()

? std :: string.data()不保证返回以null结尾的c样式字符串。如果要将std :: string转换为c样式的const char *,请使用.c_str()

答案 2 :(得分:0)

是的,在转移使用库之后,我设法与另一个同时解决这个问题。我的这个问题与另一个问题有同样的解决方案。在这里你们去: Writing STRINGS to serial port in C++ linux

非常感谢大家的帮助!