OpenEdv-开源电子网

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

STM32如何将温度值发到串口啊?

[复制链接]

13

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
133
金钱
133
注册时间
2015-12-21
在线时间
17 小时
发表于 2016-2-29 07:37:34 | 显示全部楼层 |阅读模式
1金钱
各位大师,我在电脑上做好了上位程序,从串口读温度,

STM32上连有温度感应器,如何将温度值发到串口啊?给个表达式,如我写了:

tem=dsb20.gettemperature();获取了温度,

然后用什么表达式将tem发到串口1啊?

请指教。


最佳答案

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

1592

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2622
金钱
2622
注册时间
2014-7-17
在线时间
350 小时
发表于 2016-2-29 07:37:35 | 显示全部楼层
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-2-29 08:31:08 | 显示全部楼层
参考开发指南相应章节、例程
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2016-3-7
在线时间
15 小时
发表于 2016-4-4 14:57:58 | 显示全部楼层
unsigned  char tempbuf[4],i; short temper;
回复

使用道具 举报

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2016-3-7
在线时间
15 小时
发表于 2016-4-4 14:58:23 | 显示全部楼层
unsigned  char tempbuf[4],i; short temper;    void uart_init(u32 bound){   //GPIO端口设置   GPIO_InitTypeDef GPIO_InitStructure;         USART_InitTypeDef USART_InitStructure;         NVIC_InitTypeDef NVIC_InitStructure;                   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);        //使能USART1,GPIOA时钟            //USART1_TX   GPIOA.9   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出   GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9       //USART1_RX          GPIOA.10初始化   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入   GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10      //Usart1 NVIC 配置   NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //子优先级3         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能         NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器       //USART 初始化设置          USART_InitStructure.USART_BaudRate = bound;//串口波特率         USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式         USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位         USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //收发模式    USART_Init(USART1, &USART_InitStructure); //初始化串口1   USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断   USART_Cmd(USART1, ENABLE);                    //使能串口1   }  //void USART1_IRQHandler(void)                        //串口1中断服务程序 //        { //        u8 Res; //#if SYSTEM_SUPPORT_OS                 //如果SYSTEM_SUPPORT_OS为真,则需要支持OS. //        OSIntEnter();     //#endif //        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾) //                { //                Res =USART_ReceiveData(USART1);        //读取接收到的数据 //                 //                if((USART_RX_STA&0x8000)==0)//接收未完成 //                        { //                        if(USART_RX_STA&0x4000)//接收到了0x0d //                                { //                                if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始 //                                else USART_RX_STA|=0x8000;        //接收完成了  //                                } //                        else //还没收到0X0D //                                {         //                                if(Res==0x0d)USART_RX_STA|=0x4000; //                                else //                                        { //                                        USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ; //                                        USART_RX_STA++; //                                        if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收           //                                        }                  //                                } //                        }                     //     }  #if SYSTEM_SUPPORT_OS         //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.         OSIntExit();                                                                                            #endif   #endif         void send(char *str) {                  do{                                 USART_SendData(USART1 , *str++);                                 while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);                                          }                 while(*str);  }         void sendtemp(void)          {                         temper=DS18B20_Get_Temp();                 sprintf(tempbuf,"%5.1f",temper/10.0);                         send(tempbuf); } void sendlise(void)          {                         temper=DS18B20_Get_Temp();                 sprintf(tempbuf,"%5.1f",temper/10.0);                         send(tempbuf); }
回复

使用道具 举报

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2016-3-7
在线时间
15 小时
发表于 2016-4-4 14:59:00 | 显示全部楼层
[mw_shl_code=c,true]unsigned  char tempbuf[4],i;
short temper;
  
void uart_init(u32 bound){
  //GPIO端口设置
  GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
         
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);        //使能USART1,GPIOA时钟
  
        //USART1_TX   GPIOA.9
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
   
  //USART1_RX          GPIOA.10初始化
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  

  //Usart1 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //子优先级3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器
  
   //USART 初始化设置

        USART_InitStructure.USART_BaudRate = bound;//串口波特率
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
        USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
        USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //收发模式

  USART_Init(USART1, &USART_InitStructure); //初始化串口1
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
  USART_Cmd(USART1, ENABLE);                    //使能串口1

}

//void USART1_IRQHandler(void)                        //串口1中断服务程序
//        {
//        u8 Res;
//#if SYSTEM_SUPPORT_OS                 //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
//        OSIntEnter();   
//#endif
//        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
//                {
//                Res =USART_ReceiveData(USART1);        //读取接收到的数据
//               
//                if((USART_RX_STA&0x8000)==0)//接收未完成
//                        {
//                        if(USART_RX_STA&0x4000)//接收到了0x0d
//                                {
//                                if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
//                                else USART_RX_STA|=0x8000;        //接收完成了
//                                }
//                        else //还没收到0X0D
//                                {       
//                                if(Res==0x0d)USART_RX_STA|=0x4000;
//                                else
//                                        {
//                                        USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
//                                        USART_RX_STA++;
//                                        if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收          
//                                        }                 
//                                }
//                        }                    
//     }
#if SYSTEM_SUPPORT_OS         //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
        OSIntExit();                                                                                           
#endif

#endif       
void send(char *str)
{

                do{
                                USART_SendData(USART1 , *str++);
                                while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
                       
                }
                while(*str);

}       
void sendtemp(void)
       
{               
        temper=DS18B20_Get_Temp();
                sprintf(tempbuf,"%5.1f",temper/10.0);
                        send(tempbuf);
}
void sendlise(void)
       
{               
        temper=DS18B20_Get_Temp();
                sprintf(tempbuf,"%5.1f",temper/10.0);
                        send(tempbuf);
}
[/mw_shl_code]
回复

使用道具 举报

5

主题

86

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1535
金钱
1535
注册时间
2015-2-4
在线时间
285 小时
发表于 2016-4-5 05:45:48 | 显示全部楼层
大海的路 发表于 2016-4-4 14:59
[mw_shl_code=c,true]unsigned  char tempbuf[4],i;
short temper;
  

问题的关键点是串口如何传递16位信号,程序有很多地方看不太明白,能给出完成的程序出处吗?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 14:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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