C++ C++;将字节写入串行流

C++ C++;将字节写入串行流,c++,linux,serial-port,libserial,C++,Linux,Serial Port,Libserial,我意识到这类问题分散在互联网上,但似乎没有什么东西能正确地告诉我 我正试图通过串行流向螺旋桨控制板发送命令。该连接似乎正在工作,但对于我发送的任何类型的命令,它都会不断出错-它返回相同的十六进制数据:10ffffffe1。似乎发送的数据格式不正确。董事会似乎期待字节数据,(我认为)我的代码似乎正在这样做,但我只是不知道我做错了什么。我想我没有正确地转换数据。下面是我的代码。谢谢大家 注意:下面的代码不显示读取响应;这是在我的另一个程序中完成的,它可以正常工作,它可以正确地读取串行终端的响应 #i

我意识到这类问题分散在互联网上,但似乎没有什么东西能正确地告诉我

我正试图通过串行流向螺旋桨控制板发送命令。该连接似乎正在工作,但对于我发送的任何类型的命令,它都会不断出错-它返回相同的十六进制数据:10ffffffe1。似乎发送的数据格式不正确。董事会似乎期待字节数据,(我认为)我的代码似乎正在这样做,但我只是不知道我做错了什么。我想我没有正确地转换数据。下面是我的代码。谢谢大家

注意:下面的代码不显示读取响应;这是在我的另一个程序中完成的,它可以正常工作,它可以正确地读取串行终端的响应

#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 ;
#包括
#包括
使用名称空间LibSerial;
使用名称空间std;
int main(int argc,字符**argv){
串行流串行;
serial.Open(“/dev/ttyUSB0”);
serial.SetCharSize(SerialStreamBuf::CHAR_SIZE_8);
serial.SetBaudRate(SerialStreamBuf::DEFAULT_BAUD);
串行。SETNUMOF停止位(1);
serial.SetFlowControl(SerialStreamBuf::FLOW\u CONTROL\u NONE);
if(serial.good()){
库特
您当前的代码使用的是
sizeof data
,它是指针的大小,不会告诉您指向的数据的长度

使用“默认”波特率似乎也不太可能起作用

如果修复这些问题后仍然存在问题,那可能是你的非标准<代码> SerialSturns/Cux>类(它不是标准C++库或POSIX的一部分)。如果你提供了一个链接,我们可以查看它是否正确。< /P> 我建议您使用POSIX标准函数

open
tcsetattr
read
write
,以便使用串行端口,因为这些函数被广泛使用,而且任何错误早就被发现并修复了

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

使用“默认”波特率似乎也不太可能起作用

如果修复这些问题后仍然存在问题,那可能是你的非标准<代码> SerialSturns/Cux>类(它不是标准C++库或POSIX的一部分)。如果你提供了一个链接,我们可以查看它是否正确。< /P> 我建议您使用POSIX标准函数

open
tcsetattr
read
write
,用于串行端口使用,因为这些函数被广泛使用,而且任何错误早就被发现并修复了。

您是否尝试过使用它们

str.c_str()
而不是

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

是否尝试使用

str.c_str()
而不是

str.data()

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

是的,在改变了使用库的方式之后,我设法在解决另一个问题的同时解决了这个问题。我的这个问题与另一个问题有相同的解决方案。给你们:


感谢大家的帮助,真的!

是的,在改变了使用库的方式后,我设法在解决另一个问题的同时解决了这个问题。我的这个问题与另一个问题的解决方案相同。给你们:


谢谢大家的帮助,真的!

我见过的每个
write
函数都使用计数缓冲区,而不是NUL终止。这里似乎也是这样。没错。这将解释函数的第二个参数表示大小。哦!是的,我想这不会是个问题。不过,谢谢你。我也会尝试一下明天。我见过的每一个
write
函数都使用一个计数的缓冲区,而不是NUL终止。这里似乎也是这样。没错。这将解释函数的第二个参数表示大小。哦!是的,我想这不会是一个问题。不过,谢谢你。我明天也会尝试一下。非常感谢你的adv街上结冰尺寸()。明天早上上班的时候,我会第一件事就是试试。希望它能起作用。是的,默认波特率的问题也是一个问题,但我想我不想在这一点上提出来,然后一个接一个地解决问题。情况是,除了默认波特率,没有其他设置能起作用-它们都会返回错误。我不知道为什么。你知道为什么吗@30小时飞行:在没有看到你的串口库的情况下,我无法告诉你为什么其他波特率不起作用。它是真正的PC-AT串口,还是USB串行适配器?我确实相信使用错误的波特率会产生你问题中提到的垃圾数据。在解决波特率之前,你无法解决任何问题。然而,我知道我有另一个程序从设备中读取串行数据。它有相同的波特率问题,但它能够正确读取数据。因此,我认为波特率不是一个大问题。你怎么看?串行端口库的名称是“LibSerial”从代码中可以看出。我很确定它们是有效的波特率值。你觉得怎么样?@30hoursfiright:如果波特率不匹配,就不会有数据通过。另外,故障可能是间歇性的,因为“default”通常意味着“无论最后使用了什么程序”。我从来没有听说过“LibSerial”以前,您必须提供一个链接。通常情况下,
tcsetattr
函数用于在Linux上配置串行端口。我明白了。这是有道理的。但是,每次我将波特率设置为115200,然后检查连接是否
。good()
它总是返回false。这是指向库的链接:我将开始查看
tcsetattr
非常感谢您对str.size()的建议。我将在明天早上上班时第一件事就是尝试它。希望它能起作用。是的,那就是