|
通讯协议要求如下:
通讯内容 方向(双向) 长度 类型 协议 校验和
PC机设置 PC机 =主板 S' 每条设置协议之前都下传’S',并收到主板回传'S'后才可以下传一条协议。 校验和
PC机回读 PC机 = 主板 T' 每条设置协议之前都下传‘T',并收到主板回传'T'后才可以接收一条回读协议。 校验和
说明:
1.板子收到‘T’,代表要向U盘写数据
2.板子收到‘S’,代表要从U盘读数据
代码如下:
前提是已经识别U盘了;
[code]
//主要处理部分函数如下
void CommPc(void)
{
UINT8 xdata cType=0;
RI=0;
while(!GetCommSomeChar2(&cType,1));
if((cType=='S')||(cType=='T'))
{
SendCommBuffer2(&cType,1);
if(cType=='S')
{
SendLoopInfo(); // 读出U盘中的数据 发到串口
}
else if(cType=='T')
{
Receiveloop(); //向U盘中写数据
}
else
printf("error");
}
else
CH375_led=1;
mDelaymS( 100 ); /* 延时1秒 */
CH375_led=0; /* 闪下灯 */
mDelaymS( 100 ); /* 延时1秒 */
CH375_led=1;
}
//向U盘中写数据
void Receiveloop(void)
{
UINT8 i;
strcpy( mCmdParam.Create.mPathName, "/TT" ); /* 目录名,该目录建在根目录下 */
i = CreateDirectory( ); /* 新建或者打开目录 */
mStopIfError( i );
if(WriteFile("/TT/LOOP.BIN"))
{
revcommdata();
}
}
//写函数
void revcommdata()
{
UINT8 xdata cTuition='T';
UINT8 cTemp,i;
UINT8 FIRST=1;
UINT32 totalsum= 0;
while(1)
{
RI = 0 ;
SendCommBuffer2(&cTuition,1);
while(!GetCommSomeChar2(&cTemp,1));
if(cTemp=='T')
{
GetCommSomeChar2(bao,1);
RI=1;
GetCommSomeChar2(bao,bao[0]+1);
if(bao[1]=='j') //bao[1]='j' 代表当前包写结束
{
bao[0] = totalsum>>24;
bao[1] = totalsum>>16;
bao[2] = totalsum>>8;
bao[3] = totalsum;
mCmdParam.ByteLocate.mByteOffset = 0; //将文件指针移到文件开头处
i = CH375ByteLocate( );
mCmdParam.ByteWrite.mByteCount=4 ; //规定每次读写的字节数
for ( i=0; i<4; i++ )
{
mCmdParam.ByteWrite.mByteBuffer = bao;
}
CH375ByteWrite( );
mCmdParam.ByteWrite.mByteCount=0; //文件长度更新
CH375ByteWrite( );
mCmdParam.Close.mUpdateLen = 1;
i = CH375FileClose( );
mStopIfError( i );
return ;
}
else
{
if(FIRST==1)
{
mCmdParam.ByteWrite.mByteCount=8 ;
for ( i=0; i<8; i++ )
{
mCmdParam.ByteWrite.mByteBuffer = datastr;
}
CH375ByteWrite( );
mStopIfError(i);
mCmdParam.Close.mUpdateLen = 1;
FIRST=0;
}
mCmdParam.ByteWrite.mByteCount=bao[0]+1;
for ( i=0; i
{
mCmdParam.ByteWrite.mByteBuffer =bao;
}
totalsum++;
CH375ByteWrite( );
mCmdParam.ByteWrite.mByteCount = 0;
CH375ByteWrite( );
mDelaymS( 100 );
cTemp='U'; //‘U’为当前包结束标志
SendCommBuffer2(&cTemp,1);
mDelaymS(500);
}
}
}
}
================================
//串口中断函数
/* 中断处理函数 ,问题出现在这里,麻烦您帮我看下,谢谢 */
void CommISR(void) interrupt 4
{
if (SCON &0x01)
{
SCON &=0xfe;
bao[CommRecBufferTail]=SBUF; //receive data
if((bao[CommRecBufferTail]=='T')||(bao[CommRecBufferTail]=='S'))
{
SendCommBuffer2(&bao[CommRecBufferTail],1);
if(bao[CommRecBufferTail]=='S')
{
SendLoopInfo(); // 读出U盘中的数据 发到串口
}
else if(bao[CommRecBufferTail]=='T')
{
Receiveloop();
}
else
printf("error");
}
else
{
CH375_led=1;
mDelaymS( 10 ); /* 延时1秒 */
CH375_led=0;
mDelaymS( 10 ); /* 延时1秒 */
CH375_led=1;
}
[code]}
==================================
上面是我写的查询方式,现在由于时序有点对不上,所以需要改成中断方式的串口中断,上面还有个是我写的一个串口中断函数,写不下去了
没思路了,呵呵,高手帮帮忙,提供点思路,或给个例子都行,谢谢
新手,没用过中断,呵呵,谢谢
PS:分不够,可以再加
|
|