0

jUART ( https://github.com/billhsu/jUART ) で sendmulti 関数 (char 配列の一部をシリアル ポートに送信するループ) のトラブルシューティングを試みています。

その特定の関数は、リポジトリに既に組み込まれている .dll に登録されていません。何も変更せずにダウンロードして再構築し、新しい.dllをregsvr32に登録し、古い.dllを新しく再構築したものに置き換えました。

これで関数が登録され、呼び出すことができますが、提供した入力によってはいくつかのエラーが発生します。

最初のエラー:

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

そこで、2 番目の引数を追加したところ、次のようになりました。

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 の明らかに関連する関数:

SerialAPI.h

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() 関数 (1 バイトだけを送信する) が最初の .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(); 
} 

ありがとう!

*作業コード*

SerialAPI.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);

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)); 
}

それが機能します。私が持っているものを最適化するための推奨事項はありますか?

ありがとう!

4

1 に答える 1