打印
[STM8]

串口接收中断怎么接收字符串数据

[复制链接]
4552|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yp9770|  楼主 | 2016-7-27 14:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
@far @interrupt void USART_RX_IRQHandler (void)
{
      UART_Recive();
      return;
}

unsigned char UART_Recive(void)
{       
      uint8_t UART1_Re_Buf;
     while (!(USART1_SR & UART1_FLAG_RXNE));
        UART1_Re_Buf=((uint8_t)USART1_DR);
     return  UART1_Re_Buf;
}
这种接收,每次只能接到一个字符,如果发送过来的是字符串,stm8中怎么获得字符串的长度,求大神指导如何接收的?
沙发
moyanming2013| | 2016-7-27 14:15 | 只看该作者
采用中断+查询的方式接收。
就是中断开始接受第一个字节,然后后面的就在中断里查询接受剩余的,当然这里面应该有个超时退出。

使用特权

评论回复
板凳
yp9770|  楼主 | 2016-7-27 14:19 | 只看该作者
moyanming2013 发表于 2016-7-27 14:15
采用中断+查询的方式接收。
就是中断开始接受第一个字节,然后后面的就在中断里查询接受剩余的,当然这里面 ...

我看了STM8串口的寄存器,就是不知道接收到一个字符后,怎么获得下一个字符,怎么获得发送的字符串长度

使用特权

评论回复
地板
atuohao737| | 2016-7-27 14:33 | 只看该作者
我最近也在学这个,不过我连中断都进不去,折腾2天了,毫无头绪,求解

使用特权

评论回复
5
yp9770|  楼主 | 2016-7-27 14:41 | 只看该作者
atuohao737 发表于 2016-7-27 14:33
我最近也在学这个,不过我连中断都进不去,折腾2天了,毫无头绪,求解

主函数
main()
{
        USART_Configuration();
         _asm("rim");
}
中断函数
@far @interrupt void USART_RX_IRQHandler (void)
{
      UART_Recive();
      return;
}
中断向量
{0x82, (interrupt_handler_t)USART_RX_IRQHandler}, /* irq18 */

串口函数
#include "uart.h"
#include <stdarg.h>
#include <stdio.h>
#include <iostm8s.h>

#define HSIClockFreq 16000000
#define BaudRate  115200
#define UART1_FLAG_TXE  (uint8_t)0x80  /*!< Transmit Data Register Empty flag */
#define UART1_FLAG_RXNE (uint8_t)0x20 /*!< Read Data Register Not Empty flag */

void USART_Configuration(void)//串口初始化函数
  {  
    unsigned int baud_div=0;
    USART1_CR1 = (0<<4)|(0<<3)|(0<<2)|(0<<1)|(0<<0);
    USART1_CR3 = (0<<6)|(0<<4)|(0<<3);
    USART1_CR2 = (0<<7)|(0<<6)|(1<<5)|(0<<4)|(1<<3)|(1<<2);
    USART1_CR5 = (0<<2)|(0<<1);     
   
    //设置波特率
    baud_div =HSIClockFreq/BaudRate;  //分频因子
    USART1_BRR2 = baud_div & 0x0f;
    USART1_BRR2 |= ((baud_div & 0xf000) >> 8);
    USART1_BRR1 = ((baud_div & 0x0ff0) >> 4);
   
    USART1_CR1 |= (0<<5);         /*使能UART*/
  }               

void UART_send_byte(unsigned char byte) //发送1字节数据
{
   USART1_DR=((unsigned char)byte);
  /* Loop until the end of transmission */
   while (!(USART1_SR & UART1_FLAG_TXE));
}               

void UART_Send(unsigned char *Buffer, unsigned short Length)
{
  uint16_t l=0;
  for(;l<Length;l++)
    UART_send_byte(Buffer[l]);
}
uint16_t i=0;
uint8_t UART1_Re_Buf[10];
unsigned char UART_Recive(void)
{       
//     while (!(USART1_SR & UART1_FLAG_RXNE));
                 if((USART1_SR & UART1_FLAG_RXNE))
                 {
                        if(i<5)
                                UART1_Re_Buf[i++]=((uint8_t)USART1_DR);
                 }
     return  0;
}

使用特权

评论回复
6
yp9770|  楼主 | 2016-7-27 14:43 | 只看该作者
可以了
//     while (!(USART1_SR & UART1_FLAG_RXNE));
把while等待换成if就OK了

使用特权

评论回复
7
atuohao737| | 2016-7-27 15:21 | 只看该作者

这是你调好的完整的程序吗?谢谢

使用特权

评论回复
8
atuohao737| | 2016-7-27 15:31 | 只看该作者
yp9770 发表于 2016-7-27 14:43
可以了
//     while (!(USART1_SR & UART1_FLAG_RXNE));
把while等待换成if就OK了

你好我用的STM8L052R9    中断服务函数应该去哪个库里查

使用特权

评论回复
9
蝙蝠侠| | 2016-8-18 17:52 | 只看该作者
开两块内存?

使用特权

评论回复
10
紫气东升| | 2016-8-22 08:39 | 只看该作者
本帖最后由 紫气东升 于 2016-8-22 08:46 编辑

楼主是用库函数写的吗,求楼主给个完整的程序看看,谢谢

使用特权

评论回复
11
紫气东升| | 2016-8-22 08:40 | 只看该作者
atuohao737 发表于 2016-7-27 14:33
我最近也在学这个,不过我连中断都进不去,折腾2天了,毫无头绪,求解

我的也是进不了中断

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

1

粉丝