繁体   English   中英

jUART / FireBreath插件错误

[英]jUART/FireBreath Plugin Errors

我正在尝试对jUART( https://github.com/billhsu/jUART )中的sendmulti函数(通过将char数组的一部分发送到串行端口进行循环)进行故障排除。

该特定功能未向存储库中已内置的.dll注册。 我下载并重建了文件,没有进行任何更改,用regsvr32注册了新的.dll,并用新重建的.dll替换了旧的.dll。

现在,该函数已注册并可以调用,但是根据我提供的输入,我遇到了一些错误。

第一个错误:

ser.sendmulti("Sc48E");
 Error in event handler: Error: Error calling method on NPObject.
ser.getLastException();
 "Error: Argument 2is not optional."

所以我添加了第二个参数,现在我得到:

ser.sendmulti("Sc48E", 2);
 Error: Error calling method on NPObject.
ser.getLastException();
 "Invalid argument conversion from class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > to class boost::shared_ptr<class FB::JSAPI> at index 1"

不太确定从那里去哪里(根本不是一个经验丰富的开发人员),所以我要转向社区,看看下一步应该做什么,或者是否有人可以和我一起深入jUART以找到解决方法。

我可以找到与sendmulti显然相关的功能:

串口API

void sendmulti(const FB::JSObjectPtr& msg, int length)
    {
        unsigned char *message = new unsigned char[length];
        FB::variant v;
        for(int i = 0; i < length; i++)
        {
            v = msg->GetProperty(i);
            message[i] = v.convert_cast<unsigned char>();
        }

        io.post(boost::bind(&SerialAPI::do_multi_send, this, (char *)message, length));

void do_multi_send(const char msg[], int length);
void send_multi_start(int length);

SerialAPI.cpp

void SerialAPI::do_multi_send(const char msg[], const int length) 
{
    bool write_in_progress = !send_msg.empty(); // is there anything currently being written? 
    for(int i = 0; i < length; i++)
    {
        send_msg.push_back(msg[i]); // store in write buffer 
    }

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

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

我认为这些是直接相关的函数,尽管值得注意的是send()函数(仅发送一个字节)可以与第一个.dll正常工作,而对于新建的.dll则给出相同的错误:

void SerialAPI::do_send(const char msg) 
{
    bool write_in_progress = !send_msg.empty(); // is there anything currently being written? 
    send_msg.push_back(msg); // store in write buffer 
    if (!write_in_progress) // if nothing is currently being written, then start 
        send_start(); 
} 

谢谢!

* 工作代码 *

串口API

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

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

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 int sLength = msg.length();

    for(int i = 0; i < sLength; i++) {
        const char cMsg = msg[i];
        send_msg.push_back(cMsg); // store in write buffer 

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

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

那是行得通的。 有什么优化我的建议吗?

谢谢!

它已经在告诉您确切的情况了。 您将FB :: JSObjectPtr&类型作为第一个参数,但是随后为该参数传递了一个字符串。 它无法将字符串转换为javascript对象,因此失败。

我真的不明白为什么sendMulti可能会做它正在做的事情。 它期望以字符数组['l','i','k','e',' ','t','h','i','s']的字符串。 为什么要这么做? 对我来说似乎有点奇怪。

相反,为什么不只将sendMulti的第一个参数更改为const std :: string&并使用传入的字符串呢?

我想为完整起见,我应该说,您可以这样调用它,使其以当前方式运行:

var strArray = "Sc48E".split('');
ser.sendmulti(strArray, strArray.length);

...请注意,这确实效率不高,因为它必须回调javascript以获取每个字符,而不是仅将字符串全部打包为一个字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM