找回密码
 立即注册
收起左侧

怎么判断串口以发送完毕?

27
回复
23910
查看
[复制链接]
累计签到:27 天
连续签到:1 天
来源: 2015-10-27 09:40:45 显示全部楼层 |阅读模式
1Qter豆
本帖最后由 tovax 于 2015-10-31 08:56 编辑

大概意思如下:
//以下代码只表示执行思路,望见谅
//----------------------------------------------------------------------
qCom = new QSerialPort();
string1[] = "123";
string2[] = "456";

qCom->open(QIODevice::writeOnly);        //先以只写打开
qCom->writeData(string1, 2);
qCom->writeData(string2, 2);
while(???);        //此处想等待第6个字符发送完毕
qCom->open(QIODevice::readOnly);        //发送完毕后设置为只读模式
//----------------------------------------------------------------------
串口顺序发送了“1 2 3 4 5 6”六个字符,请问第六个字符“6”发送完毕的时刻怎么捕捉到呢?有木有更好的方法来实现?
求指点,谢谢!


最佳答案

查看完整内容

50只是举个例子,,他是这样的 比如串口对象是 MyCom吧,字符是QString str="qingdao"; MyCom->write(str),执行完write方法后(发送了7个字符),这时候ByteWritten(qint64),信号就发射了,实际信号以这种形式ByteWritten(7)发射了!是执行完了write方法发射的,至于那个"7",你就别纠结了,实际发送了多少字符,QT底层会在缓冲区计算好,你不用管! 如果str="guo",那就是ByteWritten(3)!所以参数肯定要传,只不过不用你传,QT帮你算好了! ...
回复

使用道具 举报

累计签到:615 天
连续签到:1 天
2015-10-27 09:40:46 显示全部楼层
tovax 发表于 2015-10-31 19:29
杯具了,我竟然没懂。。。奔着做技术的“厚脸皮”精神,我再烦你一下吧:我向串口写了50个字符,QT为什么 ...

50只是举个例子,,他是这样的  比如串口对象是  MyCom吧,字符是QString str="qingdao"; MyCom->write(str),执行完write方法后(发送了7个字符),这时候ByteWritten(qint64),信号就发射了,实际信号以这种形式ByteWritten(7)发射了!是执行完了write方法发射的,至于那个"7",你就别纠结了,实际发送了多少字符,QT底层会在缓冲区计算好,你不用管! 如果str="guo",那就是ByteWritten(3)!所以参数肯定要传,只不过不用你传,QT帮你算好了!     如果不懂,就留言好了,我QT学的也不精,大家一起学习,刚学那会,我在群里问,还被人鄙视竟然说QT是一门语言(QT不是语言,是类库)
回复

使用道具 举报

累计签到:256 天
连续签到:1 天
2015-10-27 11:05:32 显示全部楼层
1.串口write有一种发送方法是设置发送的长度,你可以用这个write之后就可以设置readOnly
2.如果你确定只会发送6个字节,那么用一个number接收write的返回值,if(6 == number)设置readOnly
回复

使用道具 举报

累计签到:595 天
连续签到:1 天
2015-10-27 17:51:20 显示全部楼层
加个帧头,帧头包括你要发送数据的长度,还可以加上校验,读到帧头就读多少数据
回复

使用道具 举报

累计签到:615 天
连续签到:1 天
2015-10-28 09:47:26 显示全部楼层
我记得串口通信,,有个信号bytesWritten(qint64) 就是串口往串口里写完数据就会发射这个信号,,,不知道对你有没有帮助
回复

使用道具 举报

累计签到:27 天
连续签到:1 天
2015-10-28 22:56:51 显示全部楼层
谢谢大伙儿的回复,不好意思,这两天在忙其他的事儿,忘了这边的问题,我尽快按回复的建议试试后回复大家!
回复

使用道具 举报

累计签到:27 天
连续签到:1 天
2015-10-29 08:22:35 显示全部楼层
本帖最后由 tovax 于 2015-10-29 08:26 编辑


示意图如果所示
由于电脑的TX和RX连接在一起,在电脑发送数据给设备时,同时也会收到自己发送给设备的数据。
虽然设备是在电脑发送完数据后才回复应答信息,但是由于电脑在接收应答信息前已经收到了自己发送的一堆数据,所以分离出应答信息有点麻烦,因此才想电脑以只写模式发送,发送完毕后打开只读模式。
大概是这个意思吧。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

累计签到:27 天
连续签到:1 天
2015-10-30 19:06:18 显示全部楼层
qq1043068972 发表于 2015-10-28 09:47
我记得串口通信,,有个信号bytesWritten(qint64) 就是串口往串口里写完数据就会发射这个信号,,,不知道对你有 ...

QSerialPort貌似没有这个信号:
void        baudRateChanged(qint32 baudRate, QSerialPort:irections directions)
void        dataBitsChanged(QSerialPort:ataBits dataBits)
void        dataTerminalReadyChanged(bool set)
void        error(QSerialPort::SerialPortError error)
void        flowControlChanged(QSerialPort::FlowControl flow)
void        parityChanged(QSerialPort:arity parity)
void        requestToSendChanged(bool set)
void        stopBitsChanged(QSerialPort::StopBits stopBits)

有个函数“bool QSerialPort::​waitForBytesWritten(int msecs)”,我试试看
回复

使用道具 举报

累计签到:27 天
连续签到:1 天
2015-10-30 19:09:44 显示全部楼层
qq1043068972 发表于 2015-10-28 09:47
我记得串口通信,,有个信号bytesWritten(qint64) 就是串口往串口里写完数据就会发射这个信号,,,不知道对你有 ...

看到这个信号了,在QIODevice那里有介绍
回复

使用道具 举报

累计签到:27 天
连续签到:1 天
2015-10-30 19:45:21 显示全部楼层
qq1043068972 发表于 2015-10-28 09:47
我记得串口通信,,有个信号bytesWritten(qint64) 就是串口往串口里写完数据就会发射这个信号,,,不知道对你有 ...

connect(my_serialport, SIGNAL(bytesWritten(qint64)), this, SLOT(my_changeOpenMode()));
如果发送6个字符触发槽的话,请问怎么把参数“6”传给bytesWritten呢?

点评

这个参数你不用管,QT会自己弄好的  详情 回复 发表于 2015-10-31 09:02
回复

使用道具 举报

累计签到:27 天
连续签到:1 天
2015-10-30 19:49:41 显示全部楼层
z55716368 发表于 2015-10-27 11:05
1.串口write有一种发送方法是设置发送的长度,你可以用这个write之后就可以设置readOnly
2.如果你确定只会 ...

my_serialport->write(pData, sizeof(dataBuf));
my_serialport->setReadOnly();
请问是这个意思吗?
测试结果好像不是这个意思,write会写完dataBuf再往下执行吗?

点评

刚看了一下你的说明,你发出去又会吧自己的也读回来,为什么不对传输做一个类似协议的约定,这样可以吧你发送的和你接收的分离出来赛。  详情 回复 发表于 2015-10-31 08:41
回复

使用道具 举报

累计签到:27 天
连续签到:1 天
2015-10-30 19:51:10 显示全部楼层
sywh 发表于 2015-10-27 17:51
加个帧头,帧头包括你要发送数据的长度,还可以加上校验,读到帧头就读多少数据 ...

谢谢你的回复。设备端的协议是不能修改的,所以主机是的操作要配合设备。
回复

使用道具 举报

累计签到:27 天
连续签到:1 天
2015-10-30 22:18:46 显示全部楼层
qq1043068972 发表于 2015-10-28 09:47
我记得串口通信,,有个信号bytesWritten(qint64) 就是串口往串口里写完数据就会发射这个信号,,,不知道对你有 ...

//===========================================================
        connect(my_serialport, SIGNAL(bytesWritten(qint64)), this, SLOT(my_setReadOnly()));
        my_serialport->setWriteOnly();

        pData = (const char *)strConnect;
        my_serialport->write(pData, sizeof(strConnect) - 1);

        emit my_serialport->bytesWritten(8);
        qDebug() << "Run to here!";
//===========================================================
void serial::my_setReadOnly()
{
    my_serialport->setReadOnly();
    connect(my_serialport, SIGNAL(readyRead()), this, SLOT(my_readserial()));
    qDebug() << "Read Only!";
}
//===========================================================
测试结果是:主机发送完以后,并没有收到设备返回的应答信息(经检测,设备确实返回了应答信息)。
应用程序输出的调试信息表明槽被触发了,不知道是不是被触发的时机不对还是其他什么原因,望指点

点评

我现在有个疑惑啊。为什么要去设置先只能写,后只能读,你这样的话,感觉很容易出现你发出去了,下面回复之后你才修改你的模式,然后回复的数据会不会就错过了?  详情 回复 发表于 2015-10-31 08:47
回复

使用道具 举报

累计签到:256 天
连续签到:1 天
2015-10-31 08:41:37 显示全部楼层
tovax 发表于 2015-10-30 19:49
my_serialport->write(pData, sizeof(dataBuf));
my_serialport->setReadOnly();
请问是这个意思吗?

刚看了一下你的说明,你发出去又会吧自己的也读回来,为什么不对传输做一个类似协议的约定,这样可以吧你发送的和你接收的分离出来赛。
回复

使用道具 举报

累计签到:256 天
连续签到:1 天
2015-10-31 08:47:42 显示全部楼层
tovax 发表于 2015-10-30 22:18
//===========================================================
        connect(my_serialport, SIGNAL ...

我现在有个疑惑啊。为什么要去设置先只能写,后只能读,你这样的话,感觉很容易出现你发出去了,下面回复之后你才修改你的模式,然后回复的数据会不会就错过了?
回复

使用道具 举报

累计签到:27 天
连续签到:1 天
2015-10-31 08:51:18 显示全部楼层
z55716368 发表于 2015-10-31 08:41
刚看了一下你的说明,你发出去又会吧自己的也读回来,为什么不对传输做一个类似协议的约定,这样可以吧你 ...

由于设备端已经把协议定好了,主机端只能配合设备的通信过程。

点评

按照基本的协议模式,应该包括包头包尾一些标识,你每次接收到之后去判断这个包头和包尾,取出中间就是返回的数据了  详情 回复 发表于 2015-10-31 14:05
回复

使用道具 举报

累计签到:27 天
连续签到:1 天
2015-10-31 08:54:33 显示全部楼层
z55716368 发表于 2015-10-31 08:47
我现在有个疑惑啊。为什么要去设置先只能写,后只能读,你这样的话,感觉很容易出现你发出去了,下面回复 ...

恩恩,我也是纠结这个问题,主机发送完请求信息后,设备立刻就返回了应答信息。如果设置读写模式的话,主机会收到"请求信息"+"应答信息",这样还得麻烦的分离出应答信息,所以想找到一种合适的触发方法,干干净净的收到应答信息。。。

点评

通过协议分离数据这不是协议的作用么、、、、、、  详情 回复 发表于 2015-10-31 14:02
回复

使用道具 举报

累计签到:615 天
连续签到:1 天
2015-10-31 09:00:57 显示全部楼层
1.emit my_serialport->bytesWritten(8); 这个是什么意思?你自己又发射了一遍?
bytesWritten(qint64)信号是os自己发射的,没必要自己在发射一下,这样还会导致slot被多次调用,打断读数据的过程
2.你的程序是不是只要你这边已发送,那边就接着给你反馈,如果是这样的话,我感觉在my_setReadOnly()关联
connect(my_serialport, SIGNAL(readyRead()), this, SLOT(my_readserial()));
已经晚了,最好事先把信号槽都关联好
回复

使用道具 举报

累计签到:615 天
连续签到:1 天
2015-10-31 09:02:27 显示全部楼层
tovax 发表于 2015-10-30 19:45
connect(my_serialport, SIGNAL(bytesWritten(qint64)), this, SLOT(my_changeOpenMode()));
如果发送6个 ...

这个参数你不用管,QT会自己弄好的
回复

使用道具 举报

累计签到:27 天
连续签到:1 天
2015-10-31 09:16:16 显示全部楼层
qq1043068972 发表于 2015-10-31 09:02
这个参数你不用管,QT会自己弄好的

connect的时候也没有指明发6个字符后触发槽,QT怎么知道这个参数“6”呢?

点评

其实这个信号是这样,,,比如:你这次向串口写了50个字符,,那么发送完50个字符号,这个信号就自动触发了,QT当然知道这次串口发了多少字符,这个信号的参数不是你人为控制的,是串口本次发送了多少有效数据!  详情 回复 发表于 2015-10-31 17:25
回复

使用道具 举报

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

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了