You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
3.0 KiB
121 lines
3.0 KiB
2 years ago
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <fcntl.h>
|
||
|
#include <termios.h>
|
||
|
#include <unistd.h>
|
||
|
#include <string.h>
|
||
|
|
||
|
int main()
|
||
|
{
|
||
|
int fd;
|
||
|
unsigned char buffer[100000];
|
||
|
unsigned char tempBuff[1];
|
||
|
// Open the UART device
|
||
|
fd = open("/dev/ttyACM0", O_RDWR | O_NOCTTY | O_NDELAY);
|
||
|
if (fd == -1)
|
||
|
{
|
||
|
perror("Error opening UART device");
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
// Configure the UART settings
|
||
|
struct termios options;
|
||
|
tcgetattr(fd, &options);
|
||
|
cfsetispeed(&options, B115200);
|
||
|
cfsetospeed(&options, B115200);
|
||
|
options.c_cflag &= ~PARENB;
|
||
|
options.c_cflag &= ~CSTOPB;
|
||
|
options.c_cflag &= ~CSIZE;
|
||
|
options.c_cflag |= CS8;
|
||
|
tcsetattr(fd, TCSANOW, &options);
|
||
|
|
||
|
// Read a single byte from the UART device
|
||
|
|
||
|
int fileCount = 1;
|
||
|
|
||
|
while (1)
|
||
|
{
|
||
|
|
||
|
if (read(fd, tempBuff, 1) != 1)
|
||
|
{
|
||
|
continue;
|
||
|
}
|
||
|
if (tempBuff[0] != (unsigned char)255)
|
||
|
{
|
||
|
continue;
|
||
|
}
|
||
|
if (read(fd, tempBuff, 1) != 1)
|
||
|
{
|
||
|
continue;
|
||
|
}
|
||
|
if (tempBuff[0] != (unsigned char)216)
|
||
|
{
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
unsigned int currentIndex = 2;
|
||
|
buffer[0] = 255;
|
||
|
buffer[1] = 216;
|
||
|
while (1)
|
||
|
{
|
||
|
|
||
|
if (read(fd, tempBuff, 1) != 1)
|
||
|
{
|
||
|
continue;
|
||
|
}
|
||
|
buffer[currentIndex++] = tempBuff[0];
|
||
|
if (tempBuff[0] != 0xFF)
|
||
|
{
|
||
|
continue;
|
||
|
}
|
||
|
if (read(fd, tempBuff, 1) != 1)
|
||
|
{
|
||
|
continue;
|
||
|
}
|
||
|
buffer[currentIndex++] = tempBuff[0];
|
||
|
if (tempBuff[0] == 0xD8)
|
||
|
{
|
||
|
printf("Corrupted File, start over...\n");
|
||
|
memset(buffer, 0x00, sizeof(buffer));
|
||
|
currentIndex = 2;
|
||
|
buffer[0] = 0xFF;
|
||
|
buffer[1] = 0xD8;
|
||
|
continue;
|
||
|
}
|
||
|
if (tempBuff[0] == 0xD9)
|
||
|
{
|
||
|
// END FOUND
|
||
|
char fileName[11] = {'0', '0', '0', '0', '0', '.', 'j', 'p', 'e', 'g', '\0'};
|
||
|
char secondDigit = (fileCount % 10) + '0';
|
||
|
char firstDigit = (fileCount / 10) + '0';
|
||
|
fileName[0] = firstDigit;
|
||
|
fileName[1] = secondDigit;
|
||
|
|
||
|
FILE *fp = fopen(fileName, "wb");
|
||
|
if (fp == NULL)
|
||
|
{
|
||
|
printf("Error opening file!\n");
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
for (unsigned int i = 0; i < currentIndex; i++)
|
||
|
{
|
||
|
unsigned char myChar = buffer[i];
|
||
|
fwrite(&myChar, sizeof(unsigned char), 1, fp);
|
||
|
}
|
||
|
|
||
|
// Close the file
|
||
|
fclose(fp);
|
||
|
printf("File %s saved!\n", fileName);
|
||
|
memset(buffer, 0x00, sizeof(buffer));
|
||
|
fileCount++;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Close the UART device
|
||
|
close(fd);
|
||
|
|
||
|
return 0;
|
||
|
}
|