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));
}
. 내가 가지고있는 것을 최적화하기위한 권장 사항은 무엇입니까?
감사합니다.
답장을 보내 주셔서 감사합니다. 그건 틀림없이 말이야. 이 중 어느 것도 내 코드가 아니며 C++ (또는 그 문제에 대한 대부분의 코딩)에 대한 나의 경험은 제한적입니다. 즉, 그것을 구현하려고 시도하고 그것이 어떻게되는지 보게 될 것입니다. 문자열 사용과 문자 배열 비교에 동의했습니다. 나는 시리얼 포트에 아무런 문제도 없다고 생각한다. send()가 포함 된 .dll에서 작동했지만 새로 빌드 된 것은 아닙니다. 다시 작성했을 때 물건을 변경하지 않았는데도 그 이유는 무엇입니까? 그것은 sendmulti()와 같은 오류를 주며, 변경 사항은 나에게 이해가되지 않습니다. 감사합니다. – codefame
'send_msg.push_back' 함수가 char을 기대하는 것처럼 보입니다. 왜 저자가 그와 함께 갔는지 설명합니다. 나는 당신의 제안을 사용하여 작동하도록했습니다. 위에있는 최종 코드로 편집합니다. – codefame