OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3495|回复: 2

串口解析数据显示乱码,求助!!

[复制链接]

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2016-1-21
在线时间
17 小时
发表于 2016-5-12 11:10:58 | 显示全部楼层 |阅读模式
1金钱
最近在做STM32F103ZET6串口接收数据解析的实验,我用串口调试助手给串口1发送一帧数据:95272+25.71+22.9F2+27.5N3+27.5N4+28.0N5+28.0N6+29.0N7+27.5N8+29.0NF数据传输格式如下图所示:

在ZigbeeMsg_Show()函数中对数据帧进行解析并通过串口1打印到上位机观察数据,代码如下:
[mw_shl_code=c,true]//Rxdata为串口收到的字符串,传输的数据格式:95270+25.51+28.0N2+27.5N3+27.5N4+28.0N5+28.0N6+29.0N7+27.5N8+29.0NN共68个字节//Rxlen为字符串长度
void ZigbeeMsg_Show(char *Rxdata, u8 Rxlen)
{
        u8 i=0,j=0;      
        char Carnumber[5];    //车厢编号95270
        char Et_temp[5];      //环境温度+25.5
        char Bear1temp[5];    //轴承1温度+28.0
        char Bear2temp[5];          //轴承2温度+27.5
        char Bear3temp[5];    //轴承3温度+27.5
        char Bear4temp[5];    //轴承4温度+28.0
        char Bear5temp[5];    //轴承5温度+28.0
        char Bear6temp[5];    //轴承6温度+29.0
        char Bear7temp[5];    //轴承7温度+27.5
        char Bear8temp[5];    //轴承8温度+29.0
        char Bearstatus[8];          //轴承状态8个字节
        char Bearnumber[8];   //轴承8温度+29.0
        char Carstatus ;      //车厢状态

        while(i<Rxlen)
        {
                printf("%s\r\n",Rxdata);
                while(j<5)
                {
                        Carnumber[j++] = Rxdata[i++];   //车厢编号
                }
                j=0;

                printf("Carnumber=%s\\r\n",Carnumber);
                while(j<5)
                {
            Et_temp[j++]  = Rxdata[i++];   //环境温度
                }
                j=0;
               
                Bearnumber[0] = Rxdata[i++];    //轴承1
                while(j<5)
                {
                   Bear1temp[j++] =        Rxdata[i++];
                }
                j=0;
                Bearstatus[0] = Rxdata[i++];
               
          Bearnumber[1]        =        Rxdata[i++];   //轴承2
                while(j<5)
                {
                   Bear2temp[j++] =        Rxdata[i++];
                }
                j=0;
          Bearstatus[1] = Rxdata[i++];
               
          Bearnumber[2]        =        Rxdata[i++];   //轴承3
                while(j<5)
                {
                   Bear3temp[j++] =        Rxdata[i++];
                }
                j=0;
          Bearstatus[2] = Rxdata[i++];
   
          Bearnumber[3]        =        Rxdata[i++];   //轴承4
                while(j<5)
                {
                   Bear4temp[j++] =        Rxdata[i++];
                }
                j=0;
          Bearstatus[3]  = Rxdata[i++];

                Bearnumber[4]        =        Rxdata[i++];   //轴承5
                while(j<5)
                {
                   Bear5temp[j++] =        Rxdata[i++];
                }
                j=0;
          Bearstatus[4] = Rxdata[i++];

          Bearnumber[5]        =        Rxdata[i++];   //轴承6
                while(j<5)
                {
                   Bear6temp[j++] =        Rxdata[i++];
                }
                j=0;       
          Bearstatus[5] = Rxdata[i++];
               
          Bearnumber[6]        =        Rxdata[i++];   //轴承7
                while(j<5)
                {
                   Bear7temp[j++] =        Rxdata[i++];
                }
                j=0;
          Bearstatus[6] = Rxdata[i++];
               
          Bearnumber[7]        =        Rxdata[i++];   //轴承8
                while(j<5)
                {
                   Bear8temp[j++]  =        Rxdata[i++];
                }
                j=0;
          Bearstatus[7] = Rxdata[i++];
                delay_ms(2);
                Carstatus= Rxdata[i++];     //车厢状态
        }
        printf("%s\r\n",Rxdata);
        printf("Carnumber=%s\r\n",Carnumber);
        printf("Et_temp=%s\r\n",Et_temp);
        printf("Bear1temp=%s\r\n",Bear1temp);
        printf("Bear2temp=%s\r\n",Bear2temp);
        printf("Bear3temp=%s\r\n",Bear3temp);
        printf("Bear4temp=%s\r\n",Bear4temp);
        printf("Bear5temp=%s\r\n",Bear5temp);
        printf("Bear6temp=%s\r\n",Bear6temp);
        printf("Bear7temp=%s\r\n",Bear7temp);
        printf("Bear8temp=%s\r\n",Bear8temp);
        printf("Carstatus=%c\r\n",Carstatus);
}[/mw_shl_code]


在串口调试助手的现象是:

可以看见,有的数据明显出现了乱码,然后我用软件仿真了一下:

软件仿真除了Carstatus没显示外,其他数据都是正确的。
请大神们帮我分析一下,软件可以行的通但硬件上为什么出问题?我的中断程序完全照搬的串口例程,波特率设置的是115200,按理说不应该是串口波特率不匹配或中断的问题,求助!!

HQH)@N9}L@6L9A1L]0S}{XJ.png
GP2P1%1V~A{979N28G}S.png
7H6W53J}$L7RG`QVQ2F2)@2.png

最佳答案

查看完整内容[请看2#楼]

问题解决了,是数组没有初始化导致的
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2016-1-21
在线时间
17 小时
 楼主| 发表于 2016-5-12 11:10:59 | 显示全部楼层
问题解决了,是数组没有初始化导致的
回复

使用道具 举报

13

主题

201

帖子

0

精华

高级会员

Rank: 4

积分
671
金钱
671
注册时间
2015-4-26
在线时间
173 小时
发表于 2016-5-12 11:17:15 | 显示全部楼层
原子的串口助手要勾选发送新行的
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-7 14:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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