遇到奇怪的串口发送数组问题(在线等帮忙)
rx_date=0x01;rx_date=0x03;
rx_date=0x00;
rx_date=0x00;
rx_date=0x00;
rx_date=0x03;
SendByte(0x01);
SendByte(*rx_date);
SendByte(0x03);
SendByte(rx_date);
SendByte(0x00);
SendByte(rx_date);
SendByte(0x00);
SendByte(rx_date);
SendByte(0x00);
SendByte(rx_date);
SendByte(0x03);
SendByte(rx_date);
遇到奇怪的问题,数组定义为unsigned char 型,给数组赋值后,在用串口发送,结果电脑上串口调试助手接收到是值为 01 FC 03 FC 00 FC 00 FC 00 FC 03 FC ;是什么问题啊! SendByte 要看看你段的问题吧 HeP028 发表于 2014-2-24 09:42
SendByte 要看看你段的问题吧
看段的问题?不明白!void SendByte(unsigned char dat)
{
SBUF=dat; //发送数据
while(TI==0);//检查发送完成中断标志
TI=0;
} 像是把数组的地址发过去了? shuidiyu 发表于 2014-2-24 09:58
看段的问题?不明白!
你数组怎么定义的 去掉这句呢?SendByte(*rx_date); 或者SendByte(rx_date); ronic 发表于 2014-2-24 10:14
像是把数组的地址发过去了?
修改后程序 rx_count = 0;
rx_date=0x01;
some = rx_date;
rx_date=0x03;
rx_date=0x00;
rx_date=0x00;
rx_date=0x00;
rx_date=0x03;
SendByte(0x01);
SendByte(some);
some的为char类型,接收到的数据位0x01和0xfc,怎么给数组赋值没有成功呢? ronic 发表于 2014-2-24 10:14
像是把数组的地址发过去了?
rx_count = 0;
rx_date=0x01;
some = rx_date;
rx_date=0x03;
rx_date=0x00;
rx_date=0x00;
rx_date=0x00;
rx_date=0x03;
SendByte(0x01);
SendByte(some);
这样改了,还是不对,数组赋值就没有成功! HeP028 发表于 2014-2-24 10:30
去掉这句呢?SendByte(*rx_date); 或者SendByte(rx_date);
之前就用的sendbyte(【0】); 你把工程贴出来大家测试下呢? HeP028 发表于 2014-2-24 13:17
你把工程贴出来大家测试下呢?
#include <include.h>
#include <include.h>
bit LeftEnable;
bit RightEnable;
bit delay_control;
bit left_counter_enable;
bit right_counter_enable;
bit Disp_Enable=0;
bit Heat=0;
bit Temp_Rate_Cul;
bit heat_disp=0;
bit FreshEnable;
bit show_face16_enable;
//??????????????????????????
bit InputO2=0;
bit OutputO2=0;
bit MiniInputO2=0;
bit MiniOutputO2=0;
//??????????????????????????
int heat_value=0;
uint xdata AD_Temp_samp;
uint AD_value;
uint thermometer_resistance;
uint testcounter;
uint Press01Max,Press02Max;
uint Press01MaxTime,Press02MaxTime;
uint clock10ms;
uint Temp_samp,AD_Press_1,AD_Press_2,Press01,Press02;
uint Temp_Bias;
char name;
uchar result_number;
uchar test_no;
uchar thermometer_resistance_ii;
uchar dh,dl;
uchar temp_adj_enable_counter;
uchar delay_control_time;
uchar test_step=0xff;
uchar Work_State;
uchar Date; //读时间值
uchar rc_timer_en;
uchar clock1sec;
xdata float e_2,e_1,e;
xdata float lastOut=0.0;
uchar rx_count,Key_State,rx_date,Send_Buf,UART_Out={0x05,0x06,0x05,0x06,0x05,0x06};
uchar Out_data;
uchar Key_State;
void main(void)
{
// unsigned int i;
Initial();
// Alarm();
Read_Date(0);
// SendByte(0x05);
// SendByte(0x06);
// SendByte(0x07);
while(1){}
}
//****************************************************************************************************************
//初始化程序
//****************************************************************************************************************
void Initial(void)
{
charsome;
/*对AT89C51(11.059MHz)的串口初始化*/
TMOD=0x21; //定时器1设置为模式2
// PCON=PCON|0x80; //波特率加倍
PCON=PCON&0x7f;
SM0=0;
SM1=1; //设置串口为方式1,10位异步收发
TL1=0xFD;
TH1=0xFD; //波特率为19200
TR1=1; //启动定时器1
REN = 1; //允许串口接受使能
ES = 1; //串口中断使能置1,允许串口中断
TH0=0xdc;//0x95; //重新置定时参数
TL0=0x00;//0x56; //
ET0=1;
TR0=1;
EA=1;
rx_count = 0;
rx_date=0x01;
some = rx_date;
rx_date=0x03;
rx_date=0x00;
rx_date=0x00;
rx_date=0x00;
rx_date=0x03;
SendByte(0x01);
SendByte(some);
SendByte(0x03);
SendByte(rx_date);
SendByte(0x00);
SendByte(rx_date);
SendByte(0x00);
SendByte(rx_date);
SendByte(0x00);
SendByte(rx_date);
SendByte(0x03);
SendByte(rx_date);
}
/*从智能显示终端模块读数据到单片机的数据格式是
触摸屏数据格式: 设备地址(1)功能码(1) 通道地址(2~4) 数据区(n) CRC校验码(2)
*/
/*uart 中断程序*/
void uart_int( ) interrupt 4 using 1
{
unsigned char temp1;
ES=0;
if(RI==1)
{
// Alarm();//检测单片机有没有收到信息
temp1 = SBUF;
rx_date = temp1;
// Alarm();
if(rx_count == 8)
{
Key_State = 1;
rx_count = 0;
// Read_Date(0);
}
RI =0;
}
ES=1;
}
/*
**定时中断程序
*/
voidtimer0(void) interrupt 1 using 2
{
// uint H,L;
TH0=0xdc; //11.0592M 晶振
TL0=0x00; //
}
HeP028 发表于 2014-2-24 13:17
你把工程贴出来大家测试下呢?
麻烦大家了! HeP028 发表于 2014-2-24 13:17
你把工程贴出来大家测试下呢?
这个是工程! shuidiyu 发表于 2014-2-24 13:34
这个是工程!
问题的原因找到了,因为程序里的设置
如果设置成DATA 就没有问题,如果设置成XDATA,就不行了!有没有有经验的人遇到过此问题!为什么啊! 因为你的单片机没有xdata区,而keil 并不知道你使用鸟什么单片鸡! 软硬件结合才能用好单片机,呵呵。 HeP028 发表于 2014-2-24 23:37
因为你的单片机没有xdata区,而keil 并不知道你使用鸟什么单片鸡!
w77e58是没有xdata区的?这可怎么办,如果不选xdata编译不通过 坐等学习 本帖最后由 shuidiyu 于 2014-2-25 15:55 编辑
最近情况, some = UART_Out;
SendByte(some);
some = UART_Out;
SendByte(some);
some = UART_Out;
SendByte(some);
some = UART_Out;
SendByte(some);
for(i=0;i<*(send+2);i++)
{
*(send+3+2*i) = UART_Out;
address++;
*(send+4+2*i) = UART_Out;
address++;
}
some = UART_Out;
SendByte(some);
some = UART_Out;
SendByte(some);
some = UART_Out;
SendByte(some);
some = UART_Out;
SendByte(some);
UART_Out,address从0开始的,for循环之前的读出的数组值和循环之后的数组值不一样啊,什么原因!之前发送的为0x01 0x02 0x03 0x04 为正确的数,之后发送的为0x00 0x03 0x03 0x04
下面是工程! dingdan258 发表于 2014-2-25 09:58
软硬件结合才能用好单片机,呵呵。
黄工,这个单片机w77e58 不能选xdata吗?但是再加代码会编译不过去啊! shuidiyu 发表于 2014-2-25 15:38
黄工,这个单片机w77e58 不能选xdata吗?但是再加代码会编译不过去啊!
你看我像打酱油的吗,呵呵,问题解决了,共享下啊 dingdan258 发表于 2014-2-25 18:43
你看我像打酱油的吗,呵呵,问题解决了,共享下啊
你不像是打酱油的!哈哈!说下上次的问题,选择Memory model 为Xdata 时w77e58需要开启内置1k XRAM; PMR |= 0x01; //使用77e58片上1KRAM;memory model为XDATA时必须设置!
第二个问题仍然没有解决! mark一下 本帖最后由 shuidiyu 于 2014-2-26 13:14 编辑
最新情况更新,关于下面这段代码
SendByte(UART_Out);
for(i=0;i<*(send+2);i++)
{
*(send+3+2*i) = UART_Out;
address++;
*(send+4+2*i) = UART_Out;
address++;
}
SendByte(UART_Out);
汇编程序如下 187: SendByte(UART_Out);
188:
C:0x025F 90000D MOV DPTR,#UART_Out(0x000D)
C:0x0262 E0 MOVX A,@DPTR
C:0x0263 FF MOV R7,A
C:0x0264 120003 LCALL SendByte(C:0003)
189: for(i=0;i<*(send+2);i++)
C:0x0267 E4 CLR A
C:0x0268 FF MOV R7,A
C:0x0269 12035A LCALL L?0017(C:035A)
C:0x026C FD MOV R5,A
C:0x026D EF MOV A,R7
C:0x026E C3 CLR C
C:0x026F 9D SUBB A,R5
C:0x0270 5017 JNC C:0289
190: {
191: *(send+3+2*i) = UART_Out;
C:0x0272 1203AA LCALL L?0023(C:03AA)
C:0x0275 E9 MOV A,R1
C:0x0276 2403 ADD A,#0x03
192: address++;
C:0x0278 120378 LCALL L?0020(C:0378)
193: *(send+4+2*i) = UART_Out;
C:0x027B 1203AA LCALL L?0023(C:03AA)
C:0x027E 12036D LCALL L?0019(C:036D)
C:0x0281 2404 ADD A,#0x04
194: address++;
C:0x0283 120378 LCALL L?0020(C:0378)
195: }
196:
C:0x0286 0F INC R7
C:0x0287 80E0 SJMP C:0269
197: SendByte(UART_Out);
198:
199:
C:0x0289 90000D MOV DPTR,#UART_Out(0x000D)
C:0x028C E0 MOVX A,@DPTR
C:0x028D FF MOV R7,A
C:0x028E 120003 LCALL SendByte(C:0003)
当*(send+2)为2和4时,数据正确,当值为6时, UART_Out[]数组前两个数就会发生改变!
下面为for循环中调用的汇编
C:0x035A 90001C MOV DPTR,#0x001C
C:0x035D E0 MOVX A,@DPTR
C:0x035E FB MOV R3,A
C:0x035F A3 INC DPTR
C:0x0360 E0 MOVX A,@DPTR
C:0x0361 FA MOV R2,A
C:0x0362 A3 INC DPTR
C:0x0363 E0 MOVX A,@DPTR
C:0x0364 F9 MOV R1,A
C:0x0365 900002 MOV DPTR,#0x0002
C:0x0368 0202E1 LJMP C?CLDOPTR(C:02E1)
C:0x036B E0 MOVX A,@DPTR
C:0x036C FF MOV R7,A
C:0x036D 90001C MOV DPTR,#0x001C
C:0x0370 E0 MOVX A,@DPTR
C:0x0371 FB MOV R3,A
C:0x0372 A3 INC DPTR
C:0x0373 E0 MOVX A,@DPTR
C:0x0374 FA MOV R2,A
C:0x0375 A3 INC DPTR
C:0x0376 E0 MOVX A,@DPTR
C:0x0377 22 RET 数组的问题是数组越界的原因,哎,晕! 早该想到的!对了,关于汇编中实现数组与指针之间赋值的问题值得研究下! mark 一下
页:
[1]