导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→串口中断的困惑[linkaimu]

 *第18147篇: 串口中断的困惑

  
楼 主:linkaimu 2003年12月19日12:28
 串口中断的困惑
我在写PC发送给单片机的控制程序,发现一个一个字符发送可以,整串发送就收不到。具体程序如下
unsigned char inbuf1[INBUF_LEN];
unsigned char checksum,count3;
bit           read_flag=0;

void init_serialcomm(void)
{
    SCON  = 0x50;       //SCON: serail mode 1, 8-bit UART, enable ucvr 
    TMOD |= 0x20;       //TMOD: timer 1, mode 2, 8-bit reload 
    PCON |= 0x80;       //SMOD=1; 
    TH1   = 0xF4;       //Baud:4800  fosc=11.0592MHz 
    IE   |= 0x90;       //Enable Serial Interrupt 
    TR1   = 1;          // timer 1 run 
   // TI=1; 
}

//向串口发送一个字符 
void send_char_com(unsigned char ch)  
{
    SBUF=ch;
    while(TI==0);
    TI=0;
}

//向串口发送一个字符串,strlen为该字符串长度 
void send_string_com(unsigned char *str,unsigned int strlen)
{
    unsigned int k=0;
    do 
    {
        send_char_com(*(str + k));
        k++;
    } while(k   < strlen);
}


//串口接收中断函数 
void serial () interrupt 4 using 3 
{
    if(RI)
    {
        unsigned char ch;
        RI = 0;
        ch=SBUF;
        if(ch>  127)
        {
             count3=0;
             inbuf1[count3]=ch;
             checksum= ch-128;
        }
        else 
        {
             count3++;
             inbuf1[count3]=ch;
             checksum ^= ch;
             if( (count3==(INBUF_LEN-1)) && (!checksum) )
             {
                 read_flag=1;  //如果串口接收的数据达到INBUF_LEN个,且校验没错, 
                               //就置位取数标志 
             }
        }
    }
}


main()
{
    init_serialcomm();  //初始化串口 
    while(1)
    {
          if(read_flag)  //如果取数标志已置位,就将读到的数从串口发出 
          {
               read_flag=0; //取数标志清0 
               send_string_com(inbuf1,INBUF_LEN);
          }
    }

}
请问是为什么?

  
2楼:红心j 2003年12月19日18:58
 如果通信速率较快,单片机来不及处理数据,
如果通信速率较快,单片机来不及处理数据,会造成数据被覆盖(丢失)。
建议:
(1)降低波特率或提高单片机时钟频率
(2)发送时数据之间加延时
  
3楼:guest 2003年12月22日11:45
 4800bps不算高了,应该没问题。

4800bps不算高了,应该没问题。
请将情况说详细一点
  
4楼:wfy74 2003年12月22日15:35
 发送产生中断怎么办?
  
5楼:linkaimu 2004年1月5日16:15
 用的是11.0592M的晶振。头大
用的是11.0592M的晶振。头大
  
6楼:guest 2004年1月5日17:35
 时间延时即可
时间延时即可
  
7楼:rou_wexx 2004年1月5日21:05
 你不清掉你的TI,发送中短你怎么准备发送
你不清掉你的ti,发送中短你怎么准备发送和接收的,标志位需要软件清'0',

>>>>>>对该主题发表你的看法

本主题贴数7,分页: [第1页]


[上一篇主题]:请问用C如何对AT89S8252的E2PROM的双八位地址指针进行间接寻址?

[下一篇主题]:请教keil c 程序代码压缩方法和程序优化分析相关的工具软件[求助]