【发布时间】:2018-02-26 07:39:04
【问题描述】:
我无法理解为什么我的应用程序需要这么长时间才能通过 Windows 10 上的串行端口与设备进行通信。我编写了两个小型测试应用程序来尝试看看是什么让它如此缓慢。这是它们的代码:
''VB.NET code
Imports System.IO.Ports
Module Module1
Sub Main()
Dim port As New SerialPort("COM3", 921600, Parity.None, 8, 1)
port.Open()
port.DtrEnable = True
port.RtsEnable = True
Dim profiler As New Stopwatch
profiler.Start()
For i As Integer = 1 To 100
port.Write("1PA?" & vbCrLf)
port.ReadLine()
port.Write("TB" & vbCrLf)
port.ReadLine()
Next
profiler.Stop()
Console.WriteLine("Average: " & profiler.ElapsedMilliseconds / 100 & "ms")
Console.ReadKey()
End Sub
End Module
还有:
//C++ code
#include <iostream>
#include <string>
#include "boost/asio/io_service.hpp"
#include "boost/asio/serial_port.hpp"
#include "boost/asio/read_until.hpp"
#include "boost/asio/write.hpp"
#include "boost/asio/streambuf.hpp"
#include "boost/asio/buffer.hpp"
#include "boost/thread.hpp"
#include "boost/ref.hpp"
#include "boost/lexical_cast.hpp"
using boost::asio::io_service;
using boost::asio::serial_port;
using boost::asio::streambuf;
size_t read_until(serial_port& port, streambuf& buf, const std::string& delim)
{
return boost::asio::read_until(port, buf, delim);
}
void complete(const boost::system::error_code& error, std::size_t bytes_transferred)
{
if (error)
std::cout << "Error\n";
}
int main()
{
std::cout << "Starting...\n";
io_service io;
serial_port port(io, "COM3");
streambuf buf(1000);
boost::posix_time::ptime t0 = boost::posix_time::microsec_clock::local_time();
port.set_option(boost::asio::serial_port_base::stop_bits(boost::asio::serial_port_base::stop_bits::one));
port.set_option(boost::asio::serial_port_base::parity());
port.set_option(boost::asio::serial_port_base::flow_control(boost::asio::serial_port::flow_control::hardware));
port.set_option(boost::asio::serial_port_base::baud_rate(921600));
port.set_option(boost::asio::serial_port_base::character_size(8));
for (int i = 0; i < 100; ++i)
{
boost::asio::write(port, boost::asio::buffer("1PA?\r\n", 6));
read_until(port, buf, "\r\n");
buf.consume(buf.size());
boost::asio::write(port, boost::asio::buffer("TB\r\n", 4));
read_until(port, buf, "\r\n");
buf.consume(buf.size());
}
boost::posix_time::ptime tE = boost::posix_time::microsec_clock::local_time();
std::cout << (tE-t0).total_milliseconds() << '\n';
std::cin.get();
}
问题在于 VB.NET 代码报告平均每次循环迭代约 6 毫秒(即每个写入/读取对 3 毫秒),而 C++ 代码每次迭代需要超过 60 毫秒。
项目的其余部分是用 C++ 编写的,所以我需要改进该代码,不能简单地使用另一个代码。目前,我发现最快的方法是通过 TCP/IP 与将 TCP/IP 路由到串行端口的 VB.NET 应用程序进行通信。奇怪的是,尽管涉及额外的步骤,但它的速度是直接 C++ 实现的两倍多。
我有什么遗漏的吗,也许是 C++ 实现中的一个设置?我已经尝试过所有的流量控制选项,不同的缓冲区大小,...
【问题讨论】:
-
您是否使用优化的构建进行测试?如果没有,请这样做。
-
@JesperJuhl:这不太可能在这里有所作为。
-
你试过分析它吗?
-
您将
boost用于I/O,它首先强调可移植性,然后才是吞吐量。使用 OS API 的响应能力会好得多。 -
@Ben Voigt 这仍然是“如何分析”的第一步。
标签: c++ vb.net performance serial-port boost-asio