打印

232通信

[复制链接]
1000|27
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tian111|  楼主 | 2017-11-12 12:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

用232进行通信;当外接串口的电压稳定时,通讯正常;当串口电压波动(如电脑串口断电)时,单片机就容易死机,请问这种情况该怎么去解决?
沙发
songqian17| | 2017-11-12 12:05 | 只看该作者
用的啥芯片通信?

使用特权

评论回复
板凳
chenho| | 2017-11-12 12:07 | 只看该作者

程序问题 多考虑一下通信出错的情况 针对性处理

使用特权

评论回复
地板
gongche| | 2017-11-12 12:09 | 只看该作者

响应哪些指令
并做什么处理,可能误判指令了,然后等待什么数据.

使用特权

评论回复
5
tian111|  楼主 | 2017-11-12 12:11 | 只看该作者

MAX202E,电容是0.1UF的

使用特权

评论回复
6
huwr| | 2017-11-12 12:12 | 只看该作者


如果只发生在电压波动时,
也可能是硬件发生死锁了

使用特权

评论回复
7
huanghuac| | 2017-11-12 12:15 | 只看该作者
加上看门狗吧,只有这样。其它的基本上没法,除非电路重新布,减小干扰,再加上隔离应该好些。

使用特权

评论回复
8
happy_10| | 2017-11-12 12:17 | 只看该作者

给串口加级隔离吧

使用特权

评论回复
9
tian111|  楼主 | 2017-11-12 12:19 | 只看该作者
本人认为程序问题的可能性很小,因为只要不触动电脑电源,接发数据都很正常。一旦电源有变化,如关掉显示器电源,就会马上死机,而且这时串口上有很大的静电;把串口线改为屏蔽线,效果要好很多,但偶尔还是会有死机,应该属于干扰。

使用特权

评论回复
10
bqyj| | 2017-11-12 12:21 | 只看该作者
在 串口两根线和 地线之间 并两个 6.8V左右的TVS 二极管

使用特权

评论回复
11
wenfen| | 2017-11-12 12:24 | 只看该作者

串口隔离办法
单片面的TTL里加光藕,再接上232电平转换器上,如果还不知道,来信号

使用特权

评论回复
12
wenfen| | 2017-11-12 12:26 | 只看该作者

绝大多数情况下是软件的BUG所致

使用特权

评论回复
13
zhuhuis| | 2017-11-12 12:28 | 只看该作者

串口在收到非法数据时内部的对应出错标志会被置1,此时暂停接收新数据,需要用软件进行查询和清零,DATASHEET里有详细说明。

使用特权

评论回复
14
songqian17| | 2017-11-12 12:30 | 只看该作者

正确的串口接收中断处理函数
rx_handler(void)
{
       int b;
       if (OERR || FERR){
           SPEN=0;
           CREN = 0;
           b = RCREG;
           CREN = 1;
           SPEN=1;
       }
       else if (RCIF){
           get_data();
       }
}

使用特权

评论回复
15
chenho| | 2017-11-12 12:33 | 只看该作者
把你的串口程序注释掉,再试验,如果还死机就代表硬件有问题,如果不死机就代表你的串口程序有问题。

使用特权

评论回复
16
gongche| | 2017-11-12 12:35 | 只看该作者

98%的可能是软件有问题
完善的做法是:当出现错误通讯数据的时候,程序要能退出该通讯处理,并照常处理其他数据,当新的通讯数据再次到来的时候要能正确响应。

LZ目前情况应该是程序不能处理掉错误的通讯数据导致等待而不能动弹.

使用特权

评论回复
17
huwr| | 2017-11-12 12:37 | 只看该作者
就算是硬件问题软件应该也可以解
通讯的协议里面
1,是否有严谨的TIME OUT 机制?
2,是否有严谨的校验机制?
3,发送数据异常时怎么处理?
4,接收数据异常怎么处理?
处理好这些应该就没有问题了!

使用特权

评论回复
18
huanghuac| | 2017-11-12 12:41 | 只看该作者
我也遇到过这个问题,16F877死在串口接收那里,后来接受中断部分改成这样就好了
if(RCIE && RCIF)    // 串口中断
{
     if (OERR || FERR)
       {
            SPEN=0;
            CREN = 0;
            rxdbuf = RCREG;
            rxdbuf = RCREG;
            CREN = 1;
            SPEN=1;
        }
        else
       {
            rxdbuf = RCREG;  //读取串口接收数据
            usart_flag = 1; //串口中断标志
        }
}

使用特权

评论回复
19
happy_10| | 2017-11-12 12:42 | 只看该作者
同意软件问题的说法,你没有在终端里面加入20楼所述的相关处理,这才是真正的问题。

使用特权

评论回复
20
happy_10| | 2017-11-12 12:44 | 只看该作者
同意软件问题的说法,你没有在终端里面加入20楼所述的相关处理,这才是真正的问题。

使用特权

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

本版积分规则

797

主题

8878

帖子

7

粉丝