串行端口接收到它刚刚发送的相同字节

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 被串口驱动程序完成,因此数据到达应用程序时没有变化。