串口助手显示接收到数据,但是界面却没有显示

2019-07-15 07:28发布

ATOS实验箱中测量节点温度,并显示出来,程序运行正确,也成功下载,但是在串口助手却只能显示接收到数据,界面上啥都没有,改成16进制显示,界面上显示的全部是0,不知道是是怎么回事?求大神解答~

8.png
9.png
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
shsfsdfsg
1楼-- · 2019-07-15 13:42
 精彩回答 2  元偷偷看……
shsfsdfsg
2楼-- · 2019-07-15 14:01
/*  initUART_Timer.h   */
#include <ioCC2530.h>
#define uint unsigned int
#define uchar unsigned char
#define LED1   P1_0         //定义LED1为P10口控制
#define LED2   P1_1         //定义LED2为P11口控制
#define LED3   P1_4         //定义LED3为P14口控制
// Data
typedef unsigned char       BYTE;

// Unsigned numbers
typedef unsigned char       UINT8;
typedef unsigned char       INT8U;
typedef unsigned short      UINT16;
typedef unsigned short      INT16U;
typedef unsigned long       UINT32;
typedef unsigned long       INT32U;

// Signed numbers
typedef signed char         INT8;
typedef signed short        INT16;
typedef signed long         INT32;

#define DISABLE_ALL_INTERRUPTS() (IEN0 = IEN1 = IEN2 = 0x00)//三个

/**************************
系统时钟 不分频
计数时钟 32分频
**************************/
void InitClock(void)
{   
     CLKCONCMD &= ~0x40; // 设置系统时钟源为 32MHZ晶振
    while(CLKCONSTA & 0x40);         // 等待晶振稳定
     CLKCONCMD &= ~0x47;              // 设置系统主时钟频率为 32MHZ
}
/****************************
//初始化程序
*****************************/
void InitLed(void)
{
P1DIR |= 0x13; //P1_0、P1_1定义为输出
LED1 = 0;       //LED1灯熄灭
        LED2 = 0;   
         LED3 = 0;
}
/****************************
T3初始化
****************************/
void InitT3(void)
{
   T3CCTL0 = 0X44;        // T3CCTL0 (0xCC),CH0 中断使能,CH0 比较模式
  T3CC0 = 0xFA;          // T3CC0设置为250
   T3CTL |= 0x9A;         // 启动T3计数器,计数时钟为16分频。使用MODULO模式
  IEN1 |= 0X08;     
   IEN0 |= 0X80;          //开总中断,开T3中断
}
/*****************************************
  串口初始化函数:初始化串口 UART0
*****************************************/
void InitUART0(void)
{
PERCFG = 0x00;  //位置1 P0口
P0SEL = 0x3c;  //P0用作串口

P2DIR &= ~0XC0;                           //P0优先作为UART0   
         U0CSR |= 0x80;                      //串口设置为UART方式
        U0GCR |= 11;
         U0BAUD |= 216;                   //波特率设为115200

UTX0IF = 1;                               //UART0 TX中断标志初始置位1  
         U0CSR |= 0X40;   //允许接收
        IEN0 |= 0x84;   //开总中断,接收中断

}

void UartTX_Send_String(char *Data,int len)
{
   int j;
   for(j=0;j<len;j++)
   {
     U0DBUF = *Data++;
     while(UTX0IF == 0);
     UTX0IF = 0;
   }
      U0DBUF = 0x0A;        // 换行
    while(UTX0IF == 0);
       UTX0IF = 0;
}

void Delay(uint n)
{
uint i;
for(i=0;i<n;i++);
for(i=0;i<n;i++);
for(i=0;i<n;i++);
for(i=0;i<n;i++);
for(i=0;i<n;i++);
}

void Delayms(uint xms)   //i=xms 即延时i毫秒 (16M晶振时候大约数,32M需要修改,系统不修改默认使用内部16M)
{
  uint i,j;
  for(i=xms;i>0;i--)
    for(j=587;j>0;j--);
}

/*  main.c            */
#include <ioCC2530.h>
#include "InitUART_Timer.h"  //注意在option里设置路径
#include "stdio.h"

void initTempSensor(void)
{
    DISABLE_ALL_INTERRUPTS();          //关闭所有中断
    InitClock();                         //设置系统主时钟为 32M
    TR0=0X01;         //set '1' to connectthe temperature sensorto the SOC_ADC.
    ATEST=0X01;       // Enablesthe temperature sensor
}   

float getTemperature(void)
{   
    uint  value;
    ADCCON3  = (0x3E);      //选择1.25V为参考电压;12位分辨率;对片内温度传感器采样
   ADCCON1 |= 0x30;         //选择ADC的启动模式为手动
   ADCCON1 |= 0x40;                    //启动AD转化  
    while(!(ADCCON1 & 0x80));          //等待 AD 转换完成
    value =  ADCL >> 4;                //ADCL 寄存器低 4位无效
    value |= (((UINT16)ADCH) << 4);
    return (value-1367.5)/4.5-5;    //根据AD值,计算出实际的温度,温度系数应该是4.5 /℃
                              //进行温度校正,这里减去5℃(不同芯片根据具体情况校正)
}

void main(void)
{   
        // char i;
         char TempValue[6];  
         float Temp;         
         InitUART0();                                    //初始化串口
         initTempSensor();                               //初始化 ADC
         while(1)
         {
           /*AvgTemp = 0;         
           for(i = 0 ; i < 64 ; i++)
           {   
             AvgTemp += getTemperature();  
             AvgTemp=AvgTemp/2;                  //每次累加后除 2
           }
           */
           Temp=getTemperature();
           /****温度转换成ascii码发送****/
           TempValue[0] = (unsigned char)(Temp)/10 + 48;          //十位
          TempValue[1] = (unsigned char)(Temp)%10 + 48;          //个位
          TempValue[2] = '.';                                       //小数点
           TempValue[3] = (unsigned char)(Temp*10)%10+48;         //十分位
          TempValue[4] = (unsigned char)(Temp*100)%10+48;        //百分位
          TempValue[5] = '';                                   //字符串结束符
          UartTX_Send_String( TempValue,6);
           Delayms(2000); //使用32M晶振,故这里2000约等于1S
         }
}
代码如上,是否代码上有什么问题?
ggfvxv
3楼-- · 2019-07-15 15:18
TempValue[0] = (unsigned char)(Temp)/10 + 48;          //十位
这个有问题。干吗不用sprintf? 或者更安全的snprintf?
snprintf(TempValue, 6, "%.2f", Temp);
  UartTX_Send_String( TempValue,6);
shsfsdfsg
4楼-- · 2019-07-15 18:59
使用snprintf(TempValue, 6, "%.2f", Temp);函数的话,调试时会出现这个错误:
10.png
不知道怎么弄,在头文件中有申明:
    #include "stdio.h"
     #include"stdlib.h"
ggfvxv
5楼-- · 2019-07-15 21:23
是链接错误,检查库文件设置。另外需要打开浮点数打印支持。检查你的链接配置
zhangminmin
6楼-- · 2019-07-16 00:06
 精彩回答 2  元偷偷看……

一周热门 更多>