shuidiyu 发表于 2014-2-24 09:19:10

遇到奇怪的串口发送数组问题(在线等帮忙)

        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 ;是什么问题啊!

HeP028 发表于 2014-2-24 09:42:11

SendByte 要看看你段的问题吧

shuidiyu 发表于 2014-2-24 09:58:52

HeP028 发表于 2014-2-24 09:42
SendByte 要看看你段的问题吧

看段的问题?不明白!void SendByte(unsigned char dat)
{   
        SBUF=dat; //发送数据   
        while(TI==0);//检查发送完成中断标志
        TI=0;      
}

ronic 发表于 2014-2-24 10:14:29

像是把数组的地址发过去了?

severewinner 发表于 2014-2-24 10:14:36

shuidiyu 发表于 2014-2-24 09:58
看段的问题?不明白!

你数组怎么定义的

HeP028 发表于 2014-2-24 10:30:22

去掉这句呢?SendByte(*rx_date); 或者SendByte(rx_date);

shuidiyu 发表于 2014-2-24 13:04:14

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,怎么给数组赋值没有成功呢?

shuidiyu 发表于 2014-2-24 13:05:07

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);
这样改了,还是不对,数组赋值就没有成功!

shuidiyu 发表于 2014-2-24 13:06:36

HeP028 发表于 2014-2-24 10:30
去掉这句呢?SendByte(*rx_date); 或者SendByte(rx_date);

之前就用的sendbyte(【0】);

HeP028 发表于 2014-2-24 13:17:02

你把工程贴出来大家测试下呢?

shuidiyu 发表于 2014-2-24 13:21:40

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;               //

}



shuidiyu 发表于 2014-2-24 13:22:08

HeP028 发表于 2014-2-24 13:17
你把工程贴出来大家测试下呢?

麻烦大家了!

shuidiyu 发表于 2014-2-24 13:34:45

HeP028 发表于 2014-2-24 13:17
你把工程贴出来大家测试下呢?

这个是工程!

shuidiyu 发表于 2014-2-24 17:05:15

shuidiyu 发表于 2014-2-24 13:34
这个是工程!

问题的原因找到了,因为程序里的设置

如果设置成DATA 就没有问题,如果设置成XDATA,就不行了!有没有有经验的人遇到过此问题!为什么啊!

HeP028 发表于 2014-2-24 23:37:50

因为你的单片机没有xdata区,而keil 并不知道你使用鸟什么单片鸡!

dingdan258 发表于 2014-2-25 09:58:54

软硬件结合才能用好单片机,呵呵。

shuidiyu 发表于 2014-2-25 11:26:21

HeP028 发表于 2014-2-24 23:37
因为你的单片机没有xdata区,而keil 并不知道你使用鸟什么单片鸡!

w77e58是没有xdata区的?这可怎么办,如果不选xdata编译不通过

wdh2152 发表于 2014-2-25 11:28:15

坐等学习

shuidiyu 发表于 2014-2-25 15:35:55

本帖最后由 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
下面是工程!

shuidiyu 发表于 2014-2-25 15:38:22

dingdan258 发表于 2014-2-25 09:58
软硬件结合才能用好单片机,呵呵。

黄工,这个单片机w77e58 不能选xdata吗?但是再加代码会编译不过去啊!

dingdan258 发表于 2014-2-25 18:43:02

shuidiyu 发表于 2014-2-25 15:38
黄工,这个单片机w77e58 不能选xdata吗?但是再加代码会编译不过去啊!

你看我像打酱油的吗,呵呵,问题解决了,共享下啊

shuidiyu 发表于 2014-2-26 08:13:34

dingdan258 发表于 2014-2-25 18:43
你看我像打酱油的吗,呵呵,问题解决了,共享下啊

你不像是打酱油的!哈哈!说下上次的问题,选择Memory model 为Xdata 时w77e58需要开启内置1k XRAM;        PMR |= 0x01;   //使用77e58片上1KRAM;memory model为XDATA时必须设置!
第二个问题仍然没有解决!

zhongjp85 发表于 2014-2-26 08:18:32

mark一下

shuidiyu 发表于 2014-2-26 13:10:23

本帖最后由 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      

shuidiyu 发表于 2014-2-26 15:16:59

数组的问题是数组越界的原因,哎,晕! 早该想到的!对了,关于汇编中实现数组与指针之间赋值的问题值得研究下!

wangdanzhoudan 发表于 2014-2-28 10:15:28

mark 一下
页: [1]
查看完整版本: 遇到奇怪的串口发送数组问题(在线等帮忙)