找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2829|回复: 7
收起左侧

串口数组赋值错误

[复制链接]
ID:134543 发表于 2016-9-12 01:03 | 显示全部楼层 |阅读模式
10黑币
程序代码如下:

  1. #include<reg52.h>
  2. #include<stdio.h> //打印到串口函数
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uchar date_zi[4][10];        //存放接收到的数据
  6. uint i_index=0;        //接收到的字符个数
  7. uint i=0;        //i字符用于循环
  8. unsigned int xia = 0;        //用于保存到数据的下标
  9. void fh_zi(unsigned int a)        //返回字符到串口
  10. {
  11. ES=0;
  12. TI=0;
  13. SBUF=a;
  14. while(!TI);
  15. TI=1;
  16. ES=1;
  17. }
  18. void init()
  19. {
  20. TMOD=0x20;
  21. TH1=0xfd;
  22. TL1=0Xfd;
  23. //TH0=(65536-45872)/256;
  24. //TL0=(65536-45872)%256;
  25. TR1=1;
  26. SM0=0;
  27. SM1=1;
  28. REN=1;
  29. EA=1;
  30. ES=1;
  31. }
  32. void main()
  33. {
  34. i_index=0;
  35. xia=2;        
  36. init();

  37. while(1);
  38. }
  39. void ser() interrupt 4 //串口
  40. {
  41. if(RI == 1)
  42. {
  43. RI=0;
  44. date_zi[xia][i_index] = SBUF;
  45. i_index++;
  46. if(i_index>10)        //接受完10个字符后显示数组所有内容
  47. {
  48. i_index=0;
  49. for(i=0;i<11;i++)        //显示数组中所有内容
  50. fh_zi(date_zi[0][i]);
  51. for(i=0;i<11;i++)
  52. fh_zi(date_zi[1][i]);
  53. for(i=0;i<11;i++)
  54. fh_zi(date_zi[2][i]);
  55. for(i=0;i<11;i++)
  56. fh_zi(date_zi[3][i]);
  57. }


  58. }
  59. }
复制代码

以16进制发送【03 55 aa 01 01 00 0a 07 03 02 ff】11个数据后,总是会多出03,ff这两个首尾字符,这是为什么?
我这个代码哪里错误了?
0.png

最佳答案

查看完整内容

void ser() interrupt 4 //串口 { if(RI == 1) { RI=0; date_zi[xia] = SBUF; i_index++; if(i_index==10) //这里改等于10,不然将会写入到date_zi[xia][10]中,数组访问溢出!!! { i_index=0; for(i=0; i
回复

使用道具 举报

ID:97438 发表于 2016-9-12 01:03 | 显示全部楼层
void ser() interrupt 4 //串口
{
        if(RI == 1)
        {
                RI=0;
                date_zi[xia][i_index] = SBUF;
                i_index++;
                if(i_index==10)        //这里改等于10,不然将会写入到date_zi[xia][10]中,数组访问溢出!!!
                {
                        i_index=0;
                        for(i=0; i<10; i++)      //这里的11改成10,不然同样是数组访问溢出的问题
                                fh_zi(date_zi[0][i]);
                        for(i=0; i<10; i++)
                                fh_zi(date_zi[1][i]);
                        for(i=0; i<10; i++)
                                fh_zi(date_zi[2][i]);
                        for(i=0; i<10; i++)
                                fh_zi(date_zi[3][i]);
                }


        }
}
回复

使用道具 举报

ID:134543 发表于 2016-9-12 01:27 | 显示全部楼层
没有人知道?
回复

使用道具 举报

ID:79358 发表于 2016-9-12 11:09 | 显示全部楼层
应该是程序问题,判断接收头和尾的时候多装入了一次
回复

使用道具 举报

ID:7485 发表于 2016-9-12 11:13 | 显示全部楼层
串口寄存器是8位的!unsigned char。
回复

使用道具 举报

ID:97438 发表于 2016-9-12 14:43 | 显示全部楼层
楼主你这个小程序问题多多。。。
回复

使用道具 举报

ID:97438 发表于 2016-9-12 14:44 | 显示全部楼层
ahshmj 发表于 2016-9-12 11:13
串口寄存器是8位的!unsigned char。

有这个错误,但不是致命错误
回复

使用道具 举报

ID:134543 发表于 2016-9-13 23:19 | 显示全部楼层
程序错误如下:
void fh_zi(unsigned int a)        //返回字符到串口
{
ES=0;
//TI=0;   //删除
SBUF=a;
while(!TI);
TI=0;   //TI值0
ES=1;
}
以及串口接收函数中:
if(i_index==10)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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