完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
关于串口多字节通信,这个是2个字节的,只能读到前面的,按快的有时候会只读到后面的。。求原因啊
#include #define uchar unsigned char #define uint unsigned int ***it wela=P2^3; ***it dula=P2^2; uchar num,flag,a,j=0; uint temp=0; uchar r_table[2]; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar code w_table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; void display(uchar num1); void delay(uchar x) { uint i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } void init() { TMOD=0x20; TH1=0xfd; TL1=0xfd; TR1=1; SM0=0; SM1=1; REN=1; EA=1; ES=1; } void main() { init(); //RI=1; while(1) { if(flag==1) { ES=0; temp=0; for(j=0;j<2;j++) { SBUF=r_table[j]; //ti=1; while(!TI); TI=0; } j=0; ES=1; flag=0; } display(a); } } void display(uchar num1) { dula=1; P0=table[num1/4096]; dula=0; P0=0xff; wela=1; P0=w_table[0]; wela=0; delay(2); dula=1; P0=table[num1%4096/256]; dula=0; P0=0xff; wela=1; P0=w_table[1]; wela=0; delay(2); dula=1; P0=table[num1%16/16]; dula=0; P0=0xff; wela=1; P0=w_table[2]; wela=0; delay(2); dula=1; P0=table[num1%16]; dula=0; P0=0xff; wela=1; P0=w_table[3]; wela=0; delay(2); } void sc() interrupt 4 { RI=0; for(j=0;j<2;j++) { r_table[j]=SBUF; } flag=1; /* a=SBUF; temp++; a=a*256+SBUF; flag=1;*/ } |
|
相关推荐
15个回答
|
|
接收数据的时候用的是中断,每次中断发生,只能是接收到一个字节的数据,不应该在中断中做循环去接受数据,这样的话,只能接收到一个字节的数据。多字节数据传输要进行校验,做成一个packet,接收到这个packet后去做处理.
|
|
|
|
如何做一个packet,我想要51单片机发送一个大于255的数值。
|
|
|
|
Golf_research 发表于 2015-6-5 17:48 怎么做一个packet,我想用51单片机发一个大于255的数值。 |
|
|
|
51单片机如何发送多字节
|
|
|
|
那就是多字节传输,如果不进行数据的校验,那就是和单字节传输一样的。如果叫校验,自己可以定协议,比如自己定义开始位是0x99,那设备接收到0x99就知道是数据传送开始了,这是个简单的比喻,具体的情况具体以分析,比如0x99不能和数据位重合,要不然就会乱掉,总之数据传输的协议你可以自己设定。 |
|
|
|
假如你定义的数据包是3个字节,第一个字节是开始位,第二个字节是数据位,最后一个字节是结束位,那就三个自己给外设或者单片机,不要在一次中断中做循环去读写数据,因为发送一个字节才产生一次中断,就是说一次中断就是只能发送或者接受一个字节的数据,这就是楼主代码遇到的问题,希望能帮到你! |
|
|
|
Golf_research 发表于 2015-7-2 09:16 void main() { UART_init(); //串口初始化 // while(1); ds_change(); delay(1000); while(1) { display(get_temperature()); ds_change(); tmp1 = get_temperature(); tx_buf[0]=0xff; tx_buf[1]=0xee; SBUF = tx_buf; 以上是下位机主函数,接收的数据是tx_buf[0]tx_buf[1]都是10 以下是上位机 vs2012 if(m_comm.get_CommEvent() == 2) { int str = 0; long i = 0; COleSafeArray SafeArray = m_comm.get_Input(); //第一步 int iLen = SafeArray.GetOneDimSize(); //第二步 // int iLen1 = 3; BYTE revBuf[1024]; for(i = 0;i < iLen; i++) { SafeArray.GetElement(&i, revBuf + i); BYTE bt=*(char*)(revBuf+i); //字符型 |
|
|
|
|
|
|
|
|
|
|
|
SBUF = tx_buf;SBUF寄存器是八位的,你这样赋值不对,上位机接受的数据不会变,tx_buf++或者tx_buf,你先试一下吧 |
|
|
|
Golf_research 发表于 2015-7-2 10:32 tx_buf[0]=0xff; delay(1000); tx_buf[1]=0xee; SBUF = tx_buf; 我要发送这样的两个数据,tx_buf该怎么定义 |
|
|
|
tx_buf[0]和tx_buf[1]分别发送是可以的, |
|
|
|
恩,就这样,SBUF = tx_buf,做个循环,两个字节之间作延迟。你用的什么温度传感器?DS18B20? |
|
|
|
ds_change(); // display(get_temperature()); // ds_change(); // delay(1000); tmpp = (get_temperature()); tx_buf[0]=(tmpp/10); tx_buf[1]=(tmpp%100%10); for( e=0;e<2;e++) { SBUF = tx_buf[e]; delay(1000); } 已经做了个循环,但是数据不对,get_temperature()返回值是准确的 |
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-TF卡烧录流程之烧写过程
1128 浏览 0 评论
1826 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-mfgtools烧录流程之烧写原理
1441 浏览 0 评论
请问SPH0641LU4H这款麦克风如何在不使用I2S的情况下,单纯通过GPIO来进行驱动且正常读取数据呢
1081 浏览 1 评论
642 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12106 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-4 18:56 , Processed in 0.704221 second(s), Total 70, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号