RS485串口通讯~
大家好~ 我又来了~这个程序也很简单,串口调试助手发给单片机,单片机再发回串口调试助手~那么接收区就应该是发送区的吧~
现在是用RS485传输了~计算机串口接了个RS232转485的转换器~ 然后单片机这边是通过75176芯片~~~
我写的程序这样的、、
#include<reg52.h>
sbit RandD=P3^5;
unsigned char flag,a;
void main()
{
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xfd;
TL1=0xfd;
TR1=1; //至此为设置波特率
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
RandD=0; //接收
while(1)
{
if(flag==1) //此时接收的数据在a中
{
ES=0; //关串口中断,防止发送中断再次进入中断函数
flag=0;
SBUF=a; //a中的数发送到发送缓冲器中
while(!TI); //TI为1时,继续~ 即发送完毕
TI=0;
ES=1;
RandD=0;
}
}
}
void ser() interrupt 4 //串口接收中断
{
RI=0; //软件清零
a=SBUF; //SBUF中接收到的数据赋给a
RandD=1;
flag=1;
}
那个RandD是使能,高电平发送,低电平接收~~~
问题出来了,串口调试助手里,16进制收发~~ 如果发01,收到81,发02,收到82~~发45,收到C5; 发7F,收到FF,比这大的数才收发正常~
这是什么原因呢? 不知道各位有没有碰到这样的情况~~ 我调试助手的波特率是9600~~~~ 我觉得加了0x80,说明最高位一直是1~~~ 但是为什么呢? 哪里要设置什么吗?help~~~ 看波特率设置对不 回复【2楼】amazing030
-----------------------------------------------------------------------
哥我太崇拜你了~ 真是amazing~~
刚还跑去问了个老师呢~ 他也这样说~~
我这12M的晶振,9600波特率有8%的误差~
最后我弄成2400波特率,0.06%误差,终于没问题了……
看来要用9600波特率,还是得换成11.0592晶振啊~~ 2400 和9600 还有个区别抗干扰性和传输距离 我也遇到相同的问题,我用的是M16 ,我是8M晶振,原来9600波特率,改成19200就好了 呵呵... 确实 MARK 这种一般都是波特率的问题. 用12M的晶振设9600就不准了,误差大,但用11.592M的,设9600就很准了!! 经验问题而已 厉害,一看就看出来了。。。。。膜拜下 经验来源于实践!!交流能够让我们少走弯路!!! 我也来拜下!学习了! mark过两天可能要做这个通信
页:
[1]