server.c
来自「LWIP在STM32裸机上的移植」· C语言 代码 · 共 826 行 · 第 1/2 页
C
826 行
while(((CAN2->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN2, &TxMessage);
}
if(InputAddr[1] != 0)
{
TxMessage.Data[0] = (AddVoltage[1][0]|(AddVoltage[1][1]<<1)|
(AddVoltage[1][2]<<2)|(AddVoltage[1][3]<<3))& 0x0F;
TxMessage.StdId = InputAddr[1];
while(((CAN2->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN2, &TxMessage);
}
if(InputAddr[2] != 0)
{
TxMessage.Data[0] = (AddVoltage[2][0]|(AddVoltage[2][1]<<1)|
(AddVoltage[2][2]<<2)|(AddVoltage[2][3]<<3))& 0x0F;
TxMessage.StdId = InputAddr[2];
while(((CAN2->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN2, &TxMessage);
}
if(InputAddr[3] != 0)
{
TxMessage.Data[0] = (AddVoltage[3][0]|(AddVoltage[3][1]<<1)|
(AddVoltage[3][2]<<2)|(AddVoltage[3][3]<<3))& 0x0F;
TxMessage.StdId = InputAddr[3];
while(((CAN2->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN2, &TxMessage);
}
if(InputAddr[4] != 0)
{
TxMessage.Data[0] = (AddVoltage[4][0]|(AddVoltage[4][1]<<1)|
(AddVoltage[4][2]<<2)|(AddVoltage[4][3]<<3))& 0x0F;
TxMessage.StdId = InputAddr[4];
while(((CAN2->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN2, &TxMessage);
}
//设置输出通道数据
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_STD;
TxMessage.DLC = 4;
if(OutputAddr[0] != 0)
{
for(j=0;j<4;j++)
TxMessage.Data[j] = OutputSet[j];
TxMessage.StdId = OutputAddr[0];
while(((CAN2->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN2, &TxMessage);
}
if(OutputAddr[1] != 0)
{
for(j=0;j<4;j++)
TxMessage.Data[j] = OutputSet[j+4];
TxMessage.StdId = OutputAddr[1];
while(((CAN2->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN2, &TxMessage);
}
if(OutputAddr[2] != 0)
{
for(j=0;j<4;j++)
TxMessage.Data[j] = OutputSet[j+8];
TxMessage.StdId = OutputAddr[2];
while(((CAN2->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN2, &TxMessage);
}
if(OutputAddr[3] != 0)
{
for(j=0;j<4;j++)
TxMessage.Data[j] = OutputSet[j+12];
TxMessage.StdId = OutputAddr[3];
while(((CAN2->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN2, &TxMessage);
}
if(OutputAddr[4] != 0)
{
for(j=0;j<4;j++)
TxMessage.Data[j] = OutputSet[j+16];
TxMessage.StdId = OutputAddr[4];
while(((CAN2->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN2, &TxMessage);
}
}
break;
case (0x79): //下载场景
switch(ScenNum)
{
case (0x01):
I2C_EE_BufferWrite(revdata,EEP_ScenNum1_Address,311);//场景一
break;
case (0x02):
I2C_EE_BufferWrite(revdata,EEP_ScenNum2_Address,311);//场景二
break;
case (0x03):
I2C_EE_BufferWrite(revdata,EEP_ScenNum3_Address,311);//场景三
break;
case (0x04):
I2C_EE_BufferWrite(revdata,EEP_ScenNum4_Address,311);//场景四
break;
default:
break;
}
//如果按下某个"场景"键时,刷新此场景(比如按下"场景"按键1时,刷新场景1)
if(ScenKeyBK)
{
u8 temp = 0;
temp = 1<<(ScenNum-1);
if(temp == (ScenKeyBK & 0x0F)) //刷新按下"场景"键的场景
{
SceneSetFlag = ScenKeyBK & 0x0F;
}
}
break;
case (0x74): //效果设置时测试(CAN2)
for(j=0;j<13;j++)
EffectTest[j] = revdata[j];
for(j=0;j<20;j++)
{
if(EffectAddr[j][0] == EffectTest[0])
{
EffectAddr[j][2] = 1; //[话筒输入地址,效果编号,是否测试]
break;
}
}
TxMessage.StdId = (((EffectTest[0]& 0xF0)<<4)|(EffectTest[0] & 0x0F))& 0x7FF;
printf("The EffectAddr = 0x%X\n",TxMessage.StdId);
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_STD;
TxMessage.DLC = 7;
TxMessage.Data[0] = 0x01; //帧编号(0x01)
for(j=1,k=1;j<6;j++)
{
TxMessage.Data[j] = EffectTest[k];
k += 2;
}
TxMessage.Data[6] = EffectTest[11];
while(((CAN2->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN2, &TxMessage);
TxMessage.Data[0] = 0x02; //帧编号(0x02)
for(j=1,k=2;j<6;j++)
{
TxMessage.Data[j] = EffectTest[k];
k += 2;
}
TxMessage.Data[6] = EffectTest[12];
while(((CAN2->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN2, &TxMessage);
break;
case (0x75): //效果设置数据保存
u=0;k=0;
for(j=0;j<48;j++)
{
EffectData[k][u] = revdata[j]; //4个效果,每个效果12字节数据
u++;
if(u%12==0)
{
k++;
u=0;
}
}
I2C_EE_PageWrite(revdata,EEP_EffectData_Address,48);
break;
case (0x7A): //停止效果测试,恢复原来效果(CAN2)
for(j=0;j<20;j++)
{
if(EffectAddr[j][2] == 1) //测试
{
printf("EffectAddr[%d][1] = %d\n",j,EffectAddr[j][1]); //以前设置的是哪一个效果
EffectAddr[j][2] = 0; //清空测试标记
TxMessage.StdId = (((EffectAddr[j][0] & 0xF0)<<4)|(EffectAddr[j][0] & 0x0F))& 0x7FF;
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_STD;
TxMessage.DLC = 7;
switch(EffectAddr[j][1])
{
case (0x01)://效果1
TxMessage.Data[0] = 0x01; //帧编号(0x01)
for(k=1,u=0;k<6;k++)
{
TxMessage.Data[k] = EffectData[0][u];
u += 2;
}
TxMessage.Data[6] = EffectData[0][10];
while(((CAN2->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN2, &TxMessage);
TxMessage.Data[0] = 0x02; //帧编号(0x02)
for(k=1,u=1;k<6;k++)
{
TxMessage.Data[k] = EffectData[0][u];
u += 2;
}
TxMessage.Data[6] = EffectData[0][11];
while(((CAN2->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN2, &TxMessage);
break;
case (0x02)://效果2
TxMessage.Data[0] = 0x01; //帧编号(0x01)
for(k=1,u=0;k<6;k++)
{
TxMessage.Data[k] = EffectData[1][u];
u += 2;
}
TxMessage.Data[6] = EffectData[1][10];
while(((CAN2->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN2, &TxMessage);
TxMessage.Data[0] = 0x02; //帧编号(0x02)
for(k=1,u=1;k<6;k++)
{
TxMessage.Data[k] = EffectData[1][u];
u += 2;
}
TxMessage.Data[6] = EffectData[1][11];
while(((CAN2->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN2, &TxMessage);
break;
case (0x03)://效果3
TxMessage.Data[0] = 0x01; //帧编号(0x01)
for(k=1,u=0;k<6;k++)
{
TxMessage.Data[k] = EffectData[2][u];
u += 2;
}
TxMessage.Data[6] = EffectData[2][10];
while(((CAN2->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN2, &TxMessage);
TxMessage.Data[0] = 0x02; //帧编号(0x02)
for(k=1,u=1;k<6;k++)
{
TxMessage.Data[k] = EffectData[2][u];
u += 2;
}
TxMessage.Data[6] = EffectData[2][11];
while(((CAN2->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN2, &TxMessage);
break;
case (0x04)://效果4
TxMessage.Data[0] = 0x01; //帧编号(0x01)
for(k=1,u=0;k<6;k++)
{
TxMessage.Data[k] = EffectData[3][u];
u += 2;
}
TxMessage.Data[6] = EffectData[3][10];
while(((CAN2->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN2, &TxMessage);
TxMessage.Data[0] = 0x02; //帧编号(0x02)
for(k=1,u=1;k<6;k++)
{
TxMessage.Data[k] = EffectData[3][u];
u += 2;
}
TxMessage.Data[6] = EffectData[3][11];
while(((CAN2->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN2, &TxMessage);
break;
default: //未用效果
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_STD;
TxMessage.DLC = 1;
TxMessage.Data[0] = 0; //取消效果帧
while(((CAN2->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN2, &TxMessage);
break;
}
}
}
break;
case (0x76): //设置调音台时间
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_STD;
TxMessage.DLC = 3;
TxMessage.StdId = 0x02A;
for(j=0;j<3;j++)
TxMessage.Data[j] = revdata[j];
while(((CAN1->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN1, &TxMessage);
break;
case (0x77): //设置调音台IP地址
Cmd77_SetFlg = 1;
I2C_EE_PageWrite(revdata,EEP_IP_Address,len);
// NVIC_SystemReset();
break;
case (0x78): //设置调音台播出时间表
u = 0;
k = 0;
for(j=0;j<len;j++)
{
PlayTable[k][u] = revdata[j];
u++;
if(u%6 == 0)
{
k++;
u=0;
}
}
TabTotal = len;
I2C_EE_ByteWrite(len,EEP_Tablen_Address); //保存列表长度
I2C_EE_PageWrite(revdata,EEP_PlayTable_Address,len);//保持列表数据
break;
default:
break;
}
}
//处理返回值(指令0x72和0x79的返回值情况特殊)
if((ins == 0x72)&&(askdata[2] == 0xFA)&&(askdata[4] == 0xEE)) //应答正确
{
UDPData[0] = 0x55;
UDPData[1] = 0x72;
UDPData[2] = 0x0F; //数据包长度为15
for(j=3;j<8;j++) //推子模块地址:01 - 05
{
if(TuiziAddr[j-3] != 0)
UDPData[j] = j-2;
else
UDPData[j] = 0xFF;
}
for(j=8;j<13;j++) //输入模块数据:01 - 03(表示信号类型)
{
if(InputAddr[j-8] !=0)
UDPData[j] = InputAddr[j-8] & 0x0F;
else
UDPData[j] = 0xFF;
}
for(j=13;j<18;j++) //输出模块数据:04 - 05(表示信号类型)
{
if(OutputAddr[j-13] != 0)
UDPData[j] = OutputAddr[j-13] & 0x0F;
else
UDPData[j] = 0xFF;
}
// printf("\nUDPData = ");
check = 0;
for(j=0;j<18;j++){
check += UDPData[j];
// printf("0x%X ",UDPData[j]);
}
UDPData[18] = check;
UDPData[19] = 0xEE;
// printf("0x%X ",UDPData[18]);
// printf("0x%X \n\n",UDPData[19]);
p->payload = (void *)UDPData; //发送字符串地址
p->len = sizeof(UDPData); //发送字符串长度(len和tot_len的值都必须改变)
p->tot_len = sizeof(UDPData);
}
else
{
p->payload = (void *)UDPAsk; //发送字符串地址
p->len = sizeof(UDPAsk); //发送字符串长度(len和tot_len的值都必须改变)
p->tot_len = sizeof(UDPAsk);
// p->payload = (void *)askdata; //发送字符串地址
// p->len = sizeof(askdata); //发送字符串长度(len和tot_len的值都必须改变)
// p->tot_len = sizeof(askdata);
}
/* Connect to the remote client */
udp_connect(upcb, addr, port);
/* Tell the client that we have accepted it */
udp_send(upcb, p);
/* free the UDP connection, so we can accept new clients */
udp_disconnect(upcb);
/* Bind the upcb to IP_ADDR_ANY address and the UDP_PORT port*/
/* Be ready to get a new request from another client */
// udp_bind(upcb, IP_ADDR_ANY, UDP_SERVER_PORT);
/* Set a receive callback for the upcb */
// udp_recv(upcb, udp_server_callback, NULL);
/* Free the p buffer */
pbuf_free(p);
//*** 设置系统IP地址后,重启 ***//
if((ins == 0x77)&&(Cmd77_SetFlg == 1))
{
// Cmd77_SetFlg = 1;
I2C_EE_ByteWrite(Cmd77_SetFlg,EEP_Cmd77_Address);
for(j=0;j<5;j++) //保存推子模块地址
{
I2C_EE_WordWrite(TuiziAddr[j],EEP_Tuizi_Address + 2*j);
}
for(j=0;j<5;j++) //保存输入板卡地址
{
I2C_EE_WordWrite(InputAddr[j],EEP_Input_Address + 2*j);
}
for(j=0;j<5;j++) //保存输出板卡地址
{
I2C_EE_WordWrite(OutputAddr[j],EEP_Output_Address + 2*j);
}
NVIC_SystemReset();
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?