2155|5

78

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教串口程序 [复制链接]

想实现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 }


最新回复

我以前写的 参考一下 #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
点赞 关注

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
不好意思中间少了段
想修改没法
我把中断部分添加上
只是接收用串口中断
void ser() interrupt 4
{
        if(RI)
        {
                RI=0;
                r_buf[count]=SBUF;
                while(!RI);
                RI=0;
                count++;
                if(count==INBUF_LEN)
                {
                        flag=1;
                }
        }
}
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
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;
}
}
}
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 
还是不行,不过还是谢谢!
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

5
 
得定好协议,假设PC发过来的第一个字节表示后续长度那么接收的时候可以
只要没收到PC发来第一个字节所指定的数据长度就
while((!RI)&(i<3000))
{
i++;
}
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

6
 
我以前写的
参考一下
#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);
}
}

}  
 
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表