/** * @brief ����UART�˿ڲ����� * @param port �˿ں�, 0~4 * @param baud ������ */ void UartSetBaudrate(unsigned int port, int baud) { int i; int status; struct termios opt; int fd; AssertLogReturnVoid(port>=UART_PORTNUM, "invalid port(%d)\n", port); fd = FidUart[port]; AssertLogReturnVoid(-1 == fd, "invalid fid(%d)\n", fd); if(tcgetattr(fd, &opt) != 0) { ErrorLog("tcgetattr fail\n"); return; } for ( i= 0; i < sizeof(SpeedArray) / sizeof(int); i++) { if (baud == NameArray[i]) { tcflush(fd, TCIOFLUSH); cfsetispeed(&opt, SpeedArray[i]); cfsetospeed(&opt, SpeedArray[i]); status = tcsetattr(fd, TCSANOW, &opt); if (status != 0) { ErrorLog("tcsetattr fail\n"); return; } tcflush(fd,TCIOFLUSH); } } }
/** * @brief �ر�һ���Ѵ�UART�˿� * @param port �˿ں�, 0~4 */ void UartClose(unsigned int port) { AssertLogReturnVoid(port>=UART_PORTNUM, "invalid port(%d)\n", port); AssertLogReturnVoid(-1 == FidUart[port], "invalid fid(%d)\n", FidUart[port]); close(FidUart[port]); FidUart[port] = -1; }
/** * @brief 保存事件 * @param idx 事件分类索引(重要事件,一般事件) * @param pbuf 储存事件缓存区指针 */ static void SaveAlarm(unsigned char idx, const alarm_t *pbuf) { alarm_t *pbase; char filename[32]; unsigned char idxbase; runstate_t *pstat = RunStateModify(); AssertLogReturnVoid(idx>=2, "invalid idx(%d)\n", idx); if(0 == idx) pbase = AlarmBufferImportant; else pbase = AlarmBufferNormal; LockSysLock(LockIdAlarm); if(RunState.alarm.cur[idx] == RunState.alarm.head[idx]) //empty pstat->alarm.cur[idx] = pstat->alarm.head[idx] = 0; //pbase[RunState.alarm.cur[idx]] = *pbuf; memcpy(pbase+RunState.alarm.cur[idx], pbuf, sizeof(alarm_t)); AlarmFileName(idx, RunState.alarm.cur[idx], filename); idxbase = RunState.alarm.cur[idx] & ALARM_BASEMASK; SaveBinFile(filename, ALARM_MAGIC, (unsigned char *)&pbase[idxbase], sizeof(alarm_t)*ALMNUM_PERFILE); pstat->alarm.cur[idx]++; if(RunState.alarm.cur[idx] == RunState.alarm.head[idx]) pstat->alarm.head[idx]++; UnlockSysLock(LockIdAlarm); }
static void SavePltData(const sysclock_t *pclk) { char filename[64]; int len, prd, itemlen; plt_filedata_t *pcache; unsigned char *pbuf; sprintf(filename, "%sdaytest@%02d%02d%02d.db", PLT_FILEPATH, pclk->year, pclk->month, pclk->day); itemlen = PltConfig.maxmet*MET_DATA_LEN+PRD_HEAD_LEN; len = itemlen*PltConfig.maxprd + FILE_HEAD_LEN; AssertLogReturnVoid(len > LEN_FILE_CACHE, "too long file(%d)\n", len); pcache = (plt_filedata_t *)PltFileCache; pcache->max_prd = PltConfig.maxprd; pcache->invaid_prd = PltFileData.invaid_prd; pcache->max_met = PltConfig.maxmet; pbuf = (unsigned char *)pcache->prd; for(prd=0; prd<PltConfig.maxprd; prd++) { memcpy(pbuf, &PltFileData.prd[prd], itemlen); pbuf += itemlen; } SaveBinFile(filename, MAGIC_FILE_PLT, PltFileCache, len); }
void SetPlMdbFenum(unsigned short mid, unsigned char fenum) { AssertLogReturnVoid(mid < PLC_BASEMETP || mid >= MAX_METER, "invalid mid(%d)\n", mid); PlMdbMonth[mid - PLC_BASEMETP].fenum = fenum; }
/** * @brief ����UART�˿����� * @param port �˿ں�, 0~4 * @param databits ����λ, 5~8 * @param stopbits ֹͣλ, 1~2 * @param parity У��λ */ void UartSetParity(unsigned int port, int databits,int stopbits, char parity) { struct termios options; int fd; AssertLogReturnVoid(port>=UART_PORTNUM, "invalid port(%d)\n", port); fd = FidUart[port]; AssertLogReturnVoid(-1 == fd, "invalid fid(%d)\n", fd); if(tcgetattr(fd, &options) != 0) { ErrorLog("tcgetattr fail\n"); return; } options.c_iflag = 0; options.c_cflag &= ~CSIZE; switch (databits) { /*设置数据位数*/ case 5: options.c_cflag |= CS5; break; case 6: options.c_cflag |= CS6; break; case 7: options.c_cflag |= CS7; break; case 8: options.c_cflag |= CS8; break; default: ErrorLog("invalid databits(%d)\n", databits); return; } switch (parity) { case 'n': case 'N': options.c_cflag &= ~PARENB; /* Clear parity enable */ options.c_iflag &= ~INPCK; /* Enable parity checking */ break; case 'o': case 'O': options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/ options.c_iflag |= INPCK; /* Disnable parity checking */ break; case 'e': case 'E': options.c_cflag |= PARENB; /* Enable parity */ options.c_cflag &= ~PARODD; /* 转换为偶效验*/ options.c_iflag |= INPCK; /* Disnable parity checking */ break; case 'S': case 's': /*as no parity*/ options.c_cflag &= ~PARENB; options.c_cflag &= ~CSTOPB;break; default: ErrorLog("invalid parity(%d)\n", parity); return; } /* 设置停止位*/ switch (stopbits) { case 1: options.c_cflag &= ~CSTOPB; break; case 2: options.c_cflag |= CSTOPB; break; default: ErrorLog("invalid stopbits(%d)\n", stopbits); return; } options.c_iflag &= ~(INLCR|IGNCR|ICRNL|IUCLC); //add 2007-10-19 options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /*Input*/ options.c_oflag &= ~OPOST; /*Output*/ tcflush(fd, TCIFLUSH); options.c_cc[VTIME] = 0; /* 设置超时15 seconds*/ options.c_cc[VMIN] = 0; /* Update the options and do it NOW */ if(tcsetattr(fd, TCSANOW, &options) != 0) { ErrorLog("tcsetattr fail\n"); return; } }