// Низкоуровневые процедуры работы с последовательным портом и HDLC #include #include #include #include #include "printf.h" #include "hdlcio.h" #include "util.h" unsigned int nand_cmd=0x1b400000; unsigned int spp=0; unsigned int pagesize=0; unsigned int sectorsize=512; unsigned int maxblock=0; // Общее число блоков флешки char flash_mfr[30]={0}; char flash_descr[30]={0}; unsigned int oobsize=0; static char pdev[500]; // имя последовательного порта int siofd; // fd для работы с Последовательным портом static HANDLE hSerial; static int read(int siofd, void* buf, unsigned int len) { DWORD bytes_read = 0; ReadFile(hSerial, buf, len, &bytes_read, NULL); return bytes_read; } static int write(int siofd, void* buf, unsigned int len) { DWORD bytes_written = 0; WriteFile(hSerial, buf, len, &bytes_written, NULL); return bytes_written; } //************************************************* //* отсылка буфера в модем //************************************************* unsigned int send_unframed_buf(char* outcmdbuf, unsigned int outlen) { PurgeComm(hSerial, PURGE_RXCLEAR); write(siofd,"\x7e",1); // отсылаем префикс if (write(siofd,outcmdbuf,outlen) == 0) { printf("\n Ошибка записи команды");return 0; } FlushFileBuffers(hSerial); return 1; } //****************************************************************************************** //* Прием буфера с ответом из модема //* //* masslen - число байтов, принимаемых единым блоком без анализа признака конца 7F //****************************************************************************************** unsigned int receive_reply(char* iobuf, int masslen) { int i,iolen,escflag,bcnt,incount; unsigned char c; unsigned int res; unsigned char replybuf[14000]; incount=0; if (read(siofd,&c,1) != 1) { // printf("\n Нет ответа от модема"); return 0; // модем не ответил или ответил неправильно } //if (c != 0x7e) { // printf("\n Первый байт ответа - не 7e: %02x",c); // return 0; // модем не ответил или ответил неправильно //} replybuf[incount++]=c; // чтение массива данных единым блоком при обработке команды 03 if (masslen != 0) { res=read(siofd,replybuf+1,masslen-1); if (res != (masslen-1)) { printf("\nСлишком короткий ответ от модема: %i байт, ожидалось %i байт\n",res+1,masslen); dump(replybuf,res+1,0); return 0; } incount+=masslen-1; // у нас в буфере уже есть masslen байт // printf("\n ------ it mass --------"); // dump(replybuf,incount,0); } // принимаем оставшийся хвост буфера while (read(siofd,&c,1) == 1) { replybuf[incount++]=c; // printf("\n-- %02x",c); if (c == 0x7e) break; } // Преобразование принятого буфера для удаления ESC-знаков escflag=0; iolen=0; for (i=0;i