完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
|
可能是波特率不对。
另外,在给SBUF赋值后也不能立即通过if(TI == 1)判断是否发送完毕。串口发送一个字节数据需要的时间相对来说挺长的,少说也能执行几十个if(TI == 1),应该用while(TI == 0);或者while(!TI);等待发送完成,然后再用TI = 0清除标志位。 |
|
|
|
你这个是程序波特率设置不对吧
|
|
|
|
要么波特率不对,要么就是哪边设置不对
|
|
|
|
本帖最后由 haiwon 于 2016-8-15 10:15 编辑
#include #include #define uchar unsigned char #define uint unsigned int void Delay(uint j) { uint i; for(;j>0;j--) { for(i=0;i<27;i++); } } void main () { TMOD = 0x20; // TH1 = 253; // 赋初值 TL1 = 253; TR1 = 1; // 开始计时 SCON = 0x50; //工作方式1,9600bps while(1) { SBUF=5; while(TI==0) ; TI=0 ; Delay(10000); } } 把if(TI==0)改用while(TI==0)之后,收到的数据还是多了一个“8”,不知道是什么情况@keil-uvision4 |
|
|
|
|
|
|
|
需要数值转换。。。。
|
|
|
|
|
|
|
|
我把串口助手的接收位改成7位的时候,收到的是我赋给SBUF的值05,但是方式1的数据位是8位啊,按8位接收总是不对 |
|
|
|
本帖最后由 haiwon 于 2016-8-15 21:26 编辑 我把串口助手的接收位改成7位的时候,收到的是我赋给SBUF的值05,但是方式1的数据位是8位啊,按8位接收总是不对 |
|
|
|
本帖最后由 haiwon 于 2016-8-15 21:28 编辑
波特率设置的是9600,串口助手也是9600 |
|
|
|
|
|
|
|
改成十六进制的AB后输出的是“EB”,用的就是下面的程序,有时间了帮忙检验一下吧~老是不对 #include #define uint unsigned int void Delay(uint j) { uint i; for(;j>0;j--) { for(i=0;i<27;i++); } } void init() { TMOD = 0x20; //定时器T1使用工作方式2 SCON = 0x50; //工作方式1,允许接收 TH1 = 0xfd; // 设置初值,波特率9600bps TL1 = 0xfd; PCON=0x00; TR1 = 1; // 开始计时 //SM0=0; //SM1=1; //REN=1; EA=1; ES=1; } void main() { init(); while(1) { SBUF=0xab; while(!TI); ES=0; Delay(5000); Delay(5000); TI=0; ES=1; } } |
|
|
|
haiwon 发表于 2016-8-16 19:49 没有用中断程序,就简单地发数据,不接收 |
|
|
|
|
|
|
|
|
|
|
|
haiwon 发表于 2016-8-16 19:49 #include unsigned char Serial_data; //串口数据(Serial_data)用这个来保存。 static unsigned char Into=0; void Init_Serialport1() //初始化串口1(Serial port) { TMOD=TMOD&0x0F; TMOD=0x20; TH1=0xFD; TL1=0xFD; TR1=1; SCON=SCON&0x0F; SCON=0x50; EA=1; ES=1; } void main() { Init_Serialport1(); while(1) { if(Into==1) { unsigned char i; ES=0; for(i=0;i<14;i++) { unsigned char code table[]="我会为你奋斗LQ"; SBUF=table; while(TI==0); //容易理解错误的地方:当数据发送完毕后“TI”会被硬件自动置“1”这里就是在执行如果“TI”没有被置1的话就一直循环在这里,当"TI"被置“1”后就会退出此语句 TI=0; //这里手动将"TI"清零。 } SBUF=Serial_data; while(TI==0); //容易理解错误的地方:当数据发送完毕后“TI”会被硬件自动置“1”这里就是在执行如果“TI”没有被置1的话就一直循环在这里,当"TI"被置“1”后就会退出此语句 TI=0; //这里手动将"TI"清零。 ES=1; Into=0; } } } void Serial_port1() interrupt 4 { RI=0; Serial_data=SBUF; Into=1; } |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
《DNESP32S3使用指南-IDF版_V1.6》第三十五章 摄像头实验
219 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第三十章 DHT11数字温湿度传感器
574 浏览 0 评论
684 浏览 0 评论
【敏矽微ME32G070开发板免费体验】之原厂2812测试例程解析
1074 浏览 0 评论
1073 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12048 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-27 20:19 , Processed in 1.002064 second(s), Total 101, Slave 84 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号