void createFrame(UChar *buffer,UShort length)
{
UShort num;
UShort i,j;
MINISDH_MSG_STRUCT *msg_ptr;
if((frameCtrlData.tempNum+length)>=4000)
return;
memcpy(&frameCtrlData.tempFrame[frameCtrlData.tempNum],buffer,length);
frameCtrlData.tempNum+=length;
num=frameCtrlData.tempNum;
for(i=0;i<num;i++)
{
if(i<num-1&&frameCtrlData.New_Frame==0&&
frameCtrlData.tempFrame[i]==0x80&&frameCtrlData.tempFrame[i+1]==0x70)
{
frameCtrlData.W_Ptr=i;
frameCtrlData.L_Ptr=0;
frameCtrlData.New_Frame=1;
}
else if(i<num-1&&frameCtrlData.New_Frame==1&&
frameCtrlData.tempFrame[i]==0x80&&frameCtrlData.tempFrame[i+1]==0x70)
{
if((frameCtrlData.L_Ptr+1)>=7)
{
msg_ptr=(MINISDH_MSG_STRUCT*)(&frameCtrlData.tempFrame[frameCtrlData.W_Ptr]);
if((msg_ptr->len[0]*256+msg_ptr->len[1]+7)==(frameCtrlData.L_Ptr+1)
&&(msg_ptr->port_num[0]==KB_SDH_MINI))
{
/*SendLetterToMail(PID_NET_MAN,PID_SYSMAN,msg_ptr->msg_type,
msg_ptr->port_num,msg_ptr->len,msg_ptr->data);*/
processMiniSdhMsg(msg_ptr);
frameCtrlData.W_Ptr=i;
frameCtrlData.L_Ptr=0;
}
else if((msg_ptr->len[0]*256+msg_ptr->len[1]+7)>(frameCtrlData.L_Ptr+1))
{
frameCtrlData.L_Ptr++;
if(frameCtrlData.L_Ptr>=MAX_FRAME_LEN)
{
frameCtrlData.W_Ptr=i;
frameCtrlData.L_Ptr=0;
frameCtrlData.New_Frame=0;
}
}
else
{
frameCtrlData.W_Ptr=i;
frameCtrlData.L_Ptr=0;
}
}
else
{
frameCtrlData.W_Ptr=i;
frameCtrlData.L_Ptr=0;
}
}
else if(i<num-1&&frameCtrlData.New_Frame==1)
{
frameCtrlData.L_Ptr++;
if(frameCtrlData.L_Ptr>=MAX_FRAME_LEN)
{
frameCtrlData.W_Ptr=i;
frameCtrlData.L_Ptr=0;
frameCtrlData.New_Frame=0;
}
}
else if(i==num-1&&frameCtrlData.New_Frame==1)
{
frameCtrlData.L_Ptr++;
if(frameCtrlData.L_Ptr>=MAX_FRAME_LEN)
{
frameCtrlData.W_Ptr=0;
frameCtrlData.L_Ptr=0;
frameCtrlData.New_Frame=0;
frameCtrlData.tempNum=0;
break;
}
if((frameCtrlData.L_Ptr+1)>=7)
{
msg_ptr=(MINISDH_MSG_STRUCT*)(&frameCtrlData.tempFrame[frameCtrlData.W_Ptr]);
if((msg_ptr->len[0]*256+msg_ptr->len[1]+7)==(frameCtrlData.L_Ptr+1))
{
/*SendLetterToMail(PID_NET_MAN,PID_SYSMAN,msg_ptr->msg_type,
msg_ptr->port_num,msg_ptr->len,msg_ptr->data);*/
if(msg_ptr->port_num[0]==KB_SDH_MINI)
processMiniSdhMsg(msg_ptr);
frameCtrlData.tempNum=0;
}
else
{
memcpy(frameCtrlData.tempFrame,&frameCtrlData.tempFrame[frameCtrlData.W_Ptr],
frameCtrlData.L_Ptr+1);
frameCtrlData.tempNum=frameCtrlData.L_Ptr+1;
}
}
else
{
memcpy(frameCtrlData.tempFrame,&frameCtrlData.tempFrame[frameCtrlData.W_Ptr],
frameCtrlData.L_Ptr+1);
frameCtrlData.tempNum=frameCtrlData.L_Ptr+1;
}
frameCtrlData.W_Ptr=0;
frameCtrlData.L_Ptr=0;
frameCtrlData.New_Frame=0;
break;
}
else if(i==num-1&&frameCtrlData.New_Frame==0&&
frameCtrlData.tempFrame[i]==0x80)
{
frameCtrlData.tempFrame[0]=0x80;
frameCtrlData.tempNum=1;
frameCtrlData.W_Ptr=0;
frameCtrlData.L_Ptr=0;
frameCtrlData.New_Frame=0;
break;
}
else if(i==num-1&&frameCtrlData.New_Frame==0&&
frameCtrlData.tempFrame[i]!=0x80)
{
frameCtrlData.W_Ptr=0;
frameCtrlData.L_Ptr=0;
frameCtrlData.New_Frame=0;
frameCtrlData.tempNum=0;
break;
}
}
}这是我在VxWork端实现代码,但是也不理想,效率不高
{
UShort num;
UShort i,j;
MINISDH_MSG_STRUCT *msg_ptr;
if((frameCtrlData.tempNum+length)>=4000)
return;
memcpy(&frameCtrlData.tempFrame[frameCtrlData.tempNum],buffer,length);
frameCtrlData.tempNum+=length;
num=frameCtrlData.tempNum;
for(i=0;i<num;i++)
{
if(i<num-1&&frameCtrlData.New_Frame==0&&
frameCtrlData.tempFrame[i]==0x80&&frameCtrlData.tempFrame[i+1]==0x70)
{
frameCtrlData.W_Ptr=i;
frameCtrlData.L_Ptr=0;
frameCtrlData.New_Frame=1;
}
else if(i<num-1&&frameCtrlData.New_Frame==1&&
frameCtrlData.tempFrame[i]==0x80&&frameCtrlData.tempFrame[i+1]==0x70)
{
if((frameCtrlData.L_Ptr+1)>=7)
{
msg_ptr=(MINISDH_MSG_STRUCT*)(&frameCtrlData.tempFrame[frameCtrlData.W_Ptr]);
if((msg_ptr->len[0]*256+msg_ptr->len[1]+7)==(frameCtrlData.L_Ptr+1)
&&(msg_ptr->port_num[0]==KB_SDH_MINI))
{
/*SendLetterToMail(PID_NET_MAN,PID_SYSMAN,msg_ptr->msg_type,
msg_ptr->port_num,msg_ptr->len,msg_ptr->data);*/
processMiniSdhMsg(msg_ptr);
frameCtrlData.W_Ptr=i;
frameCtrlData.L_Ptr=0;
}
else if((msg_ptr->len[0]*256+msg_ptr->len[1]+7)>(frameCtrlData.L_Ptr+1))
{
frameCtrlData.L_Ptr++;
if(frameCtrlData.L_Ptr>=MAX_FRAME_LEN)
{
frameCtrlData.W_Ptr=i;
frameCtrlData.L_Ptr=0;
frameCtrlData.New_Frame=0;
}
}
else
{
frameCtrlData.W_Ptr=i;
frameCtrlData.L_Ptr=0;
}
}
else
{
frameCtrlData.W_Ptr=i;
frameCtrlData.L_Ptr=0;
}
}
else if(i<num-1&&frameCtrlData.New_Frame==1)
{
frameCtrlData.L_Ptr++;
if(frameCtrlData.L_Ptr>=MAX_FRAME_LEN)
{
frameCtrlData.W_Ptr=i;
frameCtrlData.L_Ptr=0;
frameCtrlData.New_Frame=0;
}
}
else if(i==num-1&&frameCtrlData.New_Frame==1)
{
frameCtrlData.L_Ptr++;
if(frameCtrlData.L_Ptr>=MAX_FRAME_LEN)
{
frameCtrlData.W_Ptr=0;
frameCtrlData.L_Ptr=0;
frameCtrlData.New_Frame=0;
frameCtrlData.tempNum=0;
break;
}
if((frameCtrlData.L_Ptr+1)>=7)
{
msg_ptr=(MINISDH_MSG_STRUCT*)(&frameCtrlData.tempFrame[frameCtrlData.W_Ptr]);
if((msg_ptr->len[0]*256+msg_ptr->len[1]+7)==(frameCtrlData.L_Ptr+1))
{
/*SendLetterToMail(PID_NET_MAN,PID_SYSMAN,msg_ptr->msg_type,
msg_ptr->port_num,msg_ptr->len,msg_ptr->data);*/
if(msg_ptr->port_num[0]==KB_SDH_MINI)
processMiniSdhMsg(msg_ptr);
frameCtrlData.tempNum=0;
}
else
{
memcpy(frameCtrlData.tempFrame,&frameCtrlData.tempFrame[frameCtrlData.W_Ptr],
frameCtrlData.L_Ptr+1);
frameCtrlData.tempNum=frameCtrlData.L_Ptr+1;
}
}
else
{
memcpy(frameCtrlData.tempFrame,&frameCtrlData.tempFrame[frameCtrlData.W_Ptr],
frameCtrlData.L_Ptr+1);
frameCtrlData.tempNum=frameCtrlData.L_Ptr+1;
}
frameCtrlData.W_Ptr=0;
frameCtrlData.L_Ptr=0;
frameCtrlData.New_Frame=0;
break;
}
else if(i==num-1&&frameCtrlData.New_Frame==0&&
frameCtrlData.tempFrame[i]==0x80)
{
frameCtrlData.tempFrame[0]=0x80;
frameCtrlData.tempNum=1;
frameCtrlData.W_Ptr=0;
frameCtrlData.L_Ptr=0;
frameCtrlData.New_Frame=0;
break;
}
else if(i==num-1&&frameCtrlData.New_Frame==0&&
frameCtrlData.tempFrame[i]!=0x80)
{
frameCtrlData.W_Ptr=0;
frameCtrlData.L_Ptr=0;
frameCtrlData.New_Frame=0;
frameCtrlData.tempNum=0;
break;
}
}
}这是我在VxWork端实现代码,但是也不理想,效率不高
解决方案 »
- 请大家分析下面的代码 !<清华大学 许斌 讲师的教程 >
- 捕获异常问题
- java.library.path VS java.class.path
- 求助】如何确定两个CHOICE列表框的选择问题,急!!!
- 能否说说在dos下用appletviewer启动applet的方法
- 高手来提个醒:界面中一个Jtree已经创建完毕,当用户选取一个菜单项后,如何把重新添加一些节点。
- 关于通讯多线程的?
- 请问怎么在字符界面上输入一个LONG,FLOAT等类型的数值给变量,有什么函数可以做到吗?
- 哪位高手,给一个 Applet 与 Servlet 通过Http通道进行信息交互的例子
- 高手看一下下面的错误,怎么搞定?
- 一个关于线程的简单问题(急)
- socket发送问题
int li_start =0;
int li_end =0;
int li_CommandLength =0;
int index=0;
for(int i=2 ;i<count;i++){
byte a1=indata[i];
byte a0=indata[i-1];
boolean b0=(i ==count-1) || (a1 == Command.PID_NET_MAN && a0 ==Command.PID_SYSMAN );
if(b0){
boolean b1=(i ==count-1) && !(a1 == Command.PID_NET_MAN && a0 ==Command.PID_SYSMAN );
if(i == count-1 && b1)
li_end = i;
else
li_end = i - 2;
li_CommandLength = li_end - li_start+1;
byte[] OneCommandArray=new byte[li_CommandLength];
for(int j = 0 ;j< li_CommandLength;j++){
OneCommandArray[j] = indata[li_start];
li_start = li_start + 1;
}
li_start = li_end + 1;
createCommand(OneCommandArray,ip);
}
}
}
}这是我在JAVA端的实现,更不理想,如果data[]数据中有sender+receiver(指令头),指令就会被分为两条指令!
data[]的数据里也有可能有sender+receiver(指令头)的数据(概率不是很大),另外,数据缓冲的数据是很乱的,除了符合指令格式的数据之外,还有有很多无意义的乱码。问你几个基本问题:
1. 无意义的代码要不要处理??
如何判断无意义的代码?
是否只要是头两个字节内只要包含
public static final byte PID_NET_SENDER = -128 ; //网管
public static final byte PID_RECEIVE = 112 ; //主控程序
就认为是有效字节流?? 2. 会不会出现
sender 的信息里面 夹杂 receive 的信息?? 楼上说的没有错啊,可以使用 STREAM 啊!!
发现 send,或者 receive 后,
读指定的长度 byte 到 byte 数组中啊!--长度不是都发送过来了吗??
希望你能把处理的细节说的更清楚一些?