2964|3

66

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

查询与中断? [复制链接]

通讯协议要求如下:
通讯内容        方向(双向)        长度        类型        协议                                                                                   校验和
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:分不够,可以再加

最新回复

看来把我做过的CPU 上的 UART 程序都发出来 呵呵 本以为这个最基础了 呵呵 有空关注下我的 BLOG 呵呵, 我下周发   详情 回复 发表于 2007-12-1 18:52
点赞 关注

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
中断程序一般需要快速响应,服务程序中最好不要有延时等待之类的东东,否则下面再来中断可能丢失数据或中断重入。
一般串口中断只操作缓冲区,并设立标志,耗时的操作在主程序中做。
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
    mDelaymS(   10   );     /*   延时1秒   */
                                  CH375_led=0;   
                                  mDelaymS(   10   );     /*   延时1秒   */
                                  CH375_led=1;   


哥哥 我佩服您咯,这样delay?

为啥不用T0 ,R0 标志呢?

来了清下标志,以接下个,中断里delay  做什么?? 肯定不合适呀
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

4
 

看来把我做过的CPU 上的 UART 程序都发出来 呵呵
本以为这个最基础了 呵呵

有空关注下我的 BLOG 呵呵, 我下周发
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表