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

17个回答

︿ 3
估计是对的。缺省值是 9600,他设成 115200 应该是有根据的。

用示波器抓一下信号线上的波形。
︿ 2
是链接错误,检查库文件设置。另外需要打开浮点数打印支持。检查你的链接配置
︿ 1
/*  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] = '\0';                                   //字符串结束符
          UartTX_Send_String( TempValue,6); 
          Delayms(2000); //使用32M晶振,故这里2000约等于1S
        } 
}
代码如上,是否代码上有什么问题?
︿ 1

使用snprintf(TempValue, 6, "%.2f", Temp);函数的话,调试时会出现这个错误:

不知道怎么弄,在头文件中有申明:
    #include "stdio.h"
    #include"stdlib.h"
︿ 0
TempValue[0] = (unsigned char)(Temp)/10 + 48;          //十位
这个有问题。干吗不用sprintf? 或者更安全的snprintf?
snprintf(TempValue, 6, "%.2f", Temp);
 UartTX_Send_String( TempValue,6);
︿ 0
你好,我现在也遇到了同样的问题,不知道楼主解决这个问题没有?
我的程序如下:
/****************************************************************************
* 文 件 名: main.c
* 作    者: Andy
* 修    订: 2013-01-08
* 版    本: 1.0
* 描    述: 设置串口调试助手波特率:115200bps 8N1
*           串口调试助手给CC2530发字符串时,开发板会返回接收到的字符串
****************************************************************************/
#include <ioCC2530.h>
#include <string.h>

typedef unsigned char uchar;
typedef unsigned int  uint;

#define UART0_RX    1
#define UART0_TX    2
#define SIZE       51

char RxBuf;
char UartState;
uchar count;
char RxData[SIZE];        //存储发送字符串

/****************************************************************************
* 名    称: DelayMS()
* 功    能: 以毫秒为单位延时
* 入口参数: msec 延时参数,值越大,延时越久
* 出口参数: 无
****************************************************************************/
void DelayMS(uint msec)

    uint i,j;
    
    for (i=0; i<msec; i++)
        for (j=0; j<1070; j++);
}

/****************************************************************************
* 名    称: InitUart()
* 功    能: 串口初始化函数
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitUart(void)

    PERCFG = 0x00;           //外设控制寄存器 USART 0的IO位置:0为P0口位置1 
    P0SEL = 0x0c;            //P0_2,P0_3用作串口(外设功能)
    P2DIR &= ~0xC0;          //P0优先作为UART0
    
    U0CSR |= 0x80;           //设置为UART方式
    U0GCR |= 11;        
    U0BAUD |= 216;           //波特率设为115200
    UTX0IF = 0;              //UART0 TX中断标志初始置位0
    U0CSR |= 0x40;           //允许接收 
    IEN0 |= 0x84;            //开总中断允许接收中断  
}

/****************************************************************************
* 名    称: UartSendString()
* 功    能: 串口发送函数
* 入口参数: Data:发送缓冲区   len:发送长度
* 出口参数: 无
****************************************************************************/
void UartSendString(char *Data, int len)
{
    uint i;
    
    for(i=0; i<len; i++)
    {
        U0DBUF = *Data++;
        while(UTX0IF == 0);
        UTX0IF = 0;
    }
}

/****************************************************************************
* 名    称: UART0_ISR(void) 串口中断处理函数 
* 描    述: 当串口0产生接收中断,将收到的数据保存在RxBuf中
****************************************************************************/
#pragma vector = URX0_VECTOR 
__interrupt void UART0_ISR(void) 

    URX0IF = 0;       // 清中断标志 
    RxBuf = U0DBUF;                           
}


/****************************************************************************
* 程序入口函数
****************************************************************************/
void main(void)
{
    CLKCONCMD &= ~0x40;                        //设置系统时钟源为32MHZ晶振
    while(CLKCONSTA & 0x40);                   //等待晶振稳定为32M
    CLKCONCMD &= ~0x47;                        //设置系统主时钟频率为32MHZ   
   
    InitUart();                                //调用串口初始化函数   
    UartState = UART0_RX;                      //串口0默认处于接收模式
    memset(RxData, 0, SIZE);
    
    while(1)
    {
        if(UartState == UART0_RX)              //接收状态 
        { 
            if(RxBuf != 0) 
            {                 
                if((RxBuf != '#')&&(count < 50))//以'#'为结束符,一次最多接收50个字符            
                    RxData[count++] = RxBuf; 
                else
                {
                    if(count >= 50)             //判断数据合法性,防止溢出
                    {
                        count = 0;              //计数清0
                        memset(RxData, 0, SIZE);//清空接收缓冲区
                    }
                    else
                        UartState = UART0_TX;  //进入发送状态 
                }
                RxBuf  = 0;
            }
        }
        
        if(UartState == UART0_TX)              //发送状态 
        {                         
            U0CSR &= ~0x40;                    //禁止接收 
            UartSendString(RxData, count);     //发送已记录的字符串。
            U0CSR |= 0x40;                     //允许接收 
            UartState = UART0_RX;              //恢复到接收状态 
            count = 0;                         //计数清0
            memset(RxData, 0, SIZE);           //清空接收缓冲区
        }    
    }
}