2013-09-28 4 views
0

jur (https://github.com/billhsu/jUART)의 sendmulti 함수 (char 배열의 일부를 직렬 포트로 보내는 루프) 문제를 해결하려고합니다.jUART/FireBreath Plugin 오류

특정 기능이 이미 저장소에 빌드 된 .dll에 등록되지 않았습니다. &을 아무 것도 변경하지 않고 다시 작성하고 regsvr32로 새 .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" 

하지 않음 (전혀없는 경험 dev에) 거기에서 갈 곳 정말 있는지, 그래서 나는 다음으로 들여다보아야 만하는지, 누군가가 나와 함께 jUART에 들어가서 그 문제를 발견 할 수 있는지를 지역 사회에 알리고 있습니다.

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

, 그것은 비록 : 나는 찾을 수 sendmulti에 대한

명백하게 관련 기능 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)); 
} 

. 내가 가지고있는 것을 최적화하기위한 권장 사항은 무엇입니까?

감사합니다.

답변

0

이미 정확히 무엇이 일어나고 있는지 알려줍니다. 첫 번째 매개 변수로 FB :: JSObjectPtr & 유형을 넣었지만 그 매개 변수에 문자열을 전달합니다. 그것은 문자열을 자바 스크립트 객체로 변환 할 수 없으므로 실패합니다.

나는 왜 sendMulti가 그 일을하고 있는지 이해할 수 없다. 문자 배열 인 ['l','i','k','e',' ','t','h','i','s']의 문자열이 필요합니다. 왜 그걸 할거야? 나에게 이상한 것 같다.

대신 sendMulti의 첫 번째 매개 변수를 const std :: string &으로 변경하고 전달 된대로 문자열을 사용하는 것이 어떻습니까?이 전화를 가지고 있기 때문에이 정말 비효율적 있습니다 ...

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

: 나는 이런 식으로 호출하여 당신은 아마 현재 방식으로 작동 할 수 있다고한다 완성도 가정

자바 스크립트로 돌아가서 하나의 덩어리로 모든 문자열을 가져 오는 대신 각 문자를 가져와야합니다.

+0

답장을 보내 주셔서 감사합니다. 그건 틀림없이 말이야. 이 중 어느 것도 내 코드가 아니며 C++ (또는 그 문제에 대한 대부분의 코딩)에 대한 나의 경험은 제한적입니다. 즉, 그것을 구현하려고 시도하고 그것이 어떻게되는지 보게 될 것입니다. 문자열 사용과 문자 배열 비교에 동의했습니다. 나는 시리얼 포트에 아무런 문제도 없다고 생각한다. send()가 포함 된 .dll에서 작동했지만 새로 빌드 된 것은 아닙니다. 다시 작성했을 때 물건을 변경하지 않았는데도 그 이유는 무엇입니까? 그것은 sendmulti()와 같은 오류를 주며, 변경 사항은 나에게 이해가되지 않습니다. 감사합니다. – codefame

+0

'send_msg.push_back' 함수가 char을 기대하는 것처럼 보입니다. 왜 저자가 그와 함께 갔는지 설명합니다. 나는 당신의 제안을 사용하여 작동하도록했습니다. 위에있는 최종 코드로 편집합니다. – codefame