stm8s103f3串口接收数据串问题

2019-07-19 20:52发布

我用stm8s103f3做串口的数据收发,数据发送正常,但是数据接收不管是中断方式还是轮训方式都无法接收数据串,只能收到每次数据串的第一个字节,下面是我的程序:[mw_shl_code=c,true]static volatile char rx;
static volatile bool new_rx = FALSE;
void main(void)
{
  ErrorStatus clk_return_status = ERROR;
  clk_return_status = CLK_ClockSwitchConfig(CLK_SWITCHMODE_MANUAL, CLK_SOURCE_HSE, DISABLE, CLK_CURRENTCLOCKSTATE_ENABLE);
  if (clk_return_status == SUCCESS)  //SUCCESS or ERROR
  {
    CLK_HSECmd(ENABLE);
    CLK_HSICmd(DISABLE);
    CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV4);
  }
  
  led_init();
  UART1_Init((u32)460800, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);
  UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);
  UART1_Cmd(ENABLE);
  
  enableInterrupts();
  
  led_on(0);  
  
  while(1)
  {
    if(new_rx)
    {
      new_rx = FALSE;
      UART1_SendData8(rx);
      led_toggle(0);
    }
  }
}

//UART1 RX Interrupt routine.
INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18)
{
  new_rx = TRUE;
  UART1_GetITStatus(UART1_IT_OR);
  if(UART1_GetITStatus(UART1_IT_RXNE))
  {
    rx = UART1_ReceiveData8();
  }
}[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
fankai
1楼-- · 2019-07-20 02:38
本帖最后由 fankai 于 2017-3-22 12:44 编辑

我这里用的是stm8152k4,接收字符串,在发送回来,没问题[mw_shl_code=c,true]u8 receive_data[50];
u8 receive_data_num = 0;        //接收字节数,以0x0d,0x0a结束
u8 end_flag = 0;

/*
名称:usart_init
功能:初始化串口
输入:无
输出:无
*/
void usart_init()
{
        
        //打开时钟
        CLK_PeripheralClockConfig(CLK_Peripheral_USART1,ENABLE);
        //初始化参数,115200N81
        USART_Init(USART1,115200,USART_WordLength_8b,USART_StopBits_1,USART_Parity_No,USART_Mode_Tx|USART_Mode_Rx);
        //使能接收中断
        USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
        //打开串口
        USART_Cmd(USART1, ENABLE);
        enableInterrupts();
}

//中断配置函数
INTERRUPT_HANDLER(USART1_RX_TIM5_CC_IRQHandler,28)
{
        if(USART_GetITStatus(USART1, USART_IT_RXNE))                         //判断中断标志
        {
                USART_ClearITPendingBit(USART1, USART_IT_RXNE);                //清除标志
                if(0x00 == end_flag)                                                                //没结束
                {
                        if(USART_ReceiveData8(USART1) == 0x0d)
                        {
                                end_flag = 0x0d;                //赋值0x0d        
                        }
                        else
                        {
                                receive_data[receive_data_num] = USART_ReceiveData8(USART1);
                                receive_data_num++;
                        }
                }
                else if(0x0d == end_flag)                //等于0x0d的时候,再检测是否等于0x0a
                {
                        if(USART_ReceiveData8(USART1) == 0x0a)
                        {
                                end_flag = 0x0a;                //赋值0x0a,一串数据接收完毕        
                                receive_data_num = 0;
                        }
                        else
                        {
                                //接收错误
                                  printf("数据接收错误 ");
                                end_flag = 0x00;                //重新开始接收
                                receive_data_num = 0;
                        }
                }
        }
}


int putchar(int ch)                 //重新定义
{
        // 将Printf内容发往串口
        USART_SendData8(USART1,(unsigned char) ch);
        while (!USART_GetFlagStatus(USART1,USART_FLAG_TXE));//如果发送未完成, //标志位未置位,则循环等待
        return (ch);
}

void main(void)
{
        delay_init();
//        lowpower_init();
        usart_init();

    while (1)
    {
                if(0x0a == end_flag)
                {
                        end_flag = 0x00;
                        //接收完毕
                        printf("%s ",receive_data);
                        LED_ON;
                        delay_ms(10);
                        LED_OFF;
                        
                }
    }
  
}
[/mw_shl_code]

fankai
2楼-- · 2019-07-20 06:30
第一、接收中断里面,标志位置位了应该清除标志位,否则下次不能进入,所以只收到了一个字节
第二、要接收字符串,得定义一个数组,依次把所有的字节都存下来,程序里,即使能够接收多个字节了,后面的也会把前面的覆盖,while循环里,每接收一个字节就会发送出去,但在接收多个字节的时候,估计只能发送有限的几个字节,中断优先,直接把前面的值覆盖了
正点原子
3楼-- · 2019-07-20 08:04
 精彩回答 2  元偷偷看……
旦丁中号
4楼-- · 2019-07-20 08:25
按照手册说的,读SR寄存器和读DR寄存器可以清除相应的标志位,而且如果是因为没有清标志位的话,应该是收到第一个字节后一直就循环进入中断了。然后我用下面这个程序来累计进入rx中断的次数,不管我从串口助手一次性发送
多少个字节的数据,这个rx_it_cnt每次只累加1

[mw_shl_code=c,true]INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18)
{
  
  rx_it_cnt++;
  UART1_GetITStatus(UART1_IT_OR);
  rx = UART1_ReceiveData8();
}[/mw_shl_code]
fankai
5楼-- · 2019-07-20 12:11
 精彩回答 2  元偷偷看……
旦丁中号
6楼-- · 2019-07-20 13:45
 精彩回答 2  元偷偷看……

一周热门 更多>