📄 k_modbus.c
字号:
else if (lstat & LSTAT_BREAK_INT)
comerror = BREAK_ERROR;
return(TRUE);
case 0xc:
while(inportb(REG_LSTAT) & LSTAT_DATA_READY)
{
chr = inportb(REG_RX);
putbuf(&inring, chr);
}
return(TRUE);
}
inport(REG_LSTAT);
inport(REG_MSTAT);
inport(REG_RX);
return(FALSE); //this is really an error condition
}
/*-------------------------------------------------------------------------*/
void comput(unsigned char c)
{
if(outring.count ||!(inportb(REG_LSTAT)&LSTAT_THRE))
putbuf(&outring, c); //add it to the output buffer
else {
outportb(REG_TX, c);
send_num++;
}
}
/*-------------------------------------------------------------------------*/
void computs(unsigned int put_date)
{
static unsigned char a[2]={0,0};
if(put_date<=0xff) {
a[0]=(unsigned char)put_date&0x00ff;
a[1]=0;
}
if(put_date>0xff) {
a[1]=(unsigned char)((put_date>>8)&0x00ff);
a[0]=(unsigned char)(put_date&0x00ff);
}
comput(a[1]);
comput(a[0]);
}
/*-------------------------------------------------------------------------*/
unsigned int crc_check(unsigned char sys[],int no)
{
const unsigned short NUM1=65535;
const unsigned short NUM2=40961;
unsigned int sum=NUM1;
int n,i,j;
for(i=0;i<no;i++) {
sum^=sys[i];
for(j=0;j<=7;j++)
{ n=sum&1;
if(n==1)
{ sum>>=1;
sum^=NUM2;}
else
sum>>=1;
}
}
sum=sum>>8|sum<<8;
return(sum);
}
static unsigned char comh[]={
0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,
0x40,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,0x01,0xc0,
0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,0x01,
0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,
0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,
0x40,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,
0x80,0x41,0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,
0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,
0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,
0x40,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x01,0xc0,
0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,0x01,
0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,
0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,
0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x01,0xc0,
0x80,0x41,0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,
0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,
0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,
0x40};
/******************table of crc value for low-order byte****************/
static char coml[]={
0x00,0xc0,0xc1,0x01,0xc3,0x03,0x02,0xc2,0xc6,0x06,0x07,0xc7,0x05,0xc5,0xc4,
0x04,0xcc,0x0c,0x0d,0xcd,0x0f,0xcf,0xce,0x0e,0x0a,0xca,0xcb,0x0b,0xc9,0x09,
0x08,0xc8,0xd8,0x18,0x19,0xd9,0x1b,0xdb,0xda,0x1a,0x1e,0xde,0xdf,0x1f,0xdd,
0x1d,0x1c,0xdc,0x14,0xd4,0xd5,0x15,0xd7,0x17,0x16,0xd6,0xd2,0x12,0x13,0xd3,
0x11,0xd1,0xd0,0x10,0xf0,0x30,0x31,0xf1,0x33,0xf3,0xf2,0x32,0x36,0xf6,0xf7,
0x37,0xf5,0x35,0x34,0xf4,0x3c,0xfc,0xfd,0x3d,0xff,0x3f,0x3e,0xfe,0xfa,0x3a,
0x3b,0xfb,0x39,0xf9,0xf8,0x38,0x28,0xe8,0xe9,0x29,0xeb,0x2b,0x2a,0xea,0xee,
0x2e,0x2f,0xef,0x2d,0xed,0xec,0x2c,0xe4,0x24,0x25,0xe5,0x27,0xe7,0xe6,0x26,
0x22,0xe2,0xe3,0x23,0xe1,0x21,0x20,0xe0,0xa0,0x60,0x61,0xa1,0x63,0xa3,0xa2,
0x62,0x66,0xa6,0xa7,0x67,0xa5,0x65,0x64,0xa4,0x6c,0xac,0xad,0x6d,0xaf,0x6f,
0x6e,0xae,0xaa,0x6a,0x6b,0xab,0x69,0xa9,0xa8,0x68,0x78,0xb8,0xb9,0x79,0xbb,
0x7b,0x7a,0xba,0xbe,0x7e,0x7f,0xbf,0x7d,0xbd,0xbc,0x7c,0xb4,0x74,0x75,0xb5,
0x77,0xb7,0xb6,0x76,0x72,0xb2,0xb3,0x73,0xb1,0x71,0x70,0xb0,0x50,0x90,0x91,
0x51,0x93,0x53,0x52,0x92,0x96,0x56,0x57,0x97,0x55,0x95,0x94,0x54,0x9c,0x5c,
0x5d,0x9d,0x5f,0x9f,0x9e,0x5e,0x5a,0x9a,0x9b,0x5b,0x99,0x59,0x58,0x98,0x88,
0x48,0x49,0x89,0x4b,0x8b,0x8a,0x4a,0x4e,0x8e,0x8f,0x4f,0x8d,0x4d,0x4c,0x8c,
0x44,0x84,0x85,0x45,0x87,0x47,0x46,0x86,0x82,0x42,0x43,0x83,0x41,0x81,0x80,
0x40};
unsigned short crc16(unsigned char *sys,unsigned short datelen)
{
unsigned char numh=0xff;
unsigned char numl=0xff;
unsigned index;
while(datelen--)
{ index=numh^*sys++;
numh=numl^comh[index];
numl=coml[index];
}
return (numh<<8|numl);
}
/*------------------------------------------------------------------------*/
void init_data()
{
char c;
int i;
unsigned short int fvalve;
char covdt(char no);
unsigned short int conc;
extern struct peak_str peaka_bf[];
extern struct peak_str peakb_bf[];
extern struct ao_table ao_tab[];
initbuf(&dataout, dataout_buf,BUFFER_SIZE);
/*-----------------------PGC-time----------------------------------*/
// for(i=0;i<20;i++)
// peak[i]=300;
putbuf1(&dataout,peak[0]);
putbuf1(&dataout,peak[1]);
putbuf1(&dataout,peak[2]);
putbuf1(&dataout,peak[3]);
putbuf1(&dataout,peak[4]);
putbuf1(&dataout,peak[5]);
putbuf1(&dataout,peak[6]);
putbuf1(&dataout,peak[7]);
putbuf1(&dataout,peak[8]);
putbuf1(&dataout,peak[9]);
putbuf1(&dataout,peak[10]);
putbuf1(&dataout,peak[11]);
putbuf1(&dataout,peak[12]);
putbuf1(&dataout,peak[13]);
putbuf1(&dataout,peak[14]);
putbuf1(&dataout,peak[15]);
putbuf1(&dataout,peak[16]);
putbuf1(&dataout,peak[17]);
putbuf1(&dataout,peak[18]);
putbuf1(&dataout,peak[19]);
putbuf1(&dataout,peak[20]);
// for(i=0;i<80;i++)
// putbuf1(&dataout,0x00);
}
/*-------------------------------------------------------------------------*/
char covdt(char no)
{
extern char date_str[];
extern char time_str[];
unsigned char cc[2],ca;
unsigned int ii;
switch(no) {
case 0:
cc[0]=date_str[3];
cc[1]=date_str[4];
ii=atoi(cc);
ca=(char)ii&0x00ff;
return(ca);
case 1:
cc[0]=date_str[0];
cc[1]=date_str[1];
ii=atoi(cc);
ca=(char)ii&0x00ff;
return(ca);
case 2:
cc[0]=date_str[8];
cc[1]=date_str[9];
ii=atoi(cc);
ca=(char)ii&0x00ff;
return(ca);
case 3:
cc[0]=time_str[0];
cc[1]=time_str[1];
ii=atoi(cc);
ca=(char)ii&0x00ff;
return(ca);
case 4:
cc[0]=time_str[3];
cc[1]=time_str[4];
ii=atoi(cc);
ca=(char)ii&0x00ff;
return(ca);
case 5:
cc[0]=time_str[6];
cc[1]=time_str[7];
ii=atoi(cc);
ca=(char)ii&0x00ff;
return(ca);
}
return(TRUE);
}
/*-------------------------------------------------------------------------*/
void v_get(long miliseconds)
{
unsigned int j,i,n,m;
unsigned char func=0;//outchar[1024]={0};
unsigned short crc=0;
m=(ch[4]<<8|ch[5]);
n=(ch[2]<<8|ch[3]);
if((inportb(REG_MCONT)&0x02)==0x02){
initbuf(&outring, out_buf,BUFFER_SIZE );
//2 setbreak(miliseconds);
send_num=0;
func=ch[1];
// switch(func)
// {
// case 3:
// {
init_data();
outchar[0]=ch[0];
outchar[1]=ch[1];
outchar[2]=m*2;
for(i=0;i<m*2;i++)
outchar[3+i]=dataout.buffer[n+i];
crc=crc_check(outchar,m*2+3);
comput(outchar[0]);
comput(outchar[1]);
comput(outchar[2]);
for(j=0,i=0;i<m*2;i++,j++)
{
// outchar[3+j]=dataout.buffer[n+i];
comput(dataout.buffer[n+i]);//outchar[3+j]);
}
// crc=crc_check(outchar,m*2+3);
computs(crc);
// break;
// }
/* case 4:
{
init_data();
outchar[0]=ch[0];
outchar[1]=ch[1];
outchar[2]=m*2;
comput(outchar[0]);
comput(outchar[1]);
comput(outchar[2]);
for(j=0,i=0;i<m*2;i++,j++)
{
outchar[3+j]=dataout.buffer[n+i];
comput(outchar[3+j]);
}
crc=crc_check(outchar,m*2+3);
computs(crc);
break;
}
}*/
for(;;){
if((send_num>=m*2+5)&&(inportb(REG_LSTAT)&0x40)) {
//setbreak(miliseconds);
mcont=inportb(REG_MCONT);
mcont=mcont&0xfd;
disable();
outportb(REG_MCONT,mcont);
outportb(REG_INT_EN,0x0d);
enable();
send_num=0;
send_flag=FALSE;
break;}
}
// for(i=0;i<10;i++)
// ch[i]=0;
initbuf(&inring, in_buf,BUFFER_SIZE);
initbuf(&outring, out_buf,BUFFER_SIZE );
initbuf(&dataout, datain_buf,BUFFER_SIZE);
// com_buffers(FALSE, BUFFER_SIZE, BUFFER_SIZE);
// free(in_buf);
// free(out_buf);
// free(dataout_buf);
// free(datain_buf);
}
}
/*---------------------------------------------------------------------*/
void self(long milisecods)
{
int n=0,i=0;
unsigned char c;
unsigned short int modcheck=0;
long rcv_time=0l,start_time=0l;
if(inring.count==0) return;
initbuf(&datain, datain_buf,BUFFER_SIZE);
//initbuf(&inring, in_buf,BUFFER_SIZE);
start_time=ReadTime();
while(rcv_time<=milisecods){
// while(n<=7){
rcv_time=ReadTime()-start_time;
if(getbuf(&inring, &c))
{
putbuf(&datain,c);
// n++ ;
start_time=ReadTime();
}
}
for(i=0;i<8;i++)
getbuf(&datain, &ch[i]);
modcheck=(ch[6]<<8)|ch[7];
if((ch[0]==com_param.ipadd)&&(modcheck==crc_check(ch,6)))//{
{ mcont=inportb(REG_MCONT);
mcont=mcont|0x02;
disable();
outportb(REG_MCONT,mcont);
outportb(REG_INT_EN,0x0a);
enable();
send_flag=TRUE;
}
initbuf(&inring, in_buf,BUFFER_SIZE);
initbuf(&outring, out_buf,BUFFER_SIZE );
initbuf(&datain, datain_buf,BUFFER_SIZE);
}
int IdleFunction(void)
{
return(TRUE);
}
long ReadTime(void)
{
union REGS r;
long milliseconds;
r.h.ah=0x2c;
int86(0x21,&r,&r);
milliseconds=(long)r.h.dl*10;
milliseconds=milliseconds+(long)r.h.dh*1000;
milliseconds=milliseconds+(long)r.h.cl*6000l;
milliseconds=milliseconds+(long)r.h.ch*3600000l;
return(milliseconds);
}
void setbreak(long milliseconds)
{
int IdleFunction(void);
int lcr;
long timer=0l;
timer=ReadTime()+milliseconds;
while(ReadTime()<timer)
IdleFunction();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -