Я работал над созданием программатора EEPROM с питанием от AVR, работающего на ATmega1284. Я пытался написать довольно простую программу на C, которая будет отправлять байты шестнадцатеричного файла через AVR, чтобы они могли быть запрограммированы в EEPROM. Однако, хотя моя программа отправляет байты по прямому USB-соединению на мой Arduino, похоже, она не хочет отправлять байты через устройство CP2102, и поэтому я не могу отправить данные своему программисту.
Однако по какой-то причине последовательный монитор Arduino IDE работает нормально, отправляя данные через CP2102. Программист получает данные просто отлично. Очевидно, что это не может быть решением, так как последовательный монитор не имеет возможности посылать массовые данные, отсюда и необходимость в этой программе. Кто-нибудь знает, как я должен взаимодействовать с этим устройством CP2102? Я попытался использовать обычный USB-код и посмотрел драйвер Linux CP2102 на GitHub Торвальдса, но не смог экстраполировать ничего полезного. Моя текущая программа использует код из принятого ответа здесь , работающий на Linux Mint 18, скомпилированный с gcc. Моя реализация этого выглядит следующим образом:
void main(int argc, char *argv[]) { //file, port
portname = argv[2];
printf("Programming EEPROM...\n");
char* fileBytes = readFileBytes(argv[1]);
int fd = open(argv[2], O_RDWR);
if (fd < 0)
{
printf("error %d opening %s: %s", errno, portname, strerror (errno));
return;
}
set_interface_attribs (fd, B57600, 0);
set_blocking (fd, 0);
for(int i = 0; i < len; i++){
char byte = fileBytes[i];
printf("%02x\n", byte);//TODO remove
write(fd, byte, 1);
char buf[1];
buf[0] = (int)NULL;
while(buf[0] == NULL){
read(fd, buf, 1);
}
char b = buf[0];
if(b == 0x0f){
printf("ERROR REPORTED BY PROGRAMMER, EXITING\n");
exit(1);
}else if(b == 0x0e){
printf("Byte good, continuing...\n");//TODO remove
}else{
printf("Unknown byte received: %02x\n", b);
exit(1);
}
}
printf("Transmission finished.\n");
usleep(20000); //wait 20ms (or maybe a tiny bit more)
write(fd, 0x0d, 1);
usleep(500); //wait for slow ass avr
char buf[1];
buf[0] = (int)NULL;
read(fd, buf, 1);
if(buf[0] == 0x0d){
printf("Programmer acknowledge. All good!\n");
}
printf("EEPROM programming successful. Exiting...\n");
}