想实现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
}
不好意思中间少了段
想修改没法
我把中断部分添加上
只是接收用串口中断
void ser() interrupt 4
{
if(RI)
{
RI=0;
r_buf[count]=SBUF;
while(!RI);
RI=0;
count++;
if(count==INBUF_LEN)
{
flag=1;
}
}
}
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;
}
}
}
得定好协议,假设PC发过来的第一个字节表示后续长度那么接收的时候可以
只要没收到PC发来第一个字节所指定的数据长度就
while((!RI)&(i<3000))
{
i++;
}
我以前写的
参考一下
#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);
}
}
}