Поэтому я пытаюсь отправить изображение jpeg (4Kb) с raspberry pi на мой Mac по беспроводной сети с помощью Xbee Series 1. У меня есть изображение на raspberry pi и я могу прочитать его в двоичном формате. Я использовал этот двоичный формат, чтобы сохранить его в другом файле изображения, и он правильно создает копию изображения. Это говорит мне, что я читаю это правильно. Поэтому я пытаюсь отправить эти данные через последовательный порт (для передачи через xbee) на мой Mac. Примечание: Xbee может передавать только 80 байтов данных на пакет или что-то в этом роде. Я не знаю, как это влияет на то, что я делаю, хотя.
Моя проблема в том, что я не знаю, как прочитать данные и правильно сохранить их в сам файл JPEG. Большинство функций Read (), которые я обнаружил, требуют, чтобы вы вводили длину для чтения, и я не знаю, как определить, сколько времени прошло с тех пор, как поступает только последовательный поток.
Вот мой код для отправки в формате JPEG.
#include "xSerial.hpp"#include <iostream>
#include <cstdlib>
using namespace std;
int copy_file( const char* srcfilename, const char* dstfilename );int main(){
copy_file("tylerUseThisImage.jpeg", "copyImage.jpeg");
return 0;
}
int copy_file( const char* srcfilename, const char* dstfilename )
{
long len;
char* buf = NULL;
FILE* fp = NULL;
// Open the source file
fp = fopen( srcfilename, "rb" );
if (!fp) return 0;
// Get its length (in bytes)
if (fseek( fp, 0, SEEK_END ) != 0) // This should typically succeed
{ // (beware the 2Gb limitation, though)
fclose( fp );
return 0;
}
len = ftell( fp );
std::cout << len;
rewind( fp );
// Get a buffer big enough to hold it entirely
buf = (char*)malloc( len );
if (!buf)
{
fclose( fp );
return 0;
}
// Read the entire file into the buffer
if (!fread( buf, len, 1, fp ))
{
free( buf );
fclose( fp );
return 0;
}
fclose( fp );
// Open the destination file
fp = fopen( dstfilename, "wb" );
if (!fp)
{
free( buf );
return 0;
}
// this is where I send data in but over serial port.
//serialWrite() is just the standard write() being used
int fd;
fd = xserialOpen("/dev/ttyUSB0", 9600);
serialWrite(fd, buf, len);
//This is where the file gets copied to another file as a test
// Write the entire buffer to file
if (!fwrite( buf, len, 1, fp ))
{
free( buf );
fclose( fp );
return 0;
}
// All done -- return success
fclose( fp );
free( buf );
return 1;
}
На приемной стороне я знаю, что мне нужно открыть последовательный порт для чтения и использовать какое-то чтение (), но я не знаю, как это сделать. Используя последовательную библиотеку, она имеет некоторые функции для проверки наличия последовательных данных и возврата количества символов, доступных для чтения.
Один вопрос о количестве символов, доступных для чтения, будет ли это число расти по мере приближения последовательного потока, или он сразу сообщит всю длину данных, которые нужно прочитать?
Но, наконец, я знаю, что после открытия последовательного порта мне нужно прочитать данные в буфер, а затем записать этот буфер в файл, но мне не повезло. Это то, что я пробовал до сих пор.
// Loop, getting and printing characters
char temp;
bool readComplete = false;
int bytesRead = 0;
fp = fopen("copyImage11.jpeg", "rwb");
for (;;)
{
if(xserialDataAvail(fd) > 0)
{
bytesRead = serialRead(fd, buf, len);
readComplete = true;
}
if (readComplete)
{
if (!fwrite(buf, bytesRead, 1, fp))
{
free(buf);
fclose(fp);
return 0;
}
fclose(fp);
free(buf);
return 1;
}
}
Я не получаю ошибки с моим кодом, он просто не создает файл JPEG правильно. Возможно, я не передаю это правильно, или, возможно, я не читаю / пишу в файл правильно. Любая помощь будет оценена. Спасибо всем, что вы рок!
Если вы определяете свой собственный протокол, то сначала вам нужно иметь метод для отправки длины.
Я бы порекомендовал протестировать ваш код, отправив короткие блоки текста ascii для подтверждения ввода / вывода. Как только это сработает, вы можете использовать ascii для настройки передачи; то есть отправьте длину, и ваш приемник будет готов к ожидаемому блоку.
Других решений пока нет …