完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
我在用51控制摄像头拍照,定义了一个数组photo_buf[8000]为xdata类型,编译可以通过,但是按键发送读图像长度指令时,无法读出来:当我把 “uint8 xdata photo_buf[8000];//图像缓冲区”这句消隐了后,就可以,请问高手给看看是什么问题。。。是不是xdata使用的问题吖?
程序如下: #include typedef unsigned char uint8; typedef unsigned int uint32; #include #include #define RST 0x01 #define BEGIN 0x04 //仪表数据开始读 #define STOP 0x05 //仪表数据结束读 //unsigned char ch,tmp[]; bit TXflag=0; ***it K1=P3^1; ***it K2=P3^2; ***it LED=P0^0; ***it LED1=P0^1; ***it LED2=P0^2; ***it LED3=P0^3; ***it LED4=P0^4; ***it LED5=P0^5; ***it LED6=P0^6; ***it LED7=P0^7; uint32 photo_len=0;//图像的长度 uint8 xdata photo_buf[8000];//图像缓冲区 uint8 xdata table_dat[13]; uint8 xdata table_receive[16]; uint8 ReceiveLength=0; uint8 ReadMark=0;//读取串口数据记录的位置 uint8 DatLength=0;//数据长度标志 uint8 ReadFlag;//读串口标志 uint32 EndFlag=250; uint8 get_photo_cmd[]= {0x56,0x00,0x32,0x0C,0x00,0x0A, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0xFF//这个时间间隔要注意,应该设大一点,而不是设小一点,设小一点的话数据来得太快就容易出现接收错误 }; uint8 get_photo_rcv[]= { 0x76, 0x00, 0x32, 0x00, 0x00 }; uint8 read_len_cmd[]={0x56,0x00,0x34,0x01,0x00};//读长度命令 uint8 read_len_rcv[]={0x76,0x00,0x34,0x00,0x04,0x00,0x00};//读长度返回命令的前七个字节,返回命令的后两个字节为图像长度 void delay(unsigned char xms) { unsigned int i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } void init() { ReadFlag=RST; SCON=0x50; TMOD=0x20; PCON=0x80;// TH1=0xfd; //晶振11.0592MHZ,SMOD=1,波特率19200bps 如果晶振为22.1184NHZ时,波特率为38400 IE|=0x90; TR1=1; // } void send(unsigned char *buf,unsigned char n) { unsigned char i; ES=0; for(i=0;i SBUF=buf[i]; while(ti==0); TI=0; } ES=1; TXflag=1; } void ser() interrupt 4 { if(RI) { RI=0; table_receive[ReceiveLength]=SBUF; ReceiveLength=++ReceiveLength&0x1f; } } void receive_listtable(uint8 *table)//读串口缓存数据 { while(ReadMark!=ReceiveLength)//若缓存数据有变化,则进入 { table[DatLength]=table_receive[ReadMark]; table[DatLength+1]='n'; DatLength++; ReadMark=++ReadMark&0x1f; EndFlag=100; ReadFlag=BEGIN; } if(ReadFlag==BEGIN) { if(EndFlag==0) { DatLength=0; ReadFlag=STOP;//yizu数据读取结束 } else { EndFlag--; } } } void set_photo_len(uint8 length1,uint8 length2) { get_photo_cmd[12]=length1; get_photo_cmd[13]=length2; photo_len=length1*0x100+length2; LED4=0; } void main() { init(); while(1) { if(K2==0) { delay(10); if(K2==0) { send(read_len_cmd,5);//发读长度指令 LED=0; while(K2==0); } } delay(100); ES=0; receive_listtable(table_dat);// 返回读长度 if(ReadFlag==STOP) { LED1=0; ReadFlag=RST; delay(100); if((table_dat[0]!=0x76)||(table_dat[1]!=0x00)||(table_dat[2]!=0x34)||(table_dat[3]!=0x00)||(table_dat[4]!=0x04)||(table_dat[5]!=0x00)||(table_dat[6]!=0x00)) { LED2=0;//如果返回的指令不一致,LED2就亮,用来判断是否返回正确指令 return; } else if((table_dat[0]==0x76)&&(table_dat[1]==0x00)&&(table_dat[2]==0x34)&&(table_dat[3]==0x00)&&(table_dat[4]==0x04)&&(table_dat[5]==0x00)&&(table_dat[6]==0x00)) { LED2=1;//如果返回的指令一致,LED2就灭,LED3亮,用来判断是否返回正确指令 LED3=0; set_photo_len(table_dat[7],table_dat[8]);//设置读长度命令 delay(10000); LED3=1; } } ES=1; } } |
|
相关推荐 |
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
7 浏览 0 评论
26 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
13 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
644 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
1000 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11771 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 21:05 , Processed in 0.460601 second(s), Total 70, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号