2012-07-03 2 views
0

Я пытаюсь отправить некоторые данные к устройству с помощью последовательной коммуникации:Как поместить uint8_t в массив символов?

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. Затем оно всегда печатает ? в его положении, и устройство не получает правильную информацию. Знаете ли вы, как правильно это сделать? Я пробовал %u, но потом программа вылетает.

+0

Вы пытаетесь напечатать 'speed' как' char'? Что вы ожидаете получить, когда он равен, скажем, '200'? –

+0

Предполагаю, что вы воспользовались некоторым кодом для примера, но в случае, если вы этого не сделали, вы понимаете, что никогда не добавляете какие-либо значения в 'msg', прежде чем будете писать()' it, не так ли? ? Кроме того, возможно, вы должны заменить все 'char' 'unsigned char's (или' uint8_t', который обычно является просто псевдонимом для того же ...). – twalberg

+1

@twalberg Он сделал, с 'sprintf (msg, ...);' –

ответ

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

+1, но обратите внимание на все перемешивание типов, все еще продолжающихся (char, uint8_t, и - implicitly - int и unsigned int). Непоследовательные интегральные акции, вероятно, были причиной проблемы в исходном коде. Чтобы избежать будущих проблем (например, что происходит, если значение csum усечено), я бы написал код, используя один тип, возможно, uint8_t, устранить как можно больше преобразований и сделать необходимые явные (с помощью cast). –

0

Благодаря вашему ответу я могу разобраться с проблемой, чтобы устранить проблему. Не использовать sprintf и использовать unsigned int был kay. Существует окончательный код:

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

Это не важно, но вы можете дать вашему массиву измерение '6'. Вы даете ему восемь байтов, но используете только шесть из них. –

+0

Это правда, я сделал это, прежде чем узнать размер сообщения. –

Смежные вопросы