• 11419阅读
  • 8回复

[讨论]关于处理串口通信的异常!大神高手速来看看! [复制链接]

上一主题 下一主题
离线z55716368
 

只看楼主 倒序阅读 楼主  发表于: 2015-06-04
回复本帖可获得1RMB金钱奖励!
每人最多可获奖1次,奖池剩余9RMB金钱 (中奖几率10%)
数据发送的异常处理,比如上位机正在向下位机(单片机)发送数据,然后数据线断了或者其他原因造成数据传输不成功,这个时候程序可能还会一直发数据(因为是自动发送),要怎么来捕获这个异常并且传给上层让上层处理?或者当打开串口时打开不成功,这种异常怎么返回?写到串口的数据却并没有发送出去,这种异常怎么返回?真真的被搞了一天了,好惨/////////
每一个问题 都是一次进步
离线johnyork

只看该作者 1楼 发表于: 2015-06-04
回帖奖励+ 1
如果你用QSerialPort类,在open返回false时就是串口打开不成功了。
另外,可以连接QSerialPort类的error信号到你自己的槽函数来检测各种异常,具体可以参考Qt的帮助文档。
对于数据传输不成功的异常,有人曾通过检测error信号中的QSerialPort::ResourceError来感知usb转串口的USB线被拔出的情况。
但是你说的数据线断了的情况……貌似目前的串口硬件没有提供这方面的检测接口,因此直接通过软件检测便没办法实现了。非要实现的话,可能只能通过增加硬件器件来检测串口管脚的电平或者电流状态,并将状态检测结果设法传给软件才行了。一个变通的方案是使用全双工串口,下位机收到上位机发送的数据后向上位机做个报告,没收到则不报告;上位机在连续发送数帧数据后仍未收到下位机的报告,即可判断通讯异常并请求检查通讯链路。
离线z55716368

只看该作者 2楼 发表于: 2015-06-10
回 johnyork 的帖子
johnyork:如果你用QSerialPort类,在open返回false时就是串口打开不成功了。
另外,可以连接QSerialPort类的error信号到你自己的槽函数来检测各种异常,具体可以参考Qt的帮助文档。
对于数据传输不成功的异常,有人曾通过检测error信号中的QSerialPort::ResourceError来感知usb转串口的USB .. (2015-06-04 23:00) 

不好意思 对论坛不熟 也才看到回复,有个问题 那个error信号如何使用 我看有好多的那些信号 直接才构造函数中connect就可以了么?
每一个问题 都是一次进步
离线shinegogo

只看该作者 3楼 发表于: 2015-06-16
串口RS232/RS485都不会管对方是否正常接收正常,只要自己的发送时序是正常的,硬件就不会产生错误反馈信号.所以在硬件这一层就决定了没有方法可以判断一串数据在发送中,是否发送正常.
一般来说可以这样处理,让串口在主从工作模式,主机发数据到从机,从机在接收后必须应答,否则视为数据发送失败.这样可以保证数据接收的正确性.但判断最小周期就是一个完整的数据包.
离线johnyork

只看该作者 4楼 发表于: 2015-06-16
回 z55716368 的帖子
z55716368:不好意思 对论坛不熟 也才看到回复,有个问题 那个error信号如何使用 我看有好多的那些信号 直接才构造函数中connect就可以了么? (2015-06-10 16:19) 

刚看到,抱歉。
自己写一个槽函数,把槽函数连接到信号上,就可以根据入口参数判断错误是哪一类了:

class YourHost
{
protected slots:
    void yourSlotOnQSerialPortError(QSerialPort::SerialPortError error);
public:
    YourHost() {
        connect(&yourSerialPort, SIGNAL(error(QSerialPort::SerialPortError)), SLOT(yourSlotOnQSerialPortError(QSerialPort::SerialPortError));
    }
}

void YourHost::yourSlotOnQSerialPortError(QSerialPort::SerialPortError error)
{
    // do what ever you want to do.
}
离线z55716368

只看该作者 5楼 发表于: 2015-06-17
回 johnyork 的帖子
johnyork:刚看到,抱歉。
自己写一个槽函数,把槽函数连接到信号上,就可以根据入口参数判断错误是哪一类了:
class YourHost
....... (2015-06-16 22:07) 

谢谢你的回复,我看了一下就是说出现SerialPortError信号是系统给我的,而我只需要写一个槽函数来接受信号并且进行相应处理。是这个意思吗?
每一个问题 都是一次进步
离线z55716368

只看该作者 6楼 发表于: 2015-06-17
回 shinegogo 的帖子
shinegogo:串口RS232/RS485都不会管对方是否正常接收正常,只要自己的发送时序是正常的,硬件就不会产生错误反馈信号.所以在硬件这一层就决定了没有方法可以判断一串数据在发送中,是否发送正常.
一般来说可以这样处理,让串口在主从工作模式,主机发数据到从机,从机在接收后必须应答,否则视为数 .. (2015-06-16 21:38) 

谢谢回复,意思我也懂了。关于这一块软件方面确实不好处理
每一个问题 都是一次进步
离线johnyork

只看该作者 7楼 发表于: 2015-06-18
回 z55716368 的帖子
z55716368:谢谢你的回复,我看了一下就是说出现SerialPortError信号是系统给我的,而我只需要写一个槽函数来接受信号并且进行相应处理。是这个意思吗? (2015-06-17 11:21) 

笼统来说差不多就这个意思……但貌似我有强迫症……实在忍不住不得不说……
串口资源的异常是串口硬件通过系统驱动程序报告给操作系统,操作系统再生成消息(Windows系统)或事件(Windows、Linux?)告知你的应用程序,在你的应用程序中存在的Qt Framework将它们翻译成Qt独有的信号发射到Qt Framework的信号-槽系统中的。后面该做的就是你说的那样了。
抹汗……强迫症害死人啊!
离线z55716368

只看该作者 8楼 发表于: 2015-06-19
回 johnyork 的帖子
johnyork:笼统来说差不多就这个意思……但貌似我有强迫症……实在忍不住不得不说……
串口资源的异常是串口硬件通过系统驱动程序报告给操作系统,操作系统再生成消息(Windows系统)或事件(Windows、Linux?)告知你的应用程序,在你的应用程序中存在的Qt Framework将它们翻译成Qt独有的信 .. (2015-06-18 23:14) 

还好你有强迫症、了解了 谢谢啊
每一个问题 都是一次进步
快速回复
限100 字节
 
上一个 下一个