0

我试图从 JavaScript->Firebreath->Serial 端口项目中尽可能地挤出最佳性能。本质上,我的 JavaScript 代码非常快速地将字符串传递给 Firebreath 插件(每个命令之间 40-100 毫秒),然后将这些字符串转发到串行端口。

虽然一切正常,但偶尔会丢失字符串或串行端口冻结并且必须重置。我已经验证它不是我正在使用的硬件设备,并且怀疑问题可能存在于这些功能中。有什么建议可以优化从 JavaScript 接收字符串(例如:“Sc48E”)、将其解析为 char(不幸的是这是必需的)并将其发送到串行端口的速度吗?

感谢您的输入!

使用 jUART:https ://github.com/billhsu/jUART

C++ 代码:

串行API.h

void sendmulti(const std::string& msg)
{
    io.post(boost::bind(&SerialAPI::do_multi_send, this, msg));
}

void do_multi_send(const std::string& msg);

串行API.cpp

void SerialAPI::do_multi_send(const std::string& msg) 
{
    bool write_in_progress = !send_msg.empty(); // is there anything currently being written?   
    char cMsg[5];  // max length of incoming packets

    for(int i = 0; i < sLength; i++) {
        cMsg[i] = msg[i];
        send_msg.push_back(cMsg[i]); // store in write buffer; this function requires a char
    }
    if (!write_in_progress) // if nothing is currently being written, then start 
        send_multi_start(); 
}

void SerialAPI::send_multi_start(void) 
{
    boost::asio::async_write(serial, 
    boost::asio::buffer(&send_msg.front(), 5), 
    boost::bind(&SerialAPI::send_multi_complete, 
    this, 
    boost::asio::placeholders::error)); 
}

记录信息

我在 SerialAPI.h 中添加了日志记录:

void sendmulti(const std::string& msg)
{
    io.post(boost::bind(&SerialAPI::do_multi_send, this, msg));
    FBLOG_TRACE("sendmulti()", "SerialAPI.h--sendmulti() works");
}

...在 SerialAPI.cpp 中:

void SerialAPI::do_multi_send(const std::string& msg) 
{
    bool write_in_progress = !send_msg.empty(); // is there anything currently being written? 
    const char *cMsg = msg.c_str();

    // logging
    FBLOG_TRACE("do_multi_send()", "debug cMsg: " << cMsg);

    for(int i = 0; i < 5; i++) {
        send_msg.push_back(cMsg[i]); // store in write buffer 
    }

    if (!write_in_progress) // if nothing is currently being written, then start 
    send_multi_start();
}

这是我得到的最小输出:

31 [2756] INFO FireBreath <> - ..\..\..\..\src\PluginAuto\Win\np_winmain.cpp:29 - NP_Initialize - Initialization done
34 [2756] INFO FireBreath <> - ..\..\src\NpapiCore\NpapiPluginModule_NPP.cpp:150 - FB::Npapi::NpapiPluginModule::NPP_New - NPP_New: 02F60E30
37 [2756] INFO FireBreath <> - ..\..\src\PluginCore\PluginCore.cpp:40 - FB::PluginCore::setPlatform - os: 00D2E8B0; browser: NPAPI
85 [2756] INFO FireBreath <> - ..\..\src\NpapiCore\NpapiPluginModule_NPP.cpp:208 - FB::Npapi::NpapiPluginModule::NPP_Destroy - NPP_Destroy: 02F60E30
15338 [2756] INFO FireBreath <> - ..\..\src\NpapiCore\NpapiPluginModule_NPP.cpp:150 - FB::Npapi::NpapiPluginModule::NPP_New - NPP_New: 02F60EB0
15340 [2756] INFO FireBreath <> - ..\..\src\PluginCore\PluginCore.cpp:40 - FB::PluginCore::setPlatform - os: 00D2E8B0; browser: NPAPI

好像我已经把所有东西都设置好了?

另一方面,我无法终生调试该应用程序。我已经按照我可以找到的所有步骤在 Windows 上调试 Chrome,选择了正确的进程,设置了断点,它们实际上在 VS2010 中处于活动状态,但是当我运行应用程序或发送函数时,它们没有命中。

谢谢!

4

2 回答 2

0

首先,没有理由将 std::string 复制到 char*,只需使用已经存在的 .c_str() 即可。

void SerialAPI::do_multi_send(const std::string& msg) 
{
    bool write_in_progress = !send_msg.empty(); // is there anything currently being written?   
    char *cMsg = msg.c_str();

    for(int i = 0; i < sLength; i++) {
        send_msg.push_back(cMsg[i]); // store in write buffer; this function requires a char
    }
    if (!write_in_progress) // if nothing is currently being written, then start 
        send_multi_start(); 
}

void SerialAPI::send_multi_start(void) 
{
    boost::asio::async_write(serial, 
    boost::asio::buffer(&send_msg.front(), 5), 
    boost::bind(&SerialAPI::send_multi_complete, 
    this, 
    boost::asio::placeholders::error)); 
}

除此之外,我不知道该建议什么;但是,我认为这不是问题所在。每 40 毫秒并不是很频繁;在那段时间里,你应该能够做到这一点。我会添加一些日志记录(请参阅firebreath 网站上的日志记录页面),看看您是否可以跟踪事情发生的顺序以及实际运行的内容。这将使您对正在发生的事情有更多的了解。

于 2013-09-29T06:32:20.847 回答
0

这是经典的生产者-消费者设计模式,广泛用于这些插件。

http://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem

于 2013-09-30T10:21:28.720 回答