📄 lib.c
字号:
// return(temp);
}
*/
/*------------------------------------------------------------------------
Procedure: bcd2bin16 ID:1
Purpose: 转换BCD码为二进制,用于两个字节.
Input: BCD码.
Output: 转换结果.
Errors: 输入值过大.
------------------------------------------------------------------------*/
/*
INT16U bcdtobin16(INT16U v)
{
register INT16U i;
i=(v>>12)*1000;
i+=((v&0x0f00)>>8)*100;
i+=((v&0x00f0)>>4)*10;
i+=v&0x0f;
return(i);
}
*/
/*------------------------------------------------------------------------
Procedure: bin2bcd32 ID:1
Purpose: 转换二进制为BCD码,用于四个字节.
Input: 二进制值.
Output: 转换结果.
Errors: 输入值过大.
------------------------------------------------------------------------*/
/*
INT32U bin2bcd32(INT32U v)
{
register INT32U temp=0 ,i,j;
if (v>99999999){return 0;}
for(i=10000000,j=28;i>=1;i=i/10,j=j-4)
{
temp+=(v/i)<<j;
v-=(v/i)*i;
}
return (temp);
}
*/
/*------------------------------------------------------------------------
Procedure: bcd2bin32 ID:1
Purpose: 转换为二进制,用于四个字节.
Input: BCD码.
Output: 转换结果.
Errors: 输入值过大.
------------------------------------------------------------------------*/
/*
INT32U bcd2bin32(INT32U v)
{
register INT32U temp,i,j,k;
temp=(v>>28)*10000000;
for(i=0xf000000,k=1000000,j=24;k>=1;i=i>>4,j-=4,k=k/10)
{
temp+=((v&i)>>j)*k;
}
return(temp);
}
*/
/*------------------------------------------------------------------------
Procedure: LongMul ID:1
Purpose: 长乘法.
Input:
Output:
Errors:
------------------------------------------------------------------------*/
/*
void LongMul(INT32U a, INT32U b, INT32U* result)
{
INT16U ah, al, bh, bl;
INT32U mul1, mul2, mul3;
ah=(INT16U)(a>>16);
al=(INT16U)a;
bh=(INT16U)(b>>16);
bl=(INT16U)b;
mul1=(INT32U)al*(INT32U)bl;
mul2=(INT32U)ah*(INT32U)bl+(INT32U)al*(INT32U)bh;
mul3=(INT32U)ah*(INT32U)bh;
result[0]=mul1+(mul2<<16);
result[1]=(mul2>>16)+mul3;
if((~mul1)<(mul2<<16))
result[1]++;
}
*/
/*------------------------------------------------------------------------
Procedure: UlongDiv ID:1
Purpose: 无符号长除法.
Input:
Output:
Errors:
------------------------------------------------------------------------*/
/*
void UlongDiv(INT32U* a, INT16U c, INT32U* result)
{
INT16U ah, al, bh, bl;
INT32U quot1, quot2, quot3, quot4;
INT32U rem1, rem2, rem3, rem;
INT32U temp;
ah = (INT16U)(a[0]>>16);
al = (INT16U)a[0];
bh = (INT16U)(a[1]>>16);
bl = (INT16U)a[1];
quot1=bh/c;
rem1=bh%c;
temp=bl+(rem1<<16);
quot2=temp/c;
rem2=temp%c;
temp=ah+(rem2<<16);
quot3=temp/c;
rem3=temp%c;
temp=al+(rem3<<16);
quot4=temp/c;
rem=temp%c;
result[2]=(quot1<<16)+quot2;
result[1]=rem;
result[0]=(quot3<<16)+quot4;
}
*/
/*------------------------------------------------------------------------
Procedure: delay_us ID:1
Purpose: 微秒级延时程序.适用于AVRmega系列单片机。
用于操作系统没有初始化时的延时
Input:
Output:
Errors:
------------------------------------------------------------------------*/
/*
void delay_us(int time)
{
do
{
time--;
}
while (time>1);
}
*/
/*------------------------------------------------------------------------
Procedure: delay_us ID:1
Purpose: 毫秒级延时程序.适用于AVRmega系列单片机。
用于操作系统没有初始化时的延时
Input:
Output:
Errors:
------------------------------------------------------------------------*/
/*
void delay_ms(INT32U time)
{
while(time!=0)
{
delay_us(1000);
time--;
}
}
*/
/*------------------------------------------------------------------*/
/*函数名称:MyPow() */
/*函数功能:乘方计算,x的y次方 */
/*------------------------------------------------------------------*/
INT32U MyPow(INT32U x, INT32U y)
{
INT32U i, rc=1;
for (i=0; i<y; i++)
rc *= x;
return (rc);
}
/////////////////////////////////////////////////////////////////////////////
// 串口处理部分
/////////////////////////////////////////////////////////////////////////////
BOOL RReadx(INT16U Addr, INT8U Port)
{
char pbuf[10];
char answer[]="THISISXX!X";
INT8U i, j;
INT16U rp;
if(Port == COM1)
{
rp = (Usart0.RRxc_Rd + RXC_BUFF_SIZE - 9) % RXC_BUFF_SIZE;
for(i=0; Usart0.Rxc_Wr!=rp; i++)
{
if (Usart0.Rxc_Buff[rp] == 'I')
{
if ((((rp+RXC_BUFF_SIZE) - Usart0.Rxc_Wr) % RXC_BUFF_SIZE) < 10)
{
return (FALSE);
}
for (j=0; j<10; j++)
pbuf[j] = Usart0.Rxc_Buff[ (rp+j) % RXC_BUFF_SIZE ];
if (!strncmp(pbuf, "ISTHIS", 6))
{
if ((pbuf[6] == (Addr&0xFF)) && (pbuf[7] == ((Addr>>8)&0xFF)))
{
if (pbuf[8] == '?')
{
//判断校验码
answer[6] = Addr&0xFF;
answer[7] = (Addr>>8)&0xFF;
answer[9] = SendVerifyHead((INT8U*)&answer[0],9);
OSTimeDlyHMSM(0, 0, 0, 200);
WriteX((INT8U*)answer,10,Port);
OSTimeDlyHMSM(0, 0, 0, 500);
WriteX((INT8U*)answer,10,Port);
rp = (rp + 1) % RXC_BUFF_SIZE;
Usart0.RRxc_Rd = (rp + 9) % RXC_BUFF_SIZE;
return (TRUE);
}
else
{
rp = (rp + 1) % RXC_BUFF_SIZE;
continue;
}
}
else
{
rp = (rp + 1) % RXC_BUFF_SIZE;
continue;
}
}
else
{
rp = (rp + 1) % RXC_BUFF_SIZE;
continue;
}
}
else
{
rp = (rp + 1) % RXC_BUFF_SIZE;
}
}
Usart0.RRxc_Rd = rp;
}
else if(Port == COM2)
{
rp = (Usart1.RRxc_Rd + RXC_BUFF_SIZE - 9) % RXC_BUFF_SIZE;
for(i=0; Usart1.Rxc_Wr!=rp; i++)
{
if (Usart1.Rxc_Buff[rp] == 'I')
{
if ((((rp+RXC_BUFF_SIZE) - Usart1.Rxc_Wr) % RXC_BUFF_SIZE) < 10)
{
return (FALSE);
}
for (j=0; j<10; j++)
pbuf[j] = Usart1.Rxc_Buff[ (rp+j) % RXC_BUFF_SIZE ];
if (!strncmp(pbuf, "ISTHIS", 6))
{
if ((pbuf[6] == (Addr&0xFF)) && (pbuf[7] == ((Addr>>8)&0xFF)))
{
if (pbuf[8] == '?')
{
//判断校验码
answer[6] = Addr&0xFF;
answer[7] = (Addr>>8)&0xFF;
answer[9] = SendVerifyHead((INT8U*)&answer[0],9);
OSTimeDlyHMSM(0, 0, 0, 200);
WriteX((INT8U*)answer,10,Port);
OSTimeDlyHMSM(0, 0, 0, 500);
WriteX((INT8U*)answer,10,Port);
rp = (rp + 1) % RXC_BUFF_SIZE;
Usart1.RRxc_Rd = (rp + 9) % RXC_BUFF_SIZE;
return (TRUE);
}
else
{
rp = (rp + 1) % RXC_BUFF_SIZE;
continue;
}
}
else
{
rp = (rp + 1) % RXC_BUFF_SIZE;
continue;
}
}
else
{
rp = (rp + 1) % RXC_BUFF_SIZE;
continue;
}
}
else
rp = (rp + 1) % RXC_BUFF_SIZE;
}
Usart1.RRxc_Rd = rp;
}
else
return FALSE;
return FALSE;
}
/*------------------------------------------------------------------------
Procedure: OnRx
Purpose: 按DF9000维护规约进行帧校验. 抛弃前面的干扰字符
Input:
Output:
Errors: 帧非法.假设帧连续,且会结束出现帧尾.
------------------------------------------------------------------------*/
int Readx(INT8U *pbuf, INT16U count, INT8U port)
{
INT16U i;
INT16U rp;
if(port == COM1)
{
rp = Usart0.Rxc_Rd;
for(i=0; (i<count)&&(Usart0.Rxc_Wr!=rp); i++)
{
*(pbuf+i) = Usart0.Rxc_Buff[rp++];
rp = rp%RXC_BUFF_SIZE;
}
}
else if(port == COM2)
{
rp = Usart1.Rxc_Rd;
for(i=0; (i<count)&&(Usart1.Rxc_Wr!=rp); i++)
{
*(pbuf+i) = Usart1.Rxc_Buff[rp++];
rp = rp%RXC_BUFF_SIZE;
}
}
else return -1;
return i;
}
/*------------------------------------------------------------------------
Procedure: SCIWrite ID:1
Purpose: SCI写入.
Input:
Output:
Errors:
------------------------------------------------------------------------*/
int WriteX(INT8U *pbuf, INT16U count, INT8U port)
{
INT16U i;
if (count == 0)
return 0;
if(port == COM1)
{
if ((PortInfo[0].Medium == 1) || (PortInfo[0].Medium == 3) || (PortInfo[0].Medium == 7))
{
for(i=0; i<4; i++)
{
Usart0.Txc_Buff[Usart0.Txc_Wr] = 0xFE;
Usart0.Txc_Wr++;
Usart0.Txc_Wr = Usart0.Txc_Wr%TXC_BUFF_SIZE;
}
}
for(i=0; i<count; i++)
{
Usart0.Txc_Buff[Usart0.Txc_Wr] = *(pbuf+i);
Usart0.Txc_Wr++;
Usart0.Txc_Wr = Usart0.Txc_Wr%TXC_BUFF_SIZE;
}
//启动发送
OSTimeDly (PortInfo[0].RTSONDelay);
US0_IER |= US_TXEMPTY;//开启UDRE中断
}
else if(port == COM2)
{
if ((PortInfo[1].Medium == 1) || (PortInfo[1].Medium == 3) || (PortInfo[1].Medium == 7))
{
for(i=0; i<4; i++)
{
Usart1.Txc_Buff[Usart1.Txc_Wr] = 0xFE;
Usart1.Txc_Wr++;
Usart1.Txc_Wr = Usart1.Txc_Wr%TXC_BUFF_SIZE;
}
}
for(i=0; i<count; i++)
{
Usart1.Txc_Buff[Usart1.Txc_Wr] = *(pbuf+i);
Usart1.Txc_Wr++;
Usart1.Txc_Wr = Usart1.Txc_Wr%TXC_BUFF_SIZE;
}
//启动发送
OSTimeDly (PortInfo[1].RTSONDelay);
US1_IER |= US_TXEMPTY;//开启UDRE中断
}
else return -2;
return i;
}
/*------------------------------------------------------------------------
Procedure: CComm::lseek ID:1
Purpose: 更新读指针
Input:
Output:
Errors:
------------------------------------------------------------------------*/
void lseek(INT8U port, INT16U offset)
{
if(port == COM1)
{
Usart0.Rxc_Rd = (Usart0.Rxc_Rd+offset)%TXC_BUFF_SIZE;
}
else if(port ==COM2)
{
Usart1.Rxc_Rd = (Usart1.Rxc_Rd+offset)%TXC_BUFF_SIZE;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -