0

シリアル通信を使用してデバイスにデータを送信しようとしています:

void VcpBridge::write_speed(char address, int spd) {
    uint8_t speed = (uint8_t)(127);
    ROS_ERROR("VCP BRIDGE: Sending %u to %u", speed, address);
    char msg[8];
    char command = 0x55, size = 0x02, csum;
    csum = speed + 0x64 + address;
    sprintf(msg, "%c%c%c%c%c%c", command, address, speed, size, 0x64, csum);
    ROS_ERROR(msg);
    write(fd_, msg, 6);
}

ROS_ERRORここでは と同じprintfです。

speedの値が127 を超える場合を除いて、すべて正常に動作します。その場合、常に?その位置に a が出力され、デバイスは正しい情報を受信しません。正しくキャストする方法を知っていますか?試してみまし%uたが、プログラムがクラッシュします。

4

2 に答える 2

2

sprintfあなたの例で使用する正当な理由はありません。これを試して:

void VcpBridge::write_speed(char address, int spd) {
    uint8_t speed = (uint8_t)(127);
    ROS_ERROR("VCP BRIDGE: Sending %u to %u", speed, address);
    char command = 0x55, size = 0x02, csum;
    csum = speed + 0x64 + address;
    ROS_ERROR(msg);
    char msg[] = { command, address, speed, size, 0x64, csum};
    write(fd_, msg, sizeof msg);
}
于 2012-07-03T19:45:15.863 に答える
0

あなたの答えのおかげで、私は問題を解決するために熱く理解することができました. sprintf を使用せず、unsigned int を使用するのが正解でした。最終的なコードは次のとおりです。

void VcpBridge::write_speed(char address,int spd){
  uint8_t speed = (uint8_t)(200);
  unsigned char command = 0x55, size=0x02, csum;
  csum=speed+0x64+address;
  unsigned char msg[8]= { command, address, speed, size, 0x64, csum };
  write( fd_, msg, 6);
}
于 2012-07-03T20:01:06.027 に答える