📄 communicate.c
字号:
CheckDM9000();
break;
case 255: // 卸去连接
connect = 0;
NetSendCommOK(UART0,UartSendBuf[UART0],RecData,0x55);
break;
default: break;
}//switch(SubCmd)
}//NetCommProcess()
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数: 网络数据检测及处理.
// 描述: 检测网络数据, 并处理网络数据包.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void CheckDM9000 (void)
{
uchar cUdpData[1050];
static ushort udpLen;
ulong i;
ulong DataLen;
uchar sum = 0; // 校验和字节
DataLen = 0;
cUdpData[1] = 0;
cUdpData[2] = 0;
udpLen = NetRxPack(cUdpData,cIpAddr,(ushort *)&wport); // 收取网络包数据,函数返回包长度CXTS
DataLen = cUdpData[1] + (cUdpData[2]<<8); // 数据长度
// 数据包处理
if( udpLen >= 6 && udpLen == DataLen)
{
for( i=0;i<DataLen;i++ )
{
sum += cUdpData[i]; //计算累加和
}
udpLen = 0;
if( (sum & 0xff)==0 )
{
// 接收方地址与本机地址不等时,不处理
if( cUdpData[3] != cLocalAddress )
return;
switch(cUdpData[4]) //命令
{
case 127:
NetCommProcess(cUdpData);
break;
default:
break;
}
}
}
}//CheckDM9000()
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数: 检查UART1.
// 描述: 串口1与PC机通信.
//
// [参数表]
// Uart1ReceData: 串口0接收数据数组始地址.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void CheckUart1(unsigned char *Uart1ReceData)
{
uchar i, sum = 0;
ulong DataLen; // 数据长度
DataLen = Uart1ReceData[1] + (Uart1ReceData[2]<<8); // 长度两个字节
if((DataLen >= 6) && (DataLen == UartReceLen[UART1]))
// 通过数据长度判断数据包是否已接收完毕
{
for( i=0; i<UartReceLen[UART1]; i++ ) // 计算累加和
{
sum += Uart1ReceData[i];
}
UartReceLen[UART1] = 0; // 串口1接收长度清零
DataLen = 0; // 数据长度清零
if( (sum & 0xff) == 0 ) // 校验和判断
{
// 接收方地址与本机地址不等时,不处理
if( Uart1ReceData[3] != cLocalAddress )
return;
switch(Uart1ReceData[4]) //命令
{
case 127:
Uart1_CommProcess(Uart1ReceData); //子命令
break;
default: break;
}
}
else
{
Uart1_SendCommOK(0xAA); //发送通信成功
}
}
}//CheckUart1()
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数: UART1发送通信成功.
// 描述: 向上位机发送通信成功数据包.
//
// [参数表]
// status: 状态.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void Uart1_SendCommOK(unsigned char status)
{
Uart1_SendBuf(0) = 2;
Uart1_SendBuf(1) = 7+1;
Uart1_SendBuf(2) = Uart1_ReceBuf(4);
Uart1_SendBuf(3) = Uart1_ReceBuf(3);
Uart1_SendBuf(4) = cLocalAddress; //本机地址
Uart1_SendBuf(5) = Uart1_ReceBuf(6); //子命令
Uart1_SendBuf(6) = status;
CalCommSum(UART1,UartSendBuf[UART1], UART_SEND); // 计算校验和
UartStartSend(UART1); // 启动串口发送
}//Uart1_SendCommOK()
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数: 串口1通信处理.
// 描述: 根据数据包的子命令执行相应的通信处理操作.
//
// [参数表]
// RecData: 接收数据数组的始地址.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void Uart1_CommProcess(unsigned char *RecData)
{
unsigned long dwDstAddress, dwLength;
unsigned char subCmd = RecData[6]; // 子命令
unsigned long i,j;
switch(subCmd)
{
case 0: //读控制板地址
Uart1_SendCommOK(1);
break;
case 1: //获取当前时间
SendCurrTime(UART1,UartSendBuf[UART1],RecData, UART_SEND);
break;
case 2: //建立联络
BuildConnect(UART1,UartSendBuf[UART1],RecData, UART_SEND);
break;
case 7: //读内存
ReadMemory(UartSendBuf[UART1],RecData,UART_SEND);
UartStartSend(UART1);
break;
case 8: //写内存
dwDstAddress = RecData[7]+(RecData[8]<<8)+(RecData[9]<<16)+(RecData[10]<<24);
dwLength = RecData[11]|(RecData[12]<<8);
memcpy((char *)dwDstAddress,(char *)&RecData[13],dwLength);
Uart1_SendCommOK(0x55);
break;
case 28: //go, 程序复位
goCommand(MAIN_ENTRY); // 强制跳转到目标地址
// 注: 要根据list文件中main_boot的入口地址进行赋值.
break;
case 29: //
Uart1_SendCommOK(0x55);
break;
case 30: //把程序搬到Norflash
dwLength = RecData[7]+(RecData[8]<<8)+(RecData[9]<<16)+(RecData[10]<<24);
j = (dwLength - 1)/NOR_FLASH_SECTOR_SIZE + 1;//擦除块数
if(connect == 1)
{
for( i=0; i<j; i++)
{
if(EraseSector(i) == FALSE)
return;
}
Writeflash((uchar *)DOWNLOAD_SDRAM_ADDR,0,dwLength);
Uart1_SendCommOK(0x55);
}
break;
case 255://卸去连接
connect = 0;
Uart1_SendCommOK(0x55);
break;
default:
break;
}//switch(SubCmd)
}//Uart1_CommProcess()
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数: 检查UART2.
// 描述: 串口2与PC机通信.
//
// [参数表]
// Uart2ReceData: 串口0接收数据数组始地址.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void CheckUart2(unsigned char *Uart2ReceData)
{
unsigned long i, sum = 0;
unsigned long DataLen; // 数据长度
DataLen = Uart2ReceData[1] + (Uart2ReceData[2]<<8); // 长度两个字节
if((DataLen >= 6) && (DataLen == UartReceLen[UART2]))
// 通过数据长度判断数据包是否已接收完毕
{
for( i=0; i<UartReceLen[UART2]; i++ ) // 计算累加和
{
sum += Uart2ReceData[i];
}
UartReceLen[UART2] = 0; // 串口2接收长度清零
DataLen = 0; // 数据长度清零
if( (sum & 0xff) == 0 ) // 校验和判断
{
// 接收方地址与本机地址不等时,不处理
if( Uart2ReceData[3] != cLocalAddress )
return;
switch(Uart2ReceData[4]) //命令
{
case 127:
Uart2_CommProcess(Uart2ReceData); //子命令
break;
default: break;
}
}
else
{
Uart2_SendCommOK(0xAA); //发送通信成功
}
}
}//CheckUart2()
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数: UART2发送通信成功.
// 描述: 向上位机发送通信成功数据包.
//
// [参数表]
// status: 状态.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void Uart2_SendCommOK(unsigned char status)
{
Uart2_SendBuf(0) = 2;
Uart2_SendBuf(1) = 7+1;
Uart2_SendBuf(2) = Uart2_ReceBuf(4);
Uart2_SendBuf(3) = Uart2_ReceBuf(3);
Uart2_SendBuf(4) = cLocalAddress; //本机地址
Uart2_SendBuf(5) = Uart2_ReceBuf(6); //子命令
Uart2_SendBuf(6) = status;
CalCommSum(UART2,UartSendBuf[UART2], UART_SEND); // 计算校验和
UartStartSend(UART2); // 启动串口发送
}//Uart2_SendCommOK()
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数: 串口2通信处理.
// 描述: 根据数据包的子命令执行相应的通信处理操作.
//
// [参数表]
// RecData: 接收数据数组的始地址.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void Uart2_CommProcess(unsigned char *RecData)
{
unsigned long dwDstAddress, dwLength;
unsigned char subCmd = RecData[6]; // 子命令
unsigned long i, j;
switch(subCmd)
{
case 0: //读控制板地址
Uart2_SendCommOK(1);
break;
case 1: //获取当前时间
SendCurrTime(UART2,UartSendBuf[UART2],RecData, UART_SEND);
break;
case 2: //建立联络
BuildConnect(UART2,UartSendBuf[UART2],RecData, UART_SEND);
break;
case 7: //读内存
ReadMemory(UartSendBuf[UART2],RecData,UART_SEND);
UartStartSend(UART2);
break;
case 8: //写内存
dwDstAddress = RecData[7]+(RecData[8]<<8)+(RecData[9]<<16)+(RecData[10]<<24);
dwLength = RecData[11]|(RecData[12]<<8);
memcpy((char *)dwDstAddress,(char *)&RecData[13],dwLength);
Uart2_SendCommOK(0x55);
break;
case 28: //go, 程序复位
goCommand(MAIN_ENTRY); // 强制跳转到目标地址
// 注: 要根据list文件中main_boot的入口地址进行赋值.
break;
case 29: //
Uart2_SendCommOK(0x55);
break;
case 30: //把程序搬到Norflash
dwLength = RecData[7]+(RecData[8]<<8)+(RecData[9]<<16)+(RecData[10]<<24);
j = (dwLength - 1)/NOR_FLASH_SECTOR_SIZE + 1; //擦除块数
if(connect == 1)
{
for( i=0; i<j; i++)
{
if( EraseSector(i) == FALSE )
return;
}
Writeflash((uchar *)DOWNLOAD_SDRAM_ADDR,0,dwLength);
Uart2_SendCommOK(0x55);
}
break;
case 255://卸去连接
connect = 0;
Uart2_SendCommOK(0x55);
break;
default:
break;
}//switch(SubCmd)
}//Uart2_CommProcess()
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数: 读内存.
// 描述: 读内存内容到发送数组单元.
//
// [参数表]
// sendData: 发送数据数组的始地址.
// RecData: 接收数据数组的始地址.
// sendType: 通信方式. 0-串口; 1-网络.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void ReadMemory (uchar *sendData,uchar *RecData, uchar sendType)
{
unsigned long dwDstAddress;
unsigned short dwLength;
dwDstAddress = RecData[7]+(RecData[8]<<8)+(RecData[9]<<16)+(RecData[10]<<24);
dwLength = RecData[11]|(RecData[12]<<8);
sendData[0] = 2;
sendData[1] = 12;
sendData[2] = RecData[5];
sendData[3] = RecData[4];
sendData[4] = RecData[3]; // 本机地址
sendData[5] = RecData[6]; // 子命令
sendData[6] = 0x55;
sendData[7] = RecData[7];
sendData[8] = RecData[8];
sendData[9] = RecData[9];
sendData[10] = RecData[10];
if(dwDstAddress < 0x400000)
{// 读Norflash数据, 此时必须要建立连接
if(connect == 1)
memcpy((char *)&sendData[11],(char *)dwDstAddress,dwLength);
}
else
memcpy((char *)&sendData[11],(char *)dwDstAddress,dwLength);
}//ReadMemory()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -