首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

我的中断发送的程序,请教

我的中断发送的程序,请教

void CommPutChar( char *cm){
    static unsigned char j=0;
    DisableInterrupts;       //关中断
      if(SCI0SR1_TDRE) {
        SCI0DRL=*(cm)++;
        j++;
        if(j==1){
         SCI0CR2=0x80;    //允许tx中断
        }
   
      }
    j=0;
    EnableInterrupts;    //开中断
   }
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt 20 void  SCI0_ISR(void){
  static unsigned char i=0;
  static unsigned char s=0;
  unsigned char rc;
  if(SCI0SR1_TDRE) {        //允许发送中断吗
    SCI0DRL=?;
    }
   else SCI0CR2=0x0C;    //关tx中断
  }
}
void main()
{
CommPutChar("123");
}
我想实现中断发送,可是中断里面的?不知道怎么实现。应该怎么做呢
什么芯片?
海纳百川  有容乃大
MC9SDT128
什么叫不知道怎么实现?就直接置数就可以了。
海纳百川  有容乃大
发送的思路应该是:先发送第一个字符,然后允许中断,进入ISR,if Tx缓冲寄存器是空,则发送下一个字符,这时候就是我不明白的问题,我这里下一个字符是'2',我不可能直接把‘2’置数给SCI0DRL吧,如果定义一个数组,把“123”全部放进去再依次付给SCI0DRL,这样个数组就只能是全局的,我现在就是不知道怎么办
为什么不能直接把“2”置数给SCI0DRL呢?程序必须知道每次中断进去后,该发哪个数了。
海纳百川  有容乃大
我觉得这不是一个好办法,因为每次发的字符不一定相同。所以,我开了一个缓冲区。
中断发送每发一个字符都要加一个延时才可以把下一个字符发送出去,否则发的字符就不全,这是什么原因
有没有用示波器监测过,是发的不全呢,还是收的不全?
海纳百川  有容乃大
我判断是发送不全,因为我想把字符串一起发出去。可能发送一个字符比较慢,我用的是9600,那么发一个字符要大约1ms,但是单片机运行的比较快,所以当下一个字符来的时候,上一个字符还没有发送完成,我想问题可能在这里。
    还有就是想问一下,一般是发一个字符就产生一次中断,还是一次中断把一个字符串一起发出去。
发送中断一般分2种,一个是发送锁存器空中断,一个是发送完成中断,他们是不一样的,你要仔细看一下。
海纳百川  有容乃大
谢谢chen sir,我的程序已经可以运行了。多谢你每次有问必答
返回列表