Добавлен упрощенный ввод имени порта, как в qtools - -p1 вместо -p/dev/ttyUSB1

master
forth32 8 years ago
parent d9960d1a59
commit ba6fd2bee0

@ -69,36 +69,6 @@ if (pcodes[j].code != 0) strcpy(pname,pcodes[j].name); // имя найдено
else sprintf(pname,"U%08x",id); // имя не найдено - подставляем псевдоимя Uxxxxxxxx в тупоконечном формате
}
//****************************************************
//* Отсылка модему АТ-команды
//*
//* cmd - буфер с командой
//* rbuf - буфер для записи ответа
//*
//* Возвращает длину ответа
//****************************************************
int atcmd(char* cmd, char* rbuf) {
int res;
char cbuf[128];
strcpy(cbuf,"AT");
strcat(cbuf,cmd);
strcat(cbuf,"\r");
port_timeout(100);
// Вычищаем буфер приемника и передатчика
tcflush(siofd,TCIOFLUSH);
// отправка команды
write(siofd,cbuf,strlen(cbuf));
usleep(100000);
// чтение результата
res=read(siofd,rbuf,200);
return res;
}
//****************************************************
//* Определение версии прошивальщика
//*

@ -1,3 +1,5 @@
// Низкоуровневые процедуры работы с последовательным портом и HDLC
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@ -19,6 +21,7 @@ char flash_mfr[30]={0};
char flash_descr[30]={0};
unsigned int oobsize=0;
static char pdev[500]; // имя последовательного порта
struct termios sioparm;
int siofd; // fd для работы с Последовательным портом
@ -233,14 +236,29 @@ if (!send_unframed_buf(outcmdbuf,iolen)) return 0; // ошибка переда
return receive_reply(iobuf,0);
}
//***************************************************
// Открытие и настройка последовательного порта
//***************************************************
int open_port(char* devname) {
//*************************************
// Настройка Последовательного порта
//*************************************
int i,dflag=1;
char devstr[200]={0};
int open_port(char* devname)
{
siofd = open(devname, O_RDWR | O_NOCTTY |O_SYNC);
strcpy(pdev,devname); // сохраняем имя порта
// Вместо полного имени устройства разрешается передавать только номер ttyUSB-порта
// Проверяем имя устройства на наличие нецифровых символов
for(i=0;i<strlen(devname);i++) {
if ((devname[i]<'0') || (devname[i]>'9')) dflag=0;
}
// Если в строке - только цифры, добавляем префикс /dev/ttyUSB
if (dflag) strcpy(devstr,"/dev/ttyUSB");
// копируем имя устройства
strcat(devstr,devname);
siofd = open(devstr, O_RDWR | O_NOCTTY |O_SYNC);
if (siofd == -1) return 0;
bzero(&sioparm, sizeof(sioparm)); // готовим блок атрибутов termios
@ -254,11 +272,13 @@ tcsetattr(siofd, TCSANOW, &sioparm);
return 1;
}
//*************************************
// Настройка Последовательного порта
// Настройка времени ожидания порта
//*************************************
void port_timeout(int timeout) {
bzero(&sioparm, sizeof(sioparm)); // готовим блок атрибутов termios
sioparm.c_cflag = B115200 | CS8 | CLOCAL | CREAD ;
sioparm.c_iflag = 0; // INPCK;
@ -350,3 +370,34 @@ fclose(in);
return 1;
}
//****************************************************
//* Отсылка модему АТ-команды
//*
//* cmd - буфер с командой
//* rbuf - буфер для записи ответа
//*
//* Возвращает длину ответа
//****************************************************
int atcmd(char* cmd, char* rbuf) {
int res;
char cbuf[128];
strcpy(cbuf,"AT");
strcat(cbuf,cmd);
strcat(cbuf,"\r");
port_timeout(100);
// Вычищаем буфер приемника и передатчика
tcflush(siofd,TCIOFLUSH);
// отправка команды
write(siofd,cbuf,strlen(cbuf));
usleep(100000);
// чтение результата
res=read(siofd,rbuf,200);
return res;
}

@ -4,4 +4,6 @@ void dump(char buffer[],int len,long base);
int send_cmd(unsigned char* incmdbuf, int blen, unsigned char* iobuf);
int open_port(char* devname);
int find_file(int num, char* dirname, char* filename,unsigned int* id, unsigned int* size);
void port_timeout();
void port_timeout();
int atcmd(char* cmd, char* rbuf);

Loading…
Cancel
Save