1983|4

67

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

stm8903串口通讯 [复制链接]

我在发送程序中,写了条指令发送给电脑,数据一致,但我在用电脑的串口工具发送数据时,在接收中断程序中数据不一致?不知道为什么,求大神指教。@far @interrupt void UART1_Recv_IRQHandler (void)//接收中断服务函数
{
        u8 static Checksum,Lencnt=0;
        if(UartState == UartStart)
        {
                if(UART1_DR == RxHeader)
                {
                        UartState = UartWorking;
                        Checksum = UART1_DR;
                        UART_Header = RxHeader;
                }
                else if(UART1_DR == RxHeader1)               
                {
                        UartState =  UartWorking;
                        Checksum = UART1_DR;
                        UART_Header = RxHeader1;
                }
                else
                {
                        UartState = UartStart;
                        Lencnt = 0;
                        Checksum = 0;
                }
        }
        else if(UartState == UartWorking)
        {
                if(++Lencnt<14)
                {
                        Checksum += UART1_DR;
                        rxControllerInfobuf[Lencnt] = UART1_DR;
                        if(Lencnt == 13)
                        UartState = UartCheck;
                        else
                        UartState = UartWorking;
                }
        }
        else if(UartState == UartCheck)
        {
                if(Checksum == UART1_DR)
                {
                        rxControllerInfobuf[14] = UART1_DR;
                        UartState = UartOver;
                }
                else
                {
                        UartState = UartReset;
                }
        }
        else if(UartState == UartOver)
        {
                if(UART1_DR == Enterkey)
                {
                        UARTREADREADY = 1;
                        UartState = UartReset;
                }
                else
                {
                        UartState = UartReset;
                }
        }
        else if(UartState == UartReset)
        {
                Checksum = 0;       
                Lencnt = 0;
                UARTREADREADY = 0;
                UartState = UartStart;
        }
        else
        {
                Checksum = 0;       
                Lencnt = 0;
                UARTREADREADY = 0;
                UartState = UartStart;
        }
}

此帖出自stm32/stm8论坛

最新回复

个人建议,如果碰到void UART1_Recv_IRQHandler (void)这样的中断函数。 建议是 //系统的中断服务函数 void UART1_Recv_IRQHandler (void) {   //Flag 置位   uart_IRQ_handle();//中断处理函数 //执行完成清标志位或者怎样 } //在系统的中断服务函数外,单独写uart_IRQ_handle()的函数体 void uart_IRQ_handle(void) {   //函数体 }复制代码 这样的写法,不显得混乱,而且我个人觉得程序的可读性更强一些。 你的片子没有用过,不好意思,其他地方没有仔细看。   详情 回复 发表于 2017-8-21 21:47
点赞 关注
 

回复
举报

67

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
硬件估计没什么问题,就是接收的数据不同,是不是程序的原因?
此帖出自stm32/stm8论坛
 
 

回复

6040

帖子

196

TA的资源

版主

板凳
 
遇到这种情况要学会调试
然后具体问题具体分析
你只是说了一个接收的数据不同,问题都没描述清楚
另外在串口中断里,最好把UART1_DR一次性读出来,存储到变量里面。
此帖出自stm32/stm8论坛
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

4
 
个人建议,如果碰到void UART1_Recv_IRQHandler (void)这样的中断函数。
建议是
//系统的中断服务函数

  1. void UART1_Recv_IRQHandler (void)
  2. {
  3.   //Flag 置位
  4.   uart_IRQ_handle();//中断处理函数
  5. //执行完成清标志位或者怎样

  6. }
  7. //在系统的中断服务函数外,单独写uart_IRQ_handle()的函数体
  8. void uart_IRQ_handle(void)
  9. {
  10.   //函数体
  11. }
复制代码


这样的写法,不显得混乱,而且我个人觉得程序的可读性更强一些。

你的片子没有用过,不好意思,其他地方没有仔细看。




此帖出自stm32/stm8论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(中级)

5
 
谢谢指点
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表