发新帖我要提问
123
返回列表
打印

求助STM32的USART2中断接收死机问题。

[复制链接]
楼主: llycom
手机看帖
扫描二维码
随时随地手机跟帖
41
caedmon| | 2012-4-9 01:14 | 只看该作者 回帖奖励 |倒序浏览
类似的问题,485总线代50个节点,要么是某个节点不响应总召命令(估计是 节点没有正确读出命令行),要不就是导致主程序要做的事情超时而发送错误数据给上位机,并且无法跳出这个循环。

使用特权

评论回复
42
caedmon| | 2012-4-9 01:22 | 只看该作者
用串口软件以1s的速度不断发送指令给单个节点,运行24小时也不会出错。10个节点的时候,有时候4个小时也不出错,50个的时候,最快20分钟,最慢1个多小时,某个随机节点就开始出错。50个节点,平均50s才被召唤一次,虽然总线上也一直有数据来来往往,单个节点也会不断进入中断判断是否是召唤自己的命令,但和串口调试单个节点的状况也没什么区别啊。

使用特权

评论回复
43
Xflyan| | 2012-4-9 09:26 | 只看该作者
Mark,最近两天也在测试MODBUS,不过现在是用STM8的,今天换换STM32试试...

使用特权

评论回复
44
pattywu| | 2012-5-5 01:34 | 只看该作者
直接DMA接收,多简单啊。
    1> 初始化USART,开USART时钟,开DMA时钟,设置波特率、数据位、停止位等,开USART接收、发送,开接收中断,开USART,设置USART、DMA接收通道、DMA发送通道优先级;
    2> 在USART中断处理函数里,判断接收标志,填接收DMA通道的地址、接收数据量(比实际数据帧大就行),等,关USART接收中断,开空闲中断;
    3> 在USART中断处理函数里,判断空闲标志,接收数据长度 = 上述2中的接收DMA数据量长度-接收DMA当前数据量长度。接收一帧数据结束,开启接收中断。

使用特权

评论回复
45
walnutcy| | 2012-5-5 07:43 | 只看该作者
overflow吧,做循环队列,你中断与应用交互的机制有问题。

使用特权

评论回复
46
tycho41| | 2013-5-28 17:23 | 只看该作者
看了这么久,还是没有看到问题怎么解决的啊,我也陷入了这个坑里好多天了,不知道楼主解决没有,求解求解啊!!!!!!!!!!!!

使用特权

评论回复
47
Adams5001| | 2013-5-30 22:37 | 只看该作者
我也遇到这种情况了

使用特权

评论回复
48
liuje| | 2013-6-1 13:26 | 只看该作者
我也碰到了啊 .    MODBUS RTU的模式.     運行不了10分鐘必死機....    太怪了.
我的代碼如下 ,  不管有沒有加入溢位處理   都會死機....   求解 !!!


void USART2_IRQHandler(void)                        //串口2中斷服務程序(modbus master)
{                                                                 
        if(USART_GetITStatus(USART2, USART_IT_RXNE) ==SET)                  //接收中斷
        {
            USART_ClearITPendingBit(USART2,USART_IT_RXNE);
                if(USART_GetFlagStatus(USART2,USART_FLAG_PE)==RESET) //檢查奇偶校驗是否錯誤
                {
                        receBuf2[receCount2]= USART_ReceiveData(USART2);
                        if (!(receBuf2[receCount2]==0 && receCount2==0))  // 丟棄第1個收到的無效字元
                        {
                        receCount2++;          //接收地址偏移寄存器加1
                                Timer2_enable();       //每接收到一個字元後, 觸發內部定時中段2   
                        }
                }
        }  
       
//         if(USART_GetFlagStatus(USART2,USART_FLAG_ORE)==SET)           // 溢出處理
//        {
//                USART_ClearFlag(USART2,USART_FLAG_ORE); //讀SR其實就是清除標志
//                USART_ReceiveData(USART2);              //讀DR
//         }

    if(USART_GetITStatus(USART2,USART_IT_TC) == SET)        // 傳輸完成時中段
        {
                USART_ITConfig(USART2,USART_IT_RXNE,DISABLE);  // 發送時先關閉接收中段
                USART_ClearFlag(USART2,USART_FLAG_TC);                 //注意這個地方的寫法,stm32串口發送中斷的寫法,要清零標誌位
                if(sendPosi2 < sendCount2)
            {
                sendPosi2++;
                USART_SendData(USART2,sendBuf2[sendPosi2]);                          // 發送資料                  
            }
            else
            {
                    receCount2 = 0;   //清接收地址偏移寄存器//
                        checkoutError2 = 0;
                    receEnable2();    //發送完後將485置於接收狀態  
                        USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);          // 允許接收中段
            }
        }
               
}

使用特权

评论回复
49
liuje| | 2013-6-1 13:29 | 只看该作者
加註,  另外我還經常碰到 發送MODBUS命令後, 回應的資料第1個字元都是00 ,   非常怪異.     就是每次接收一開始都會多一個字元.
之後的資料都正常.   於是我在軟件上做了判斷,  直接丟棄了這個多收的 "00" 字元.     資料發送跟接收才完全正常.

現在就是運行不了太久會死機的問題還無解 !!!

使用特权

评论回复
50
wgh1990| | 2014-11-22 15:08 | 只看该作者
我也遇到了 我的波特率是250000 在线调试发现死机一直有ORE 偶尔还有PE 中断  

使用特权

评论回复
51
Ketose| | 2014-11-22 16:04 | 只看该作者
llycom 发表于 2010-5-6 12:20
谢谢楼上顶贴,问题没有解决,目前还是在计数置位后加延时2MS来工作的。
void USART2_IRQHandler(void){
        / ...

楼主的程序有问题,假如你的USART2已经把数据接收满了,这个时候RS485rxcont = 7,你的数组的最大容量,你的主程序在这个时候,如果还没有到达RS485rxcont = 0这句,又来了数据,结果中断要抢先了,不好意思这个时候就发生了数组越界,后面的结果就不能想像了。

解决这个问题:1、可以用双缓冲。
2、把Rs485Rx定义的大些,在第8位设置越界标志。主程序判断这个标志位就知道是否通讯正常。

使用特权

评论回复
52
梦星的小玄| | 2015-12-28 23:30 | 只看该作者
请问楼主,您最后的问题是怎么解决的,就是在判断接受够7位数据够,延时2毫秒吗?

使用特权

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

本版积分规则