微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 我用stm8l052c6t6 gpio 模拟串口, 发送正常,接收异常

我用stm8l052c6t6 gpio 模拟串口, 发送正常,接收异常

时间:10-02 整理:3721RD 点击:
现在我的模拟串口和PC端通信正常, 和我们的光电模块终端通信的时候,接收的数据有问题, 但是截取报文, pc解析正常,说明还是我的串口解析的问题。
以下是pc 解析的数据(正确的)
FE FE FE 68 10 14 00 00 00 00 00 00 81 09 90 1F 00 00 07 01 00 00 FF CC 16
我的串口解析的数据:
FE FE FE 68 10 14 00 00 00 00 00 00 81 4B 90 FB 1C 00 07 01 00 00 FF 63 B3 FC
我的思路是接收引脚外部中断,进入中断后关闭中断, 延时一段时间, 开启定时器, 依次检测引脚电平, 读完8个数据位后,开始时钟同步,即检测一个下降沿,开始下一个字节的读取。
以下是我的时钟同步部分代码
/*
* 同步串口时钟
*/
unsigned long my_count = 0;
void    sync_clock(void)
{
   BitStatus old_val, new_val;
   disableInterrupts();
   old_val = read_rx_line();
   disableInterrupts();
    while(my_count< 5000)
    {
       new_val = read_rx_line();
      
        //  检测到下降沿,即起始位
        if(old_val == SET && new_val== RESET)
          break;
        old_val = new_val;
        my_count++;
    }
  
    my_count = 0;
    enableInterrupts();
    rx_flag = 0;
    //stop timer
    TIM3->CR1 &= (uint8_t)(~TIM_CR1_CEN);
    TIM3->CR1 &= ~TIM_CR1_CEN;
    TIM3->CNTRH = 0;//timer3_val >> 8;
    TIM3->CNTRL = 5;//timer3_val & 0xff;
    TIM3->CR1 |=  TIM_CR1_CEN;
}
我有以下疑问, 异步通信每一个字节都是相互独立的,每个字节停止位都进行了时钟同步,不存在累积误差,前面的数据正常, 中间的数据突然异常, 初步断定是中断引起的, 但是除了用于产生接收中断的定时器3 以外, 我没有开其他中断啊,降低波特率也不行, 搞了好多天, 求大神们给我支支招啊,万分感谢!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top