使用C

时间:2019-01-10 05:07:46

标签: c serial-port avr

我一直在努力构建一个在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");
}

0 个答案:

没有答案