我一直在努力构建一个在ATmega1284上运行的AVR驱动的EEPROM编程器。我一直在尝试用C语言编写一个简单的程序,该程序将hex文件的字节发送到AVR,以便可以将它们编程到EEPROM中。但是,尽管我的程序确实通过直接USB连接发送字节,但是我并没有希望通过CP2102设备发送字节,所以我无法将数据发送给编程器。
但是,由于某些原因,Arduino IDE的串行监视器似乎可以在CP2102上发送数据。程序员可以很好地接收数据。显然,尽管这不是解决方案,但由于串行监视器无法发送海量数据,因此需要此程序。有谁知道我应该如何与此CP2102设备接口?我尝试使用普通的USB代码,并查看了Torvalds的GitHub上的Linux CP2102驱动程序,但无法推断出任何有用的信息。我当前的程序使用接受的答案here中的代码,该代码在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");
}