2016-05-08 5 views
1

Я пытаюсь написать изображение через UART на Beaglebone Black. Но когда я использую функцию write() в библиотеке.с использованием функции write() в C/C++ для Linux для записи 70kB через UART Beaglebone Black

int write(int handle, void *buffer, int nbyte); 

Независимо от agurment nbyte имеет int тип, я не могу передать 70kb сразу. Я показал количество байт, которое перетекает, и в результате число байт = 4111.

length = write(fd,body.c_str(),strlen(body.c_str())); // 
cout<<length<<endl; // result length = 4111; 
cout<<strlen(body.c_str())<<endl; // result strlen(body.c_str()) = 72255; 

Я надеюсь услышать от вас!

+0

Вы пытались записать оставшиеся данные до тех пор, пока все не будет передано? – nwp

+0

Если 'body' является объектом' std :: string', почему бы не использовать 'body.length()' (или 'body.size()') вместо этих вызовов 'strlen'? –

+0

Что касается вашей проблемы, считаете ли вы, что писать в цикле? –

ответ

2

Звонок write не гарантирует, что вы можете записать количество предоставленных данных, поэтому оно является целым числом в качестве возвращаемого значения, а не булевым. Поведение, которое вы видите, на самом деле распространено среди разных операционных систем, возможно, из-за того, что устройство подчеркивания не имеет достаточного количества буфера или хранилища для записи 70 кб. Вам нужно написать в цикле, каждая запись будет записывать оставшуюся сумму:

int total = body.length(); // or strlen(body.c_str()) 
char *buffer = body.c_str(); 
int written = 0; 
int ret; 
while (written < total) { 
    ret = write(fd, buffer + written, total - written); 
    if (ret < 0) { 
     // error 
     break; 
    } 
    written += ret; 
} 
+0

Спасибо за убедительное объяснение! Это очень полезно для меня. Я думаю, что нашел решение этой проблемы :) –

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

  • Нет связанных вопросов^_^