请教串口程序

kangling1983   2009-8-21 20:31 楼主
想实现PC发送很多字符串:一次接收8位,然后发送8位,在接收8位,再发送8位这样
可是写出来的程序,有时侯PC机能接收到8位,也不是发送(有点差别);有时候接收不到。
还有应该PC机发送一串字符,就应该接收到多少。

我正在学习这方面的,谢谢,帮帮忙!下面是我的程序:
#include
#include
#include

#define uchar unsigned char
#define uint unsigned int  
#define INBUF_LEN 8

uchar i,j,count;
bit flag;

uchar r_buf[INBUF_LEN];
uchar t_buf[INBUF_LEN];

void init();
void send_char_com(uchar ch);
void send_string_com(uchar *str,uint strlen);

main()
{
        flag=0;
        init();
        while(1)
        {
                if(flag==1)
                {
                        for(j=0;j                         {
                                t_buf[j]=r_buf[j];
                        }
                        send_string_com(t_buf,INBUF_LEN);
                }
        }
}

void init()
{
        TMOD=0x20;
        TH1=0xfd;
        TL1=0xfd;
        TR1=1;
        REN=1;
        SM0=0;
        SM1=1;
        EA=1;
        ES=1;
}

void send_char_com(uchar ch)
{
        SBUF=ch;
        while(!T1);       
        T1=0;
}

void send_string_com(uchar *str,uint strlen)
{
        uint k=0;
        do
        {
                send_char_com(*(str+k));
                k++;
        }while(k }


回复评论 (5)

不好意思中间少了段
想修改没法
我把中断部分添加上
只是接收用串口中断
void ser() interrupt 4
{
        if(RI)
        {
                RI=0;
                r_buf[count]=SBUF;
                while(!RI);
                RI=0;
                count++;
                if(count==INBUF_LEN)
                {
                        flag=1;
                }
        }
}
点赞  2009-8-21 20:49
void ser() interrupt 4
{
if(RI)
{
RI=0;
r_buf[count]=SBUF;
while(!RI); ///中断中不能等待,这样造成cpu一直在执行这一句,main程序将不能执行,直接去掉即可
RI=0; //这一句也去掉,去掉了这两句应该就可以了
count++;
if(count==INBUF_LEN)
{
flag=1;
}
}
}
点赞  2009-8-21 21:36
还是不行,不过还是谢谢!
点赞  2009-8-21 21:56
得定好协议,假设PC发过来的第一个字节表示后续长度那么接收的时候可以
只要没收到PC发来第一个字节所指定的数据长度就
while((!RI)&(i<3000))
{
i++;
}
点赞  2009-8-21 22:10
我以前写的
参考一下
#include
#include
#define INBUF_LEN 4//数据长度
//xdata unsigned char inbuf1[INBUF_LEN];
unsigned char inbuf1[INBUF_LEN]={0x23,0x45,0x26,0x57};
unsigned char checksum,count3;
bit read_flag= 0 ;
void init_serialcomm( void )
{
SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr  字串8
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);
}  
//字串2

//串口接收中断函数
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) //如果取数标志已置位,就将读到的数从串口发出
{  //字串4
read_flag= 0 ; //取数标志清0
send_string_com(inbuf1,INBUF_LEN);
}
}

}  
点赞  2009-8-22 14:24
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复