|
|
|
@ -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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|