串行端口接收到它刚刚发送的相同字节
Serial port receives same bytes it just sent
我正在尝试使用 Boost.Asio 读取和写入串行端口。这是我的代码:
void async_read(boost::asio::serial_port& serial_port)
{
auto buffer = std::make_shared<std::vector<uint8_t>>(64);
serial_port.async_read_some(boost::asio::buffer(*buffer),
[buffer, &serial_port](const boost::system::error_code& error, size_t bytes_read)
{
if (error)
{
std::cout << "Error reading serial port: " << error.message() << std::endl;
return;
}
std::string message(buffer->begin(), buffer->end());
std::cout << "Read " << bytes_read << " bytes:\t" << message << std::endl;
async_read(serial_port);
});
}
void async_write(boost::asio::serial_port& serial_port)
{
auto timer = std::make_shared<boost::asio::deadline_timer>(serial_port.get_io_service(), boost::posix_time::seconds(1));
timer->async_wait(
[&serial_port, timer](const boost::system::error_code& error)
{
if (error)
{
std::cout << "Timer error: " << error.message() << std::endl;
return;
}
auto message = std::make_shared<std::string>("Hello\n");
boost::asio::async_write(serial_port, boost::asio::buffer(*message),
[message, &serial_port](const boost::system::error_code& error, size_t bytes_sent)
{
if (error)
{
std::cout << "Error writing to serial port: " << error.message() << std::endl;
return;
}
std::cout << "Wrote " << bytes_sent << " bytes" << std::endl;
async_write(serial_port);
});
});
}
int main()
{
boost::asio::io_service service;
auto serial_port = boost::asio::serial_port(service, "/dev/ttyUSB0");
serial_port.set_option(boost::asio::serial_port::baud_rate(9600));
async_read(serial_port);
async_write(serial_port);
service.run();
}
在串口线的另一端,我有一台单独的机器运行cat /dev/ttyTHS0
。
我的问题 是每当程序执行 async_write
时,这些相同的字节立即由 async_read
完成处理程序处理 - 即使远程机器没有发送任何东西。
我不确定根本原因是代码,还是因为我在另一端使用了 cat
。当 cat
不是 运行 时,我没有遇到问题。
运行 上面的代码(另一端是 cat /dev/ttyTHS0
)给出的输出如下:
Wrote 6 bytes
Read 7 bytes: Hello
Wrote 6 bytes
Read 3 bytes: Hel
Read 4 bytes: lo
Wrote 6 bytes
Read 7 bytes: Hello
Wrote 6 bytes
Read 1 bytes: H
Read 6 bytes: ello
Wrote 6 bytes
Read 7 bytes: Hello
也许我遗漏了一些明显的东西,但我们将不胜感激!谢谢!
这是串行端口的预期行为。这些通常用于将 vt100 之类的终端连接到计算机。当您在键盘上键入时,字符被发送到计算机,串口将其回显到显示它的vt100屏幕。
如果您在遥控器上 运行 stty -a -F /dev/ttyTHS0
,您会看到设置 echo
处于打开状态(在您 运行 遥控器上的程序之前)。您可以使用 stty -echo -F /dev/ttyTHS0
将其关闭,此时它将显示为 -echo
.
通常,当串行端口用于计算机之间的通信时,应用程序会将端口设置为 raw,noecho。这是为了避免某些 t运行slations 被串口驱动程序完成,因此数据到达应用程序时没有变化。
我正在尝试使用 Boost.Asio 读取和写入串行端口。这是我的代码:
void async_read(boost::asio::serial_port& serial_port)
{
auto buffer = std::make_shared<std::vector<uint8_t>>(64);
serial_port.async_read_some(boost::asio::buffer(*buffer),
[buffer, &serial_port](const boost::system::error_code& error, size_t bytes_read)
{
if (error)
{
std::cout << "Error reading serial port: " << error.message() << std::endl;
return;
}
std::string message(buffer->begin(), buffer->end());
std::cout << "Read " << bytes_read << " bytes:\t" << message << std::endl;
async_read(serial_port);
});
}
void async_write(boost::asio::serial_port& serial_port)
{
auto timer = std::make_shared<boost::asio::deadline_timer>(serial_port.get_io_service(), boost::posix_time::seconds(1));
timer->async_wait(
[&serial_port, timer](const boost::system::error_code& error)
{
if (error)
{
std::cout << "Timer error: " << error.message() << std::endl;
return;
}
auto message = std::make_shared<std::string>("Hello\n");
boost::asio::async_write(serial_port, boost::asio::buffer(*message),
[message, &serial_port](const boost::system::error_code& error, size_t bytes_sent)
{
if (error)
{
std::cout << "Error writing to serial port: " << error.message() << std::endl;
return;
}
std::cout << "Wrote " << bytes_sent << " bytes" << std::endl;
async_write(serial_port);
});
});
}
int main()
{
boost::asio::io_service service;
auto serial_port = boost::asio::serial_port(service, "/dev/ttyUSB0");
serial_port.set_option(boost::asio::serial_port::baud_rate(9600));
async_read(serial_port);
async_write(serial_port);
service.run();
}
在串口线的另一端,我有一台单独的机器运行cat /dev/ttyTHS0
。
我的问题 是每当程序执行 async_write
时,这些相同的字节立即由 async_read
完成处理程序处理 - 即使远程机器没有发送任何东西。
我不确定根本原因是代码,还是因为我在另一端使用了 cat
。当 cat
不是 运行 时,我没有遇到问题。
运行 上面的代码(另一端是 cat /dev/ttyTHS0
)给出的输出如下:
Wrote 6 bytes
Read 7 bytes: Hello
Wrote 6 bytes
Read 3 bytes: Hel
Read 4 bytes: lo
Wrote 6 bytes
Read 7 bytes: Hello
Wrote 6 bytes
Read 1 bytes: H
Read 6 bytes: ello
Wrote 6 bytes
Read 7 bytes: Hello
也许我遗漏了一些明显的东西,但我们将不胜感激!谢谢!
这是串行端口的预期行为。这些通常用于将 vt100 之类的终端连接到计算机。当您在键盘上键入时,字符被发送到计算机,串口将其回显到显示它的vt100屏幕。
如果您在遥控器上 运行 stty -a -F /dev/ttyTHS0
,您会看到设置 echo
处于打开状态(在您 运行 遥控器上的程序之前)。您可以使用 stty -echo -F /dev/ttyTHS0
将其关闭,此时它将显示为 -echo
.
通常,当串行端口用于计算机之间的通信时,应用程序会将端口设置为 raw,noecho。这是为了避免某些 t运行slations 被串口驱动程序完成,因此数据到达应用程序时没有变化。