📄 net.c
字号:
#include "../ucos_ii/includes.h"
static INT32U NetBaud[] = {38400,19200,9600,4800,2400,1200,600,300,115200,57600,230400,460800,921600};
BOOL LinkState(UCHAR CommNo)
{
INT8U State[2];
if(CommNo == 0)
{
State[0] = *Com_AuxIn;
if((State[0]&0x08) != 0)
return TRUE;
}
else
{
State[1] = *Com_AuxIn;
if((State[1]&0x80) != 0)
return TRUE;
}
return FALSE;
}
UCHAR PollBaud(INT32U Baud)
{
INT8U i;
for(i=0;i<sizeof(NetBaud)/4;i++)
{
if(Baud == NetBaud[i])
return i;
}
return 9;
}
void NetCodeData(UCHAR *Psrc,UCHAR *Pdst)
{
struct NetInfoHead *p;
INT8U *a;
p = (struct NetInfoHead *)Psrc;
do
{
a = Psrc;
*Pdst = ':'; Pdst++;
gsmBytes2String(Psrc,(char*)Pdst,p->DataLength+5);
Pdst += (p->DataLength+5)*2;
Psrc += p->DataLength+5;
*Pdst = '\r'; Pdst++;
*Pdst = '\n'; Pdst++;
p = (struct NetInfoHead *)Psrc;
}while(p->DataType != EndRecordType);
a = Psrc;
*Pdst = ':'; Pdst++;
gsmBytes2String(Psrc,(char*)Pdst,p->DataLength+5);
Pdst += (p->DataLength+5)*2;
Psrc += p->DataLength+5;
}
UCHAR NetCrc(unsigned char* Data,int Length)
{
int sum=0,i;
unsigned char crc;
for(i = 0;i < Length;i++)
{
sum += *Data;
Data++;
}
crc = 0x100 - (unsigned char)sum;
return crc;
}
void NetCode(UCHAR *Data,UCHAR *Pdst)
{
INT8U netinfolength,PackNo,i,j;
INT8U *p;
netinfolength = sizeof(struct netinfo);
PackNo = netinfolength/0x20;
p = Pdst;
for(i=0;i<PackNo;i++)
{
*Pdst = 0x20; Pdst++;
*Pdst = 0x00; Pdst++;
*Pdst = i*0x20; Pdst++;
*Pdst = ConfigMemType; Pdst++;
for(j=0;j<0x20;j++)
{
*Pdst = *Data;
Pdst++; Data++;
}
*Pdst = NetCrc(p,0x24); Pdst++;
p = Pdst;
}
PackNo = netinfolength%0x20;
*Pdst = PackNo; Pdst++;
*Pdst = 0x00; Pdst++;
*Pdst = i*0x20; Pdst++;
*Pdst = ConfigMemType; Pdst++;
for(i=0;i<PackNo;i++)
{
*Pdst = *Data;
Pdst++; Data++;
}
*Pdst = NetCrc(p,PackNo+4); Pdst++;
p = Pdst;
*Pdst = 0x00; Pdst++;
*Pdst = 0x00; Pdst++;
*Pdst = 0x00; Pdst++;
*Pdst = EndRecordType; Pdst++;
*Pdst = NetCrc(p,4);
}
BOOL NetDecode(UCHAR *Data,UCHAR *Pdst)
{
struct NetInfoHead *NetInfoHeadS;
UCHAR NetDataLength,NetDataType = DefaultType,Crc,i,CrcSum;
USHORT StartAddress;
UCHAR *p;
p = Data;
do
{
NetInfoHeadS = (struct NetInfoHead *)Data;
NetDataLength = NetInfoHeadS->DataLength;
StartAddress = NetInfoHeadS->DataStartAddress;
StartAddress = reversebyte(StartAddress);
NetDataType = NetInfoHeadS->DataType;
NetInfoHeadS++;
Data = (UCHAR *)NetInfoHeadS;
Crc = NetCrc((UCHAR*)p,(int)(NetDataLength+4));
CrcSum = *(Data+NetDataLength);
if(Crc != CrcSum)
return FALSE;
for(i=0;i<NetDataLength;i++) //数据拷贝
{
*Pdst = *Data;
Pdst++; Data++;
}
Data++; //Crc
p = Data;
}while(NetDataType != EndRecordType);
return TRUE;
}
// 可打印字符串转换为字节数据
// 如:"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01}
// 输入: pSrc - 源字符串指针
// nSrcLength - 源字符串长度
// 输出: pDst - 目标数据指针
// 返回: 目标数据长度
int gsmString2Bytes(char* pSrc, unsigned char* pDst, int nSrcLength)
{
int i,n=0;
BOOL IsHexFlag = FALSE;
for (i = 0; i < nSrcLength; )
{
IsHexFlag = FALSE;
if(((*pSrc >= '0') && (*pSrc <= '9'))||((*pSrc >= 'A') && (*pSrc <= 'F')))
{
// 输出高4位
if ((*pSrc >= '0') && (*pSrc <= '9'))
{
*pDst = (*pSrc - '0') << 4;
}
else
{
*pDst = (*pSrc - 'A' + 10) << 4;
}
IsHexFlag = TRUE;
}
pSrc++;
i++;
if(!IsHexFlag) continue;
if(((*pSrc >= '0') && (*pSrc <= '9'))||((*pSrc >= 'A') && (*pSrc <= 'F')))
{
// 输出低4位
if ((*pSrc>='0') && (*pSrc<='9'))
{
*pDst |= *pSrc - '0';
}
else
{
*pDst |= *pSrc - 'A' + 10;
}
pDst++;
n++;
}
pSrc++;
i++;
}
// 返回目标数据长度
return (n);
}
// 字节数据转换为可打印字符串
// 如:{0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} --> "C8329BFD0E01"
// 输入: pSrc - 源数据指针
// nSrcLength - 源数据长度
// 输出: pDst - 目标字符串指针
// 返回: 目标字符串长度
int gsmBytes2String(unsigned char* pSrc, char* pDst, int nSrcLength)
{
char tab[]="0123456789ABCDEF"; // 0x0-0xf的字符查找表
int i;
for (i = 0; i < nSrcLength; i++)
{
*pDst++ = tab[*pSrc >> 4]; // 输出高4位
*pDst++ = tab[*pSrc & 0x0f]; // 输出低4位
pSrc++;
}
// 输出字符串加个结束符
*pDst = '\0';
// 返回目标字符串长度
return (nSrcLength * 2);
}
int ReadComm(UCHAR* pData,UCHAR port)
{
int i = 0;
if(port == 0)
{
while(Usart0.Rxc_Wr != Usart0.Rxc_Rd)
{
*pData++ = Usart0.Rxc_Buff[Usart0.Rxc_Rd];
i++;
if(Usart0.Rxc_Rd<(RXC_BUFF_SIZE-1))
Usart0.Rxc_Rd++;
else
Usart0.Rxc_Rd = 0;
}
}
else
{
while(Usart1.Rxc_Wr != Usart1.Rxc_Rd)
{
*pData++ = Usart1.Rxc_Buff[Usart1.Rxc_Rd];
i++;
if(Usart1.Rxc_Rd<(RXC_BUFF_SIZE-1))
Usart1.Rxc_Rd++;
else
Usart1.Rxc_Rd = 0;
}
}
return i;
}
int UsartWrite(UCHAR *pbuf, ULONG count,UCHAR port)
{
int i;
if(port != 0)
{
for(i=0; i<count; i++)
{
Usart1.Txc_Buff[Usart1.Txc_Wr] = *(pbuf+i);
if(Usart1.Txc_Wr<(TXC_BUFF_SIZE-1))
Usart1.Txc_Wr++;
else
Usart1.Txc_Wr=0;
}
while ((US1_CSR & US_TXEMPTY) == 0);
US1_IER |= US_TXEMPTY;
}
else
{
for(i=0; i<count; i++)
{
Usart0.Txc_Buff[Usart0.Txc_Wr] = *(pbuf+i);
if(Usart0.Txc_Wr<(TXC_BUFF_SIZE-1))
Usart0.Txc_Wr++;
else
Usart0.Txc_Wr=0;
}
while ((US0_CSR & US_TXEMPTY) == 0);
US0_IER |= US_TXEMPTY;
}
return i;
}
int put_char(UCHAR c,UCHAR port) /*chario.c*/
{
UCHAR buf[2];
buf[0] = c;
UsartWrite((UCHAR *)buf, 1, port);
return((int)c);
}
void putstring(char *string,UCHAR port)
{
while(*string)
{
put_char(*string,port);
string++;
}
}
void ResetNet(UCHAR port,BOOL Task)
{
if(port)
{
at91_pio_write (&PIO_DESC, SCK1, PIO_SET_OUT ) ;
if(Task)
OSTimeDlyHMSM(0,0,0,50);
else
delay(50);
at91_pio_write (&PIO_DESC, SCK1, PIO_CLEAR_OUT ) ;
if(Task)
OSTimeDlyHMSM(0,0,0,50);
else
delay(50);
at91_pio_write (&PIO_DESC, SCK1, PIO_SET_OUT ) ;
}
else
{
at91_pio_write (&PIO_DESC, SCK0, PIO_SET_OUT ) ;
if(Task)
OSTimeDlyHMSM(0,0,0,50);
else
delay(50);
at91_pio_write (&PIO_DESC, SCK0, PIO_CLEAR_OUT ) ;
if(Task)
OSTimeDlyHMSM(0,0,0,50);
else
delay(50);
at91_pio_write (&PIO_DESC, SCK0, PIO_SET_OUT ) ;
}
}
/*--------------------------------------------------------------------
目的:读出网络配置参数
输入:CommNo 串口号 Task 是否多任务已运行
输出:struct NetInfoConfig *info
--------------------------------------------------------------------*/
BOOL NetConfigInfo(UCHAR CommNo, struct NetInfoConfig *info, BOOL Task)
{
UCHAR AscTmp[350],BinTmp[350],NetBinTmp[150],NetBinCode[150];
USHORT i,a;
char *ptr;
struct netinfo *NetInfo;
if(Task)
{
OSTaskSuspend(YXID);
OSTaskSuspend(FAID);
OSTaskSuspend(YCID);
OSTaskSuspend(USART1ID);
OSTaskSuspend(USART2ID);
}
if(CommNo == 0)
{
Usart0_init(US_CHRL_8 | US_PAR_NO | US_NBSTOP_1,9600);
}
else if(CommNo == 1)
{
Usart1_init(US_CHRL_8 | US_PAR_NO | US_NBSTOP_1,9600);
}
ResetNet(CommNo,Task);
for(i=0;i<40;i++)
{
if(Task)
OSTimeDlyHMSM(0,0,0,50);
else
delay(50);
put_char('z',CommNo);
}
if(Task)
OSTimeDlyHMSM(0,0,0,500);
else
delay(500);
ReadComm(AscTmp,CommNo);
if(strstr((char *)AscTmp,"*** NodeSet 2.0 ***") != 0)
{
ptr = strchr((char *)AscTmp,'>');
if(ptr==NULL)
return FALSE;
switch(*(ptr-1))
{
case 0x30:
{
putstring("GC",CommNo);
put_char(0x0d,CommNo);
if(Task)
OSTimeDlyHMSM(0,0,0,400);
else
delay(400);
memset(AscTmp,0,sizeof(AscTmp));
ReadComm(AscTmp,CommNo);
memset(BinTmp,0,sizeof(BinTmp));
memset(NetBinTmp,0,sizeof(NetBinTmp));
memset(NetBinCode,0,sizeof(NetBinCode));
memcpy(BinTmp,AscTmp+4,19*16-1);
memset(AscTmp,0,sizeof(AscTmp));
a = gsmString2Bytes((char*)BinTmp,NetBinTmp,strlen((char*)BinTmp));
// gsmBytes2String(NetBinCode,(char*)NetBinTmp,a);
NetDecode((UCHAR*)NetBinTmp,NetBinCode);
NetInfo = (struct netinfo *)NetBinCode;
info->SubnetMask = ConfigToNetMask(NetInfo->Netmask);
info->Baud = NetBaud[NetInfo->LineSpeed];
info->Ip = INT8UToINT32U((INT8U*)NetInfo->IPAdress);
info->DefGetway = INT8UToINT32U((INT8U*)NetInfo->Gateway);
info->ServerPort = INT8UToINT16U((INT8U*)NetInfo->OwnPortNo);
break;
}
case 0x31:
{
break;
}
case 0x32:
{
break;
}
case 0x38:
{
break;
}
case 0x39:
{
break;
}
default:
return FALSE;
}
}
return TRUE;
}
/*------------------------------------------------------------------*/
/*函数名称:InitNet() */
/*函数功能:网口初始化 */
/*输入说明:Flag:FALSE--网口1;TRUE:--网口2 */
/*输出说明: */
/*------------------------------------------------------------------*/
BOOL InitNet(BOOL Flag, struct NetInfo *info,BOOL Task)
{
UCHAR tmp[350],testtmp[350],NetCommand[200],CommNo;
USHORT a,i;
char *ptr;
struct netinfo *NetInfo;
struct NetInfoConfigG6 *G6NetInfo;
if(Task)
{
OSTaskSuspend(YXID);
OSTaskSuspend(FAID);
OSTaskSuspend(YCID);
OSTaskSuspend(USART1ID);
OSTaskSuspend(USART2ID);
}
memset(tmp,0,sizeof(tmp));
if(Flag == FALSE)
{
Usart0_init(US_CHRL_8 | US_PAR_NO | US_NBSTOP_1,9600);
CommNo = 0;
}
else
{
Usart1_init(US_CHRL_8 | US_PAR_NO | US_NBSTOP_1,9600);
CommNo = 1;
}
ResetNet(CommNo,Task);
for(i=0;i<60;i++)
{
if(Task)
OSTimeDlyHMSM(0,0,0,50);
else
delay(50);
put_char('z',CommNo);
}
if(Task)
OSTimeDlyHMSM(0,0,0,500);
else
delay(500);
ReadComm(tmp,CommNo);
if(strstr((char *)tmp,"*** NodeSet 2.0 ***") != 0)
{
ptr = strchr((char *)tmp,'>');
if(ptr==NULL)
return FALSE;
switch(*(ptr-1))
{
case 0x30:
{
memset(tmp,0,sizeof(tmp));
putstring("GC",CommNo);
put_char(0x0d,CommNo);
if(Task)
OSTimeDlyHMSM(0,0,0,400);
else
delay(400);
ReadComm(tmp,CommNo);
memset(testtmp,0,sizeof(testtmp));
memset(NetCommand,0,sizeof(NetCommand));
memcpy(testtmp,tmp+4,19*16-1);
a = gsmString2Bytes((char*)testtmp,NetCommand,strlen((char*)testtmp));
gsmBytes2String(NetCommand,(char*)tmp,a);
NetDecode((UCHAR*)NetCommand,tmp);
NetInfo = (struct netinfo *)tmp;
NetInfo->LineSpeed = PollBaud(info->Baud); //在这里修改网络设置
INT32UToINT8U(info->Ip,(INT8U *)NetInfo->IPAdress);
INT32UToINT8U(info->Ip,(INT8U *)NetInfo->RomoteIpAddress);
NetInfo->Netmask = NetMaskToConfig(info->SubnetMask);
INT32UToINT8U(info->DefGetway,(INT8U *)NetInfo->Gateway);
INT16UToINT8U(info->ServerPort,(INT8U *)NetInfo->OwnPortNo);
INT16UToINT8U(info->ServerPort,(INT8U *)NetInfo->RomotePortNo);
NetInfo->Line.Mode = 0;
NetInfo->Line.DateBit = 3;
NetInfo->Line.Parity = 0;
NetInfo->Line.StopBit = 1;
NetInfo->ConnectConfig = 0xc0;
NetInfo->Reserved0 = 0;
NetInfo->FlagByte = 0;
NetInfo->TCPKeepalive = 0x2d;
NetInfo->FlowControl = 0;
NetInfo->Reserved1 = 0;
NetInfo->UnconnectConfig = 0x01;
NetInfo->UnconnectMinutes = 0;
NetInfo->UnconnectSeconds = 0;
memset((char *)NetInfo->Telnet_config_password,0,4);
memset((char *)NetInfo->TriggerSend,0,88);
memset(testtmp,0,sizeof(testtmp));
NetCode(tmp,testtmp);
NetCodeData(testtmp,tmp);
putstring("SC",CommNo);
put_char(0x0d,CommNo);
if(Task)
OSTimeDlyHMSM(0,0,0,100);
else
delay(100);
ReadComm(testtmp,CommNo);
putstring((char *)tmp,CommNo);
memset(tmp,0,sizeof(tmp));
if(Task)
OSTimeDlyHMSM(0,0,0,500);
else
delay(500);
ReadComm(tmp,CommNo);
memset(tmp,0,sizeof(tmp));
putstring("G7",CommNo);
put_char(0x0d,CommNo);
if(Task)
OSTimeDlyHMSM(0,0,0,400);
else
delay(400);
ReadComm(tmp,CommNo);
memset(testtmp,0,sizeof(testtmp));
memset(NetCommand,0,sizeof(NetCommand));
memcpy(testtmp,tmp+4,20*16-1);
a = gsmString2Bytes((char*)testtmp,NetCommand,strlen((char*)testtmp));
gsmBytes2String(NetCommand,(char*)tmp,a);
NetDecode((UCHAR*)NetCommand,tmp);
G6NetInfo = (struct NetInfoConfigG6 *)tmp;
G6NetInfo->CP1_option = XportLED1;
G6NetInfo->IN1_statue = 0;
G6NetInfo->OUT1_statue = 0;
G6NetInfo->LED1_statue = 1;
memset(testtmp,0,sizeof(testtmp));
NetCode(tmp,testtmp);
memset(tmp,0,sizeof(tmp));
NetCodeData(testtmp,tmp);
putstring("S7",CommNo);
put_char(0x0d,CommNo);
if(Task)
OSTimeDlyHMSM(0,0,0,100);
else
delay(100);
ReadComm(testtmp,CommNo);
putstring((char *)tmp,CommNo);
memset(tmp,0,sizeof(tmp));
if(Task)
OSTimeDlyHMSM(0,0,0,500);
else
delay(500);
ReadComm(tmp,CommNo);
if(strstr((char*)tmp,"0>"))
return TRUE;
else
return FALSE;
break;
}
case 0x31:
{
break;
}
case 0x32:
{
break;
}
case 0x38:
{
break;
}
case 0x39:
{
break;
}
default:
i = *(ptr-1);
}
}
return FALSE;
}
void printf0(char *fmt, ...)
{
va_list argptr;
char temp_buf[256];
va_start(argptr, fmt);
vsprintf(temp_buf, fmt, argptr);
putstring(temp_buf,0);
va_end(argptr);
}
void printf1(char *fmt, ...)
{
va_list argptr;
char temp_buf[256];
va_start(argptr, fmt);
vsprintf(temp_buf, fmt, argptr);
putstring(temp_buf,1);
va_end(argptr);
}
UCHAR BitTest(UINT Value)
{
UINT t;
UCHAR i;
t = 0x80000000;
for(i=32;i!=0;i--)
{
if(((Value&t)^t)==t)
return i;
else
t>>=1;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -