2013-12-07 4 views
0

Я прочитал много вопросов и ответов, но не нашел решения. Может быть, мой вопрос не прав, но мне нужно какое-то руководство. Я использую последовательный порт в Linux, который считывает данные с моего устройства Arduino. Всякий раз, когда я хочу отправлять данные из Arduino в Linux, я сначала отправляю два байта, которые указывают на общее количество байтов, которое будет поступать от Arduino. Я конвертирую эти два байта в целочисленное значение и начинаю считывать данные из последовательного порта. Скажем, я хочу, чтобы отправить 300 байт из Ardiuno в Linux, я буду просто писать {1, 44}, а затем преобразовать этот 1 и 44 байт в междунар по следующей формуле:Чтение символа NULL из последовательного порта Linux C

char data[] = {1, 44}; 
int to_read = data[0] 
to_read = to_read << 8; 
to_read = to_read | data[1]; 
return to_read; 

это даст мне 300 int value, это работает как шарм. но проблема возникает, когда мне приходится читать данные менее 255. Скажем, я хочу прочитать 100 байт, тогда первые два байта будут {0, 100}. 0 - нулевой символ, последовательный порт не обрабатывает его (я вручную написал 0s для последовательного порта, он всегда дает мне 0 байтов), и моя вся последовательность идет не так. Поэтому мой вопрос: могу ли я читать нулевые символы из последовательного порта, или кто-то, пожалуйста, дайте мне лучшее решение.

спасибо заранее.

+2

Причина № 18, почему я ненавижу, когда люди говорят, что «нуль», когда речь идет о символах. «Нуль» в основном означает «нет значения» - то есть: он выходит за пределы допустимых значений, а «нулевой символ» - это символ с кодом 0. IE: допустимое, если несколько нечетное значение. Вместо этого используйте NUL; это то, что находится в таблицах ASCII. : P – cHao

+1

Точка, символ 0 по-прежнему является нормальным символом. Это просто имеет особое значение * для C, когда вы работаете с nul-terminated byte string *. С другой стороны, последовательный порт все равно. – cHao

+0

Вы можете показать нам код, как настроить последовательные устройства с обеих сторон, и как вы затем отправляете и получаете данные через эти устройства. – alk

ответ

1

У меня проблема решена. При работе с байтами в C не путайте байты (char) со строкой, как я обрабатывал массив байтов (char data []) и когда я пытался записать эти байты на последовательный порт с помощью метода write с длиной strlen (данные), Я получал только те байты, которые не были нулевыми. strlen возвращает длину данных после просмотра первого нулевого символа, который равен \0, из-за этого я не получал желаемого результата. То, что я сделал то, что, если я хочу, чтобы записать данные char data[] = {0, 4} тогда я буду делать что-то вроде этого:

char data[] = {0, 4}; 
write(serial_port_fd, data, 2); 

сказал функцию write написать 2 байта. Это запишет 0 и 4, если я пишу что-то вроде этого:

char data[] = {0, 4} 
write(serial_port_fd, data, strlen(data)); 

это будет писать NOTHING.

Еще одна вещь. Если вы хотите написать непечатаемые символы (от байт от 0 до 32) в последовательном порту, убедитесь, что вы настроили свой последовательный порт для ввода и вывода. Посмотрите на этом руководстве:

http://www.cmrr.umn.edu/~strupp/serial.html#config

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