搜索
bottom↓
回复: 25

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

[复制链接]

出0入0汤圆

发表于 2014-2-24 09:19:10 | 显示全部楼层 |阅读模式
  1.         rx_date[0]=0x01;
  2.         rx_date[1]=0x03;
  3.         rx_date[2]=0x00;
  4.         rx_date[3]=0x00;
  5.         rx_date[4]=0x00;
  6.         rx_date[5]=0x03;

  7.         SendByte(0x01);
  8.         SendByte(*rx_date);
  9.         SendByte(0x03);
  10.         SendByte(rx_date[1]);
  11.         SendByte(0x00);       
  12.         SendByte(rx_date[2]);
  13.         SendByte(0x00);
  14.         SendByte(rx_date[3]);
  15.         SendByte(0x00);       
  16.         SendByte(rx_date[4]);
  17.         SendByte(0x03);
  18.         SendByte(rx_date[5]);       
复制代码

遇到奇怪的问题,数组定义为unsigned char 型,给数组赋值后,在用串口发送,结果电脑上串口调试助手接收到是值为 01 FC 03 FC 00 FC 00 FC 00 FC 03 FC ;是什么问题啊!

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2014-2-24 09:42:11 | 显示全部楼层
SendByte 要看看你段的问题吧

出0入0汤圆

 楼主| 发表于 2014-2-24 09:58:52 | 显示全部楼层
HeP028 发表于 2014-2-24 09:42
SendByte 要看看你段的问题吧

看段的问题?不明白!
  1. void SendByte(unsigned char dat)
  2. {     
  3.         SBUF=dat; //发送数据     
  4.         while(TI==0);//检查发送完成中断标志
  5.         TI=0;        
  6. }
复制代码

出0入4汤圆

发表于 2014-2-24 10:14:29 | 显示全部楼层
像是把数组的地址发过去了?

出0入0汤圆

发表于 2014-2-24 10:14:36 | 显示全部楼层
shuidiyu 发表于 2014-2-24 09:58
看段的问题?不明白!

你数组怎么定义的

出0入0汤圆

发表于 2014-2-24 10:30:22 | 显示全部楼层
去掉这句呢?SendByte(*rx_date); 或者SendByte(rx_date[0]);

出0入0汤圆

 楼主| 发表于 2014-2-24 13:04:14 | 显示全部楼层
ronic 发表于 2014-2-24 10:14
像是把数组的地址发过去了?

修改后程序
  1.         rx_count = 0;
  2.         rx_date[0]=0x01;
  3.                 some = rx_date[0];
  4.         rx_date[1]=0x03;
  5.         rx_date[2]=0x00;
  6.         rx_date[3]=0x00;
  7.         rx_date[4]=0x00;
  8.         rx_date[5]=0x03;

  9.         SendByte(0x01);

  10.         SendByte(some);
复制代码


some的为char类型,接收到的数据位0x01和0xfc,怎么给数组赋值没有成功呢?

出0入0汤圆

 楼主| 发表于 2014-2-24 13:05:07 | 显示全部楼层
ronic 发表于 2014-2-24 10:14
像是把数组的地址发过去了?
  1.         rx_count = 0;
  2.         rx_date[0]=0x01;
  3.                 some = rx_date[0];
  4.         rx_date[1]=0x03;
  5.         rx_date[2]=0x00;
  6.         rx_date[3]=0x00;
  7.         rx_date[4]=0x00;
  8.         rx_date[5]=0x03;

  9.         SendByte(0x01);

  10.         SendByte(some);
复制代码

这样改了,还是不对,数组赋值就没有成功!

出0入0汤圆

 楼主| 发表于 2014-2-24 13:06:36 | 显示全部楼层
HeP028 发表于 2014-2-24 10:30
去掉这句呢?SendByte(*rx_date); 或者SendByte(rx_date[0]);

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

出0入0汤圆

发表于 2014-2-24 13:17:02 | 显示全部楼层
你把工程贴出来大家测试下呢?

出0入0汤圆

 楼主| 发表于 2014-2-24 13:21:40 | 显示全部楼层
HeP028 发表于 2014-2-24 13:17
你把工程贴出来大家测试下呢?

  1. #include <include.h>
  2. #include <include.h>


  3. bit LeftEnable;
  4. bit RightEnable;
  5. bit delay_control;
  6. bit left_counter_enable;
  7. bit right_counter_enable;
  8. bit Disp_Enable=0;
  9. bit Heat=0;
  10. bit Temp_Rate_Cul;
  11. bit heat_disp=0;
  12. bit FreshEnable;
  13. bit show_face16_enable;
  14. //??????????????????????????
  15. bit        InputO2=0;                 
  16. bit        OutputO2=0;
  17. bit        MiniInputO2=0;
  18. bit        MiniOutputO2=0;  
  19. //??????????????????????????
  20. int heat_value=0;       
  21. uint xdata AD_Temp_samp;             
  22. uint AD_value[21];
  23. uint thermometer_resistance[21];
  24. uint testcounter;
  25. uint Press01Max,Press02Max;
  26. uint Press01MaxTime,Press02MaxTime;
  27. uint clock10ms;
  28. uint Temp_samp,AD_Press_1,AD_Press_2,Press01,Press02;
  29. uint Temp_Bias;

  30. char name[11];
  31. uchar result_number;  
  32. uchar test_no;        
  33. uchar thermometer_resistance_ii;
  34. uchar dh,dl;   
  35. uchar temp_adj_enable_counter;   
  36. uchar delay_control_time;                                                  
  37. uchar test_step=0xff;         
  38. uchar Work_State;
  39. uchar Date[8]; //读时间值
  40. uchar rc_timer_en;
  41. uchar clock1sec;

  42. xdata float e_2,e_1,e;
  43. xdata float lastOut=0.0;

  44. uchar rx_count,Key_State,rx_date[8],Send_Buf[11],UART_Out[6]={0x05,0x06,0x05,0x06,0x05,0x06};
  45. uchar Out_data;
  46. uchar Key_State;

  47. void main(void)
  48. {
  49. //         unsigned int i;  
  50.        
  51.         Initial();       
  52. //         Alarm();
  53.                
  54.         Read_Date(0);
  55. //         SendByte(0x05);  
  56. //         SendByte(0x06);
  57. //         SendByte(0x07);

  58.        
  59.         while(1){}
  60.        
  61. }

  62. //****************************************************************************************************************
  63. //初始化程序
  64. //****************************************************************************************************************
  65. void Initial(void)
  66. {
  67.         char  some;
  68.         /*对AT89C51(11.059MHz)的串口初始化*/
  69.         TMOD=0x21;                              //定时器1设置为模式2
  70. //         PCON=PCON|0x80;                         //波特率加倍
  71.         PCON=PCON&0x7f;
  72.         SM0=0;
  73.         SM1=1;                                  //设置串口为方式1,10位异步收发
  74.         TL1=0xFD;
  75.         TH1=0xFD;                               //波特率为19200
  76.         TR1=1;                                  //启动定时器1
  77.         REN = 1;                                //允许串口接受使能
  78.         ES = 1;                                 //串口中断使能置1,允许串口中断

  79.         TH0=0xdc;//0x95;                //重新置定时参数
  80.         TL0=0x00;//0x56;                //
  81.         ET0=1;
  82.         TR0=1;
  83.         EA=1;
  84.        
  85.         rx_count = 0;
  86.         rx_date[0]=0x01;
  87.                 some = rx_date[0];
  88.         rx_date[1]=0x03;
  89.         rx_date[2]=0x00;
  90.         rx_date[3]=0x00;
  91.         rx_date[4]=0x00;
  92.         rx_date[5]=0x03;

  93.         SendByte(0x01);

  94.         SendByte(some);
  95.         SendByte(0x03);
  96.         SendByte(rx_date[1]);
  97.         SendByte(0x00);       
  98.         SendByte(rx_date[2]);
  99.         SendByte(0x00);
  100.         SendByte(rx_date[3]);
  101.         SendByte(0x00);       
  102.         SendByte(rx_date[4]);
  103.         SendByte(0x03);
  104.         SendByte(rx_date[5]);       
  105.        
  106. }

  107. /*从智能显示终端模块读数据到单片机的数据格式是
  108.                   
  109. 触摸屏数据格式: 设备地址(1)  功能码(1)   通道地址(2~4)   数据区(n)    CRC校验码(2)  
  110. */
  111. /*uart 中断程序*/
  112. void uart_int( ) interrupt 4 using 1      
  113. {
  114.    unsigned char temp1;
  115.    ES=0;
  116.    if(RI==1)
  117.    {
  118. //       Alarm();//检测单片机有没有收到信息
  119.                         temp1 = SBUF;

  120.                   rx_date[rx_count++] = temp1;
  121.                  
  122. //                   Alarm();
  123.                  
  124.                   if(rx_count == 8)
  125.                         {
  126.                                 Key_State = 1;
  127.                                 rx_count = 0;
  128.                                
  129. //                                 Read_Date(0);
  130.                         }

  131.                         RI =0;
  132.    }
  133.    ES=1;
  134. }

  135. /*
  136. **定时中断程序
  137. */
  138. void  timer0(void) interrupt 1 using 2
  139. {
  140. //          uint H,L;
  141.          TH0=0xdc;                 //11.0592M 晶振
  142.          TL0=0x00;                 //

  143. }



复制代码

出0入0汤圆

 楼主| 发表于 2014-2-24 13:22:08 | 显示全部楼层
HeP028 发表于 2014-2-24 13:17
你把工程贴出来大家测试下呢?

麻烦大家了!

出0入0汤圆

 楼主| 发表于 2014-2-24 13:34:45 | 显示全部楼层
HeP028 发表于 2014-2-24 13:17
你把工程贴出来大家测试下呢?

这个是工程!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2014-2-24 17:05:15 | 显示全部楼层

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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-2-24 23:37:50 | 显示全部楼层
因为你的单片机没有xdata区,而keil 并不知道你使用鸟什么单片鸡!

出0入0汤圆

发表于 2014-2-25 09:58:54 | 显示全部楼层
软硬件结合才能用好单片机,呵呵。

出0入0汤圆

 楼主| 发表于 2014-2-25 11:26:21 | 显示全部楼层
HeP028 发表于 2014-2-24 23:37
因为你的单片机没有xdata区,而keil 并不知道你使用鸟什么单片鸡!

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

出0入0汤圆

发表于 2014-2-25 11:28:15 | 显示全部楼层
坐等学习

出0入0汤圆

 楼主| 发表于 2014-2-25 15:35:55 | 显示全部楼层
本帖最后由 shuidiyu 于 2014-2-25 15:55 编辑

最近情况,
  1.                         some = UART_Out[0];
  2.                         SendByte(some);
  3.                         some = UART_Out[1];
  4.                         SendByte(some);       
  5.                         some = UART_Out[2];
  6.                         SendByte(some);
  7.                         some = UART_Out[3];
  8.                         SendByte(some);               
  9.        
  10.         for(i=0;i<*(send+2);i++)
  11.         {
  12.                 *(send+3+2*i) = UART_Out[address];
  13.                 address++;
  14.                 *(send+4+2*i) = UART_Out[address];
  15.                 address++;
  16.         }

  17.                         some = UART_Out[0];
  18.                         SendByte(some);
  19.                         some = UART_Out[1];
  20.                         SendByte(some);               
  21.                         some = UART_Out[2];
  22.                         SendByte(some);
  23.                         some = UART_Out[3];
  24.                         SendByte(some);               
复制代码


UART_Out[address],address从0开始的,for循环之前的读出的数组值和循环之后的数组值不一样啊,什么原因!之前发送的为0x01 0x02 0x03 0x04    为正确的数,之后发送的为0x00 0x03 0x03 0x04
下面是工程!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2014-2-25 15:38:22 | 显示全部楼层
dingdan258 发表于 2014-2-25 09:58
软硬件结合才能用好单片机,呵呵。

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

出0入0汤圆

发表于 2014-2-25 18:43:02 | 显示全部楼层
shuidiyu 发表于 2014-2-25 15:38
黄工,这个单片机w77e58 不能选xdata吗?但是再加代码会编译不过去啊!

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

出0入0汤圆

 楼主| 发表于 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时必须设置!
第二个问题仍然没有解决!

出0入0汤圆

发表于 2014-2-26 08:18:32 | 显示全部楼层
mark一下

出0入0汤圆

 楼主| 发表于 2014-2-26 13:10:23 | 显示全部楼层
本帖最后由 shuidiyu 于 2014-2-26 13:14 编辑

最新情况更新,关于下面这段代码

  1.                         SendByte(UART_Out[0]);               
  2.        
  3.         for(i=0;i<*(send+2);i++)
  4.         {
  5.                 *(send+3+2*i) = UART_Out[address];
  6.                 address++;
  7.                 *(send+4+2*i) = UART_Out[address];
  8.                 address++;
  9.         }

  10.                         SendByte(UART_Out[0]);
复制代码


汇编程序如下
  1.    187:                         SendByte(UART_Out[0]);     
  2.    188:         
  3. C:0x025F    90000D   MOV      DPTR,#UART_Out(0x000D)
  4. C:0x0262    E0       MOVX     A,@DPTR
  5. C:0x0263    FF       MOV      R7,A
  6. C:0x0264    120003   LCALL    SendByte(C:0003)
  7.    189:         for(i=0;i<*(send+2);i++)
  8. C:0x0267    E4       CLR      A
  9. C:0x0268    FF       MOV      R7,A
  10. C:0x0269    12035A   LCALL    L?0017(C:035A)
  11. C:0x026C    FD       MOV      R5,A
  12. C:0x026D    EF       MOV      A,R7
  13. C:0x026E    C3       CLR      C
  14. C:0x026F    9D       SUBB     A,R5
  15. C:0x0270    5017     JNC      C:0289
  16.    190:         {
  17.    191:                 *(send+3+2*i) = UART_Out[address];
  18. C:0x0272    1203AA   LCALL    L?0023(C:03AA)
  19. C:0x0275    E9       MOV      A,R1
  20. C:0x0276    2403     ADD      A,#0x03
  21.    192:                 address++;
  22. C:0x0278    120378   LCALL    L?0020(C:0378)
  23.    193:                 *(send+4+2*i) = UART_Out[address];
  24. C:0x027B    1203AA   LCALL    L?0023(C:03AA)
  25. C:0x027E    12036D   LCALL    L?0019(C:036D)
  26. C:0x0281    2404     ADD      A,#0x04
  27.    194:                 address++;
  28. C:0x0283    120378   LCALL    L?0020(C:0378)
  29.    195:         }
  30.    196:  
  31. C:0x0286    0F       INC      R7
  32. C:0x0287    80E0     SJMP     C:0269
  33.    197:                         SendByte(UART_Out[0]);
  34.    198:  
  35.    199:  
  36. C:0x0289    90000D   MOV      DPTR,#UART_Out(0x000D)
  37. C:0x028C    E0       MOVX     A,@DPTR
  38. C:0x028D    FF       MOV      R7,A
  39. C:0x028E    120003   LCALL    SendByte(C:0003)
复制代码


当*(send+2)为2和4时,数据正确,当值为6时, UART_Out[]数组前两个数就会发生改变!
下面为for循环中调用的汇编
  1. C:0x035A    90001C   MOV      DPTR,#0x001C
  2. C:0x035D    E0       MOVX     A,@DPTR
  3. C:0x035E    FB       MOV      R3,A
  4. C:0x035F    A3       INC      DPTR
  5. C:0x0360    E0       MOVX     A,@DPTR
  6. C:0x0361    FA       MOV      R2,A
  7. C:0x0362    A3       INC      DPTR
  8. C:0x0363    E0       MOVX     A,@DPTR
  9. C:0x0364    F9       MOV      R1,A
  10. C:0x0365    900002   MOV      DPTR,#0x0002
  11. C:0x0368    0202E1   LJMP     C?CLDOPTR(C:02E1)
  12. C:0x036B    E0       MOVX     A,@DPTR
  13. C:0x036C    FF       MOV      R7,A
  14. C:0x036D    90001C   MOV      DPTR,#0x001C
  15. C:0x0370    E0       MOVX     A,@DPTR
  16. C:0x0371    FB       MOV      R3,A
  17. C:0x0372    A3       INC      DPTR
  18. C:0x0373    E0       MOVX     A,@DPTR
  19. C:0x0374    FA       MOV      R2,A
  20. C:0x0375    A3       INC      DPTR
  21. C:0x0376    E0       MOVX     A,@DPTR
  22. C:0x0377    22       RET      
复制代码

出0入0汤圆

 楼主| 发表于 2014-2-26 15:16:59 | 显示全部楼层
数组的问题是数组越界的原因,哎,晕! 早该想到的!对了,关于汇编中实现数组与指针之间赋值的问题值得研究下!

出0入0汤圆

发表于 2014-2-28 10:15:28 | 显示全部楼层
mark 一下
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 12:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表