[STM8] 串口的接收数据

[复制链接]
6179|32
 楼主| shaowei2072009 发表于 2013-6-3 10:17 | 显示全部楼层 |阅读模式
#include "stm8s.h"
#include "stm8s_uart2.h"
#include "stm8s_gpio.h"
#include "stm8s_clk.h"
#include "stdio.h"

void Delay(u16 time)
{
  while(time != 0)
  {
    time--;
  }
}
//初始化串口   波特率115200,8位数据位 1位停止位,无奇偶校验
//查询发送,中断方式接收。
void UART_Init(void)
{
    UART2_DeInit();
    UART2->BRR2 = 0X01; //设置波特率为9600
    UART2->BRR1 = 0X34;
    UART2->CR2 = 0X2C;  //设置串口中断,允许接收发送
   // UART2_Cmd(ENABLE);
}


void Init_CLK(void)
{

  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV2);//设置主频为内部高速时钟,8MHz
}


void main(void)
{
  Init_CLK();
  enableInterrupts();
  UART_Init();
  while(1);
}       

#pragma vector=0x14
__interrupt void UART2_RX_IRQHandler(void)
{
   unsigned int temp;

   temp = UART2->DR;

   while((UART2->SR & 0x80) == 0x00);  //等待发送寄存器为空
   Delay(1);
   temp++;
   UART2->DR = temp;                    //接收到的数据加一发送回去
}                  
   这是我的源码,想把接收到的数据加一在发送出去,但是每次串口助手收到的数据跟发送的一样,要么就会出现乱码,都没成功过,是我的程序还是有什么地方要设置,请大神详解。。。。在线等待

grasswolfs 发表于 2013-6-3 10:41 | 显示全部楼层
能确定“串口助手收到的数据跟发送的一样”。这个数据是串口发出来的么?

评分

参与人数 1威望 +3 收起 理由
shaowei2072009 + 3

查看全部评分

 楼主| shaowei2072009 发表于 2013-6-3 10:51 | 显示全部楼层
grasswolfs 发表于 2013-6-3 10:41
能确定“串口助手收到的数据跟发送的一样”。这个数据是串口发出来的么? ...

这个不能确定,但是我每次修改数的值也是发送回相同的值.有什么方法确定这个数不是串口发出的呢?难道的用示波器看
xiaolanghahaha 发表于 2013-6-3 10:57 | 显示全部楼层
最重要的是检查一下串口的波特率是不是完全一致,一定要保证完全一致才行
 楼主| shaowei2072009 发表于 2013-6-3 11:00 | 显示全部楼层
xiaolanghahaha 发表于 2013-6-3 10:57
最重要的是检查一下串口的波特率是不是完全一致,一定要保证完全一致才行 ...

波特率设置没有问题
grasswolfs 发表于 2013-6-3 11:03 | 显示全部楼层
shaowei2072009 发表于 2013-6-3 10:51
这个不能确定,但是我每次修改数的值也是发送回相同的值.有什么方法确定这个数不是串口发出的呢?难道的用 ...

你把里面的返向发回注释掉,看看还有没有这个数据,然后再在里面写一个固定的数据发回,看看能够正常发回?
 楼主| shaowei2072009 发表于 2013-6-3 11:37 | 显示全部楼层
grasswolfs 发表于 2013-6-3 11:03
你把里面的返向发回注释掉,看看还有没有这个数据,然后再在里面写一个固定的数据发回,看看能够正常发回 ...

写固定的数发不出去,我看UART寄存器的值没有发生变化,是不是没有进入中断。配置应该没得什么问题把。
mmuuss586 发表于 2013-6-3 11:55 | 显示全部楼层
8没玩过,只玩过M4
grasswolfs 发表于 2013-6-3 12:07 | 显示全部楼层
shaowei2072009 发表于 2013-6-3 11:37
写固定的数发不出去,我看UART寄存器的值没有发生变化,是不是没有进入中断。配置应该没得什么问题把。 ...

那说明确实你收到的不是串口发出来的,先看一下stm8串口官方的例程吧
 楼主| shaowei2072009 发表于 2013-6-3 12:20 | 显示全部楼层
grasswolfs 发表于 2013-6-3 12:07
那说明确实你收到的不是串口发出来的,先看一下stm8串口官方的例程吧

如果我接收到的数据,用IAR的寄存器查看器是否可以看到DR的值发生变化呢
grasswolfs 发表于 2013-6-3 12:22 | 显示全部楼层
shaowei2072009 发表于 2013-6-3 12:20
如果我接收到的数据,用IAR的寄存器查看器是否可以看到DR的值发生变化呢

你是说单片机内部接收么?如果接到了而且进入中断了,应该是能看到变化的

评分

参与人数 1威望 +3 收起 理由
shaowei2072009 + 3

查看全部评分

haitian5002 发表于 2013-6-3 12:44 | 显示全部楼层
你在中断中做太多事了,里面还有一个DELAY,肯定会影响接收和发送数据,建议先试试接收一段数据和发送一段数据,看看是否正常,正常了,可以再试接收后发送的情况,若是要接收一段数据的话,接收完了之后再置标志位,并在主程序中发送
 楼主| shaowei2072009 发表于 2013-6-3 12:55 | 显示全部楼层
grasswolfs 发表于 2013-6-3 12:22
你是说单片机内部接收么?如果接到了而且进入中断了,应该是能看到变化的 ...

那应该是没有进入中断,不然寄存器的值会发生变化的。
grasswolfs 发表于 2013-6-3 13:49 | 显示全部楼层
shaowei2072009 发表于 2013-6-3 12:55
那应该是没有进入中断,不然寄存器的值会发生变化的。

嗯,找一个例程看看吧,自己第一次写调不出来是非常正常的
 楼主| shaowei2072009 发表于 2013-6-3 13:59 | 显示全部楼层
grasswolfs 发表于 2013-6-3 13:49
嗯,找一个例程看看吧,自己第一次写调不出来是非常正常的

例程也看了,基本都是这么写,例程里都说可以,但是我的还是不行。郁闷啊,调了一天,也没弄对。无语
grasswolfs 发表于 2013-6-3 14:07 | 显示全部楼层
shaowei2072009 发表于 2013-6-3 13:59
例程也看了,基本都是这么写,例程里都说可以,但是我的还是不行。郁闷啊,调了一天,也没弄对。无语 ...

硬件是开发板么?还是自己做的,别的程序可以跑么?
 楼主| shaowei2072009 发表于 2013-6-3 14:48 | 显示全部楼层
grasswolfs 发表于 2013-6-3 14:07
硬件是开发板么?还是自己做的,别的程序可以跑么?

开发板,用的IAR编译器。其他的程序都是正常的,就是串口输出有问题,而且寄存器DR的都不会发生变化。
huiguang_1 发表于 2013-6-3 15:08 | 显示全部楼层
你先用示波器看一下,你确定有波形输出吗?
huiguang_1 发表于 2013-6-3 15:09 | 显示全部楼层
你程序其他部分有AD相关的配置没有?

评分

参与人数 1威望 +2 收起 理由
shaowei2072009 + 2

查看全部评分

huiguang_1 发表于 2013-6-3 15:10 | 显示全部楼层
AD_TDR这个寄存器是设置禁止施密特触发的,STM8的串口和采样口是复用的,采样口配置为禁止施密特触发了,可能会影响到你的串口功能。

评分

参与人数 1威望 +1 收起 理由
shaowei2072009 + 1

查看全部评分

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

本版积分规则

23

主题

108

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部