完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我用485模块,无线传输模块,单片机双机通讯都出现了这样的问题:就是发送多次数据,才能接收一次。有时候发送两次接收一次,有时候三次接收一次。一般出现这种情况是什么问题?请各位大神解答。谢谢
|
|
相关推荐
5个回答
|
|
很笼统的问题,怎么解答,只能猜了。查一查你的程序对不对
|
|
|
|
前辈,这是我的485程序 #include #define uchar unsigned char #define INBUF_LEN 5 //数据长度 unsigned char flag1=0; unsigned char buffer[INBUF_LEN]; unsigned char checksum,point; uchar bdata flag; ***it tx_ok= flag ^ 2; ***it RE_DE=P5^5; ***it P3_5=P3^5; ***it 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; } } |
|
|
|
单片机和通讯模块之间稳定性怎样?可以做个测试程序测一下稳定性。 如果怀疑通讯模块之间通讯问题,无线模块有没有带天线?如果没有带天线,通讯距离太短
|
|
|
|
一般是你设置的接收位数和波特率的问题
|
|
|
|
把波特率调小试试呗
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1605 浏览 0 评论
【每周推荐】采用11代Intel CPU,基于youyeetoo X1开发板搭建少儿AI智能STEAM积木平台
974 浏览 0 评论
3021 浏览 2 评论
【youyeetoo X1 windows 开发板体验】+ 影音处理和AI模型移植
2651 浏览 5 评论
I.MX6ULL-飞凌 ElfBoard ELF1板卡- 移植zbar的方法
1782 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
6403 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-5-8 17:42 , Processed in 0.825256 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号