关于串口通讯的收发问题
很笼统的问题,怎么解答,只能猜了。查一查你的程序对不对
前辈,这是我的485程序
#include <STC15F2K60S2.H>
#define uchar unsigned char
#define INBUF_LEN 5 //数据长度
unsigned char flag1=0;
unsigned char buffer[INBUF_LEN];
unsigned char checksum,point;
uchar bdata flag;
sbit tx_ok= flag ^ 2;
sbit RE_DE=P5^5;
sbit P3_5=P3^5;
sbit P3_4=P3^4;
bit read_flag= 0 ;
void delay(unsigned char n)
{
unsigned char i,j;
for(i=n;i>0;i--)
for(j=110;j>0;j--)
{
}
}
//发送单字符
void send_char_com( unsigned char ch)
{
tx_ok=0;
RE_DE=1;//开发送
TI=0;
SBUF=ch;
while(!tx_ok); //等待发送完成
delay(5);
RE_DE=0;
delay(2);
}
//向串口发送一个字符串,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 SerialIni(){
//SCON &= 0x2E; //先对需要设置的位进行清零 0010 1110 因为SCON所有位都是用于设置串行口1,所以这句可省略。
SCON = 0x50; /* SM0/FE | SM1 | SM2 | REN | TB8 | RB8 | TI | RI 设置串行口的工作方式1(SM0 SM1 0 1)即8位可变波特率方式;允许接收)*/
AUXR &= 0xBE; //先对需要设置的位进行清零 1011 1110
AUXR |= 0x00; /* T0x12 | T1x12 | UART_M0x6 | T2R | T2_C/T(T上画) | T2x12 | EXTRAM | S1ST2 定时器1时钟为Focs/12,即12T;串口1选择定时器1为波特率发生器。S1ST2:串行口1波特率发生器选择位。0:选择定时器1作为串行口1波特率发生器。 1:选择定时器2作为串行口1的波特率发生器,此时定时器1得到释放,可以作为独立的定时器使用。*/
TMOD &= 0x0F; //先清零定时器1的设置(高4位设置定时器1,低4位设置定时器0)
TMOD |= 0x20; /* GATE | C/T(T上画) | M1 | M0 | GATE | C/T(T上画) | M1 | M0 (定时器工作方式2)使用定时器1作为波特率发生器。*/
TH1 = 0xfd; //8位自动重装方式,TH1用于重置TL1初值。2的SMOD次方/32*(定时器1的溢出率或定时器2的溢出率)
TL1 = 0xfd; //晶振11.0592MHz,设置波特率为9600bps。SMOD属于PCON寄存器,为1时,波特率翻倍。
TR1=1; //定时器1启动
ES = 1; //开放串口中断
EA = 1; //开放CPU中断
}
void COM_send(void)
{
uchar i;
delay(1);
RE_DE=1;
delay(10);
for(i=1;i<9;i++)
{
TI=0;
tx_ok=0;
SBUF =buffer;
while(!tx_ok);
}
TI=0;
delay(5);
RE_DE=0;
delay(2);
}
//主程序
void main(void)
{
RE_DE=0; //开接收
SerialIni(); //运行串口初始化函数
RE_DE=0;
delay(1);
P3_4=1;
while(1)
{
if(read_flag==1)
{
send_string_com(buffer,INBUF_LEN);
read_flag=0;
}
}
} //等待中断()
//中断函数
void Uart2(void) interrupt 4 using 1
{ unsigned char mydata;
if(RI) //如果是接收中断
{
RI=0;
mydata = SBUF; //将接收缓冲区的数据保存到mydata变量中
if( point==0 )
{
if(mydata==0x55)
{
buffer[point++]= mydata;}
else
{point=0; }
}
else
if(point>0&&point<4)
{ buffer[point++]= mydata; }
else
{
if (point==4)
{
if(mydata==0x11)
{
buffer[point]=mydata;
read_flag= 1 ;
}
else
point=0;
}
else
point=0;
}
}
// if (buffer[point] ==0x11)
// {
// read_flag= 1 ; //如果串口接收的数据达到INBUF_LEN个,且校验没错,
//就置位取数标志
// }
// }
// }
if(TI) //如果是发送中断,将TI清0
{
TI = 0;
tx_ok=1;
}
}
单片机和通讯模块之间稳定性怎样?可以做个测试程序测一下稳定性。 如果怀疑通讯模块之间通讯问题,无线模块有没有带天线?如果没有带天线,通讯距离太短
一般是你设置的接收位数和波特率的问题
把波特率调小试试呗
