Qt的串口接收和发送问题

发送:
我发现发送单条消息给串口助手是正常的,如果一次发好几条数据,串口助手只能接收到最后一条消息,这是什么原因?
代码

 int serialCommunication::sendSerialData(char *buffer, int length )
{
    m_SerialPort->clear(QSerialPort::Input);
    m_SerialPort->clear(QSerialPort::Output);
    return m_SerialPort->write(buffer, length);
}

接收:
假如接收14个字节的数据,每来一个字节,接收函数都处理一次,会处理14次,前13次是无用的
代码

 void serialCommunication::readSerialData()
{
    //读取串口数据
    //usleep(100000);
    QByteArray readComData = m_SerialPort->readAll();
    mData.append(readComData);
    char *buf = NULL;
    int len = mData.length();
    qDebug()<<"mData length: "<<len <<endl;

    buf = (char*)malloc(len * sizeof(char));
    memcpy(buf, mData.data(), len);

    unsigned short validDataLen = (uchar)buf[1];//len of data
    unsigned char num;
    for(int i =0; i<len; i++)
    {
        num = (unsigned char) buf[i];
        qDebug() <<"num"<< num;
    }
        ...
    free(buf);
    buf=NULL;
}

求指点

0

3个回答

1、我习惯用PCOMM的库去写串口,这是我见过最容易上手的串口写法

2、推荐你用这个串口调试助手https://www.cr173.com/soft/61421.html 同样是我用了无数款之后 出毛病最少的,他的接收是在定时器里一直read,有数过来就显示

3、不知道你用的是虚拟串口还是真实串口,我在实践中发觉这个差别很大,比如虚拟串口两个串口参数配置不同时,不影响数据的对错,这对调试代码是个很大的弊端

1

mData.remove(0,len);
不是已经把数据删掉了吗?

1
Joker_FJL
时间过得快 是的,源程序不是这样的,提问时敲错了,已改正。 发送多条数据时,write都返回了正确的数字,表示都发送成功了。但串口助手只显示最后一条发送的数据,请问您有什么看法吗
大约一年之前 回复

是的,源程序不是这样的,提问时敲错了,已改正。 发送多条数据时,write都返回了正确的数字,表示都发送成功了。但串口助手只显示最后一条发送的数据,请问您有什么看法吗

1
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Qt有关串口数据发送和接收的问题
这是我写的连接串口的命令rn[code=c]rnvoid MotorController::connect_serial() // 槽函数,对应的signal是connect_device按钮的click()rnrn foreach (const QSerialPortInfo &sinfo, QSerialPortInfo::availablePorts()) rn mcsp->setPort(sinfo); // mcsp是指向QSerialPort类的指针rn mcsp->open(QIODevice::ReadWrite);rn QByteArray checkDevice;rn QString2Hex("02504D50312F313030300D0A", checkDevice); //将字符串转换成十六进制字符组rn mcsp->write(checkDevice);rn if(check_serial())rn break;rn rnrnrnbool MotorController::check_serial() // 检查是否连接到目标设备rnrn bool check_link = 0;rn QByteArray wished_reply;rn QString2Hex("43 09 50 4D 50 31 0D 0A ", wished_reply);rn QByteArray readAnswer;rn readAnswer = *buf; // buf的定义是:QByteArray *buf = new QByteArray;用来保存从串口接收到的数据rn showLinkStatus->setText(readAnswer); // showLinkStatus是一个QLabel,最初状态什么文字都没有rn if(readAnswer != wished_reply)rn mcsp->close();rn elsern check_link = 1;rn connect_device->hide();rn rn return check_link;rnrnrnvoid MotorController::read_data() // 这是readyRead()信号连接的slotrnrn *buf = mcsp->readAll();rnrn[/code]rn运行后发现设备根本接收不到checkDevice命令,showLinkStatus没有任何文本,connect_device没有被隐藏。rn接着将check_serial函数的if语句做如下更改rn[code=c]rnif(readAnswer != wished_reply)rn /*mcsp->close()*/;rn elsern check_link = 1;rn connect_device->hide();rn rn[/code]rn再次运行发现设备成功接收到命令(转台转动了),但showLinkStatus没有任何文本,connect_device没有被隐藏。rn接着改写代码rn[code=c]rnQByteArray MotorController::read_data()rnrn QByteArray buf1;rn buf1 = mcsp->readAll();rn return buf1;rnrnrnvoid MotorController::connect_serial()rnrn foreach (const QSerialPortInfo &sinfo, QSerialPortInfo::availablePorts()) rn mcsp->setPort(sinfo);rn mcsp->open(QIODevice::ReadWrite);rn QByteArray checkDevice;rn QString2Hex("02504D50312F313030300D0A", checkDevice);rn mcsp->write(checkDevice);rn if(check_serial())rn break;rn rnrnrnbool MotorController::check_serial()rnrn bool check_link = 0;rn QByteArray wished_reply;rn QString2Hex("43 09 50 4D 50 31 0D 0A ", wished_reply);rn QByteArray readAnswer;rn readAnswer = read_data();rn showLinkStatus->setText(readAnswer);rn if(readAnswer != wished_reply)rn /*mcsp->close()*/;rn elsern check_link = 1;rn connect_device->hide();rn rn return check_link;rnrn[/code]rn运行后发现:按下一次connect_device,转台转动但showLinkStatus没有任何文本,connect_device没有被隐藏;按下第二次发现转台转动,showLinkStatus出现正常文本,connect_device被隐藏。rn如果mcsp->close()没被注释掉那么3种代码都无法使转台转动,并且showLinkStatus没有任何文本,connect_device没有被隐藏rn请问一下各位出现上述情况的原因是什么,我想要在第一次按下connect_device后就达到转台转动,showLinkStatus出现正常文本,connect_device被隐藏这样的效果改怎么做?rn希望各位大神不吝赐教。
串口发送,接收问题
[code=C#]rn//加载打开串口rn private void Form1_Load(object sender, EventArgs e)rn rn txd = 0;rn rxd = 0;rn string[] ports= System.IO.Ports.SerialPort.GetPortNames();rn mycomm.ReadTimeout = 32;rn int i = 0;rn foreach (string port in ports)rn rn combo1.Items.Add(port);rn i++;rn rn if (i > 0)rn rn combo1.SelectedIndex = 0;rn if(mycomm.IsOpen)rn rn mycomm.Close();rn rn mycomm.PortName = combo1.SelectedItem.ToString();rn comminfo.Text = combo1.SelectedItem.ToString() + "9600,8,1";rn tryrn rn mycomm.Open();rn openbtn.Text = "关闭串口";rn rn catchrn rn MessageBox.Show("没发现次串口或串口已经在使用");rn rn rn rnrnrnrn// 发送文本按钮 rnrn// sendtext文本框内容是:12 34 56 00 1E 80 01 0B 13 47 29 40 94 10 0B 13 47 29 40 94 20 08 03 00 00 00 13 04 9E 5Drn rnprivate void send_Click(object sender, EventArgs e)rn rn string str = sendtext.Text;rn if (mycomm.IsOpen)rn rn mycomm.WriteLine(str);rn txd = txd + str.Length;rn tds.Text = txd.ToString();rn rn rnrnrn//接收按钮 revtext文本框的内容要怎么样才是16进制显示????? rnprivate void mycomm_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)rn rn string str = mycomm.ReadExisting();rn revtext.Text = revtext.Text + str;rn rxd = rxd + str.Length;rn rds.Text = rxd.ToString();rn rn[/code]rnrnsendtext文本框内容是:12 34 56 00 1E 80 01 0B 13 47 29 40 94 10 0B 13 47 29 40 94 20 08 03 00 00 00 13 04 9E 5Drn默认发送是不是就是16进制了。不是的话要如何改?rnrnrevtext文本框的内容要怎么样才是16进制显示????? 要如何改? rn
Qt 5.7串口助手发送接收源码
利用Qt的串口类开发的串口助手,可以收发16进制,字符的程序。完美的界面,可以实际运用,串口开发的朋友可以借鉴,绝对可靠。
QT串口简单通信,实现发送和接收
QT串口简单通信,初始化时搜索串口,设置串口参数,实现串口发送和接收。
关于串口接收与发送的问题。
我现在用的是实际的设备,也是在一个串口发送,并同时监视数据;我的使用是这样的,发送的时候,主动调用发送函数。接收部分是启动了一个线程,线程里面无限循环,但我调用SetCommMask (hCommPort, EV_RXCHAR); 程序在WaitCommEvent( ) 停止,此时,调用写函数,没有效果,好像被阻塞住了,只有在发送了一个数据过来的时候,才能继续执行,发送出数据。请问下,应该怎么解决接收问题?如果我不设置setCommMask( ); 在循环中WaitCommEvent(,&fdwCommMask, )返回事件类型,然后根据 if ( fdwCommMask & EV_RXCHAR )判断,为真则读数据,读完,Sleep( 100 ).但是,这样情况下,发送过来数据,这个事件也没有被识别,请问怎么解决? (昨天好像是可以有这个事件的,今天不设置Mask 就不认EV_RXCHAR了)( 我在ce 4.2 ,目标机xcat 552 )
串口接收和发送文件名问题
这是C代码 rnrnrnrn我想问下MSComm1,在串口下接收数据不是直接点击接收就可以了,可是我看有些需要输入文件名称接收对应的数据,给大家看一下C的代码rnrnvoid __fastcall TPanaInfoForm::BitBtn1Click(TObject *Sender)rnrnvoid _stdcall(*p)(int);rnAnsiString str,strtmp;rnchar code=3;rnBitBtn1->Enabled=false;rnport=ComNo->ItemIndex+1;rnsio_open(port);rnswitch(BaudRate->ItemIndex)rnrncase 0:rn sio_ioctl(port,B2400,P_EVEN|BIT_7|STOP_1);rn break;rncase 1:rn sio_ioctl(port,B4800,P_EVEN|BIT_7|STOP_1);rn break;rncase 2:rn sio_ioctl(port,B9600,P_EVEN|BIT_7|STOP_1);rn break;rncase 3:rn sio_ioctl(port,B19200,P_EVEN|BIT_7|STOP_1);rn break;rnrnif(Clear->Checked)rnstrtmp="900";rnelsernstrtmp="000";rnswitch(ReadItems->ItemIndex)rnrncase 0:rn str="C1M"+strtmp;rn break;rncase 1:rn if(InputQuery("输入程序名称","名称:",str))rn rn if(str=="")rn rn MessageBox(Handle,"名称不能为空","错误",MB_OK|MB_ICONERROR);rn BitBtn1->Enabled=true;rn return;rn rn str=str.UpperCase();rn if(str[1]!='P')rn str="P"+str;rn str="C1M"+strtmp+str;rn rn elsern rn BitBtn1->Enabled=true;rn return;rn rn break;rncase 2:rn str="C1N"+strtmp;rn break;rncase 3:rn str="C1Z"+strtmp;rn break;rnrnp=termirq;rnsio_term_irq(port,*p,code);rnsio_write(port,transtr("",str.c_str()),str.Length()+6);rnMemo1->Lines->Clear();rnMemo1->SetFocus();rnTimer1->Enabled=true;rnrnrnrn请问用DELPHI怎么来实现接收数据的时候输入接收的名称,是MSComm1哪个函数??
奇怪的Qt串口接收问题
我参考了以下例程:rnhttp://hi.baidu.com/her02008/blog/item/263cc213501049cbf6039e47.htmlrnrn[code=C/C++]rn#include "mainwindow.h"rn#include "ui_mainwindow.h"rnrnMainWindow::MainWindow(QWidget *parent) :rn QMainWindow(parent),rn ui(new Ui::MainWindow)rnrn ui->setupUi(this);rn struct PortSettings myComSetting = BAUD115200,DATA_8,PAR_NONE,STOP_1,FLOW_OFF,500;rnrn //定义一个结构体,用来存放串口各个参数rnrn myCom = new Win_QextSerialPort("com3",myComSetting,QextSerialBase::EventDriven);rnrn //定义串口对象,并传递参数,在构造函数里对其进行初始化rnrn myCom ->open(QIODevice::ReadWrite);rnrn //以可读写方式打开串口rnrn connect(myCom,SIGNAL(readyRead()),this,SLOT(readMyCom()));rnrn //信号和槽函数关联,当串口缓冲区有数据时,进行读串口操作rnrnrnrnrnvoid MainWindow::readMyCom() //读串口函数rnrnrnrnQByteArray temp = myCom->readAll();rnrn//读取串口缓冲区的所有数据给临时变量temprnrnui->textBrowser->insertPlainText(temp);rnrn//将串口的数据显示在窗口的文本浏览器中rnrnrnrnrnMainWindow::~MainWindow()rnrn delete ui;rnrnrn[/code]rnrn插上串口,Qt窗口接收不到单片机(MSP430)传出来的数据。但是这时候,打开串口调试助手,可以接收到数据,关闭串口助手,再次打开Qt程序,程序也可以接收到数据了!rn如果把串口数据线拔掉重新插上,又会出现原来的问题。
QT串口接收解析问题
我用的QT5.0。用的readall函数接收的。放在QBytearray类型的变量里。现在发送端不停发送一串内容(帧头0x68,9位数据,帧尾0xfb),我要如何编程接收?求大佬带过啊,最好能发代码我瞅瞅
串口接收和发送程序
基于串口232的接收和发送程序,同时可以讲接收到的字符显示在液晶上
AT89C51 串口接收与发送
5路短路控制信号,并将其发送给pc机。Pc机发送数据控制5路继电器。串口发送协议是四个字节
串口接收发送程序
串口接收发送程序实例,有设置窗体背景为指定图片的实例。
stm32f103串口发送、接收
该程序通过串口调试助手向串口发送数据,同时将接收到的数据又显示出来。即实现发送—接收的循环。程序已通过编译并调试成功。。内附使用说明
串口发送接收测试软件
串口发送接收测试软件可进行串口数据的接收与发送,用于调试使用
QT5串口接收发送
综合很多博客,总结出来的QT5串口发送和接收的工程,包含接收发送清空,十六进制发送,十六进制接收,插入换行,刷新串口功能,波特率1200-115200,数据5-8位可选,停止位1-2位可选,界面清新!
串口发送和接收的类
VC环境下串口的发送和接收数据的类CSerialPort,直接调用其函数就可实现串口数据的发送和接收。
串口的接收与发送
1、等待查询等待方式 void Usart_Send_Char(unsigned char *c,uint32_t cnt)//把发送数据的指针和个数传入,然后直到发送完才退出 { while(cnt--) { USART_SendData(USART1, *c++); while(USART_GetFlagStatus(USART1, USART_FLAG_TXE...
stm32串口的接收与发送
stm32串口接收与发送源码,可用作一般串口书写,使用方便
java 串口接收发送
Java编写了一个串口收发程序 带界面的和不带界面的 加不加监听的都有可以找我要 乐于奉献
串口发送接收练习
芯片STM32F103T8;使用SUART1串口发送接收数据,115200波特率,PA9发送数据,PA10接收数据。
串口接收和发送
单片机串口和电脑进行通信 接收和发送 当电脑接收到信息时 发送指定的类容
黑金—串口接收与发送
黑金—串口接收与发送,可以直接下载到黑金板子中,控制芯片为EP2C8Q208C8
labview串口发送接收
labview串口发送与接收,带属性节点,下就可以用!
Android串口发送接收
Android串口发送接收demo,开源的jni打开串口,接收与发送,代码简单明了
串口发送接收程序设计
详细的讲解了51单片机通过RS232进行的串口发送接收程序,例程能够很好的实现各自功能。
C#串口发送接收
使用VS2008编写的C#串口程序,成功发送接收ASCC数据,没有做发送接收二进制的
串口单字节发送和接收
使用verilog开发的串口单字节发送和接收
串口数据发送 接收
用串口调试助手 每隔50ms发送数据 发送200多次的时候,大概会出现7、8次没有数据返回 这样正常吗
QT串口发送问题(windows下)
有没有哪位兄弟遇见过QT串口发送时耗内存的情况?我用QT5.11自带串口事例blockingmaster同样存在这个问题,时间越长消耗内存越大rn大约一个小时需要消耗1M内存,代码如下,并且write的时候在windows下系统剪切板不能使用了rn//! [4]rnvoid MasterThread::run()rnrn bool currentPortNameChanged = false;rnrn m_mutex.lock();rn//! [4] //! [5]rn QString currentPortName;rn if (currentPortName != m_portName) rn currentPortName = m_portName;rn currentPortNameChanged = true;rn rnrn int currentWaitTimeout = m_waitTimeout;rn QString currentRequest = m_request;rn m_mutex.unlock();rn//! [5] //! [6]rn QSerialPort serial;rnrn if (currentPortName.isEmpty()) rn emit error(tr("No port name specified"));rn return;rn rnrn if (currentPortNameChanged) rn serial.close();rn serial.setPortName(currentPortName);rnrn if (!serial.open(QIODevice::ReadWrite)) rn emit error(tr("Can't open %1, error code %2")rn .arg(m_portName).arg(serial.error()));rn return;rn rn rnrn //while (!m_quit) rn while (true) rn//![6] //! [7]rnrn//! [7] //! [8]rn // write requestrn const QByteArray requestData = currentRequest.toUtf8();rn serial.write(requestData);rn if (serial.waitForBytesWritten(m_waitTimeout)) rn//! [8] //! [10]rn // read responsern if (serial.waitForReadyRead(currentWaitTimeout)) rn QByteArray responseData = serial.readAll();rn while (serial.waitForReadyRead(10))rn responseData += serial.readAll();rnrn const QString response = QString::fromUtf8(responseData);rn//! [12]rn emit this->response(response);rn//! [10] //! [11] //! [12]rn else rn emit timeout(tr("Wait read response timeout %1")rn .arg(QTime::currentTime().toString()));rn rn//! [9] //! [11]rn else rn emit timeout(tr("Wait write request timeout %1")rn .arg(QTime::currentTime().toString()));rn rn//! [9] //! [13]rn /* m_mutex.lock();rn m_cond.wait(&m_mutex);rn if (currentPortName != m_portName) rn currentPortName = m_portName;rn currentPortNameChanged = true;rn else rn currentPortNameChanged = false;rn rn currentWaitTimeout = m_waitTimeout;rn currentRequest = m_request;rn m_mutex.unlock();*/rn rn//! [13]rnrn
QT 串口接收
给我我用的QT下的qextserialPort做的串口接收程序,可是现在遇到一个问题,接收到的数据,通过readall()函数,赋值到了一个Qbytearray的变量里,我自己建了一个结构体,暂时叫struct1吧,我想把Qbytearray的数据,原封不动的复制到我的struct1中,就是假设QbyteArray是个数组,我就是想把数组的头指针赋给我的struct1的头指针,这样就实现了结构体赋值,请问各位有这么做过吗?或者怎么取QbyteArray的值到一个Byte的数组中呢?
HLW8032 QT 串口接收
使用QT5开发,界面使用QT ui设计器,参考网上通用代码例程,自己做了修改,可以正常读取HLW8032功率计量芯片的的数据,并在上位机中解析计算,代码中都有注释希望对初入坑的同学有所帮助
QT串口发送错误
调式信息 Invalid parameter passed to C runtime function. Invalid parameter passed to C runtime function. QObject: Cannot create children for a parent that is in a different thread. (Parent is QSeria
VC++串口接收和发送程序
使用VC++分别编写串口接收和发送程序,能够实现不同计算机间的通讯。已经过调试。
VS2010 MFC 串口发送接收
VS2010 MFC 实现的串口通讯,可选择串口,波特率,开关串口,发送接收等功能
C#串口数据接收与发送
按照伍兄的博文抄下来的。 博文地址:http://www.cnblogs.com/wuhuacong/archive/2011/07/19/2111055.html#commentform 为了赚点下载分。谢谢!
串口发送接收程序-FPGA
串口发送接收程序演示程序,verilog代码,很好用,我用过
USART 串口 DMA 发送和接收
串口DMA发送: 发送数据的流程: 前台程序中有数据要发送,则需要做如下几件事 1.      在数据发送缓冲区内放好要发送的数据,说明:此数据缓冲区的首地址必须要在DMA初始化的时候写入到DMA配置中去。 2.      将数据缓冲区内要发送的数据字节数赋值给发送DMA通道,(串口发送DMA和串口接收DAM不是同一个DMA通道) 3.      开启DMA,一旦开启,则DMA开始发送数
esp8266-SDK的串口发送和中断接收
其实用esp8266编写串口程序非常简单,因为它都给我们写好了,只要调用 uart_init(115200,115200);这个函数就可以。 1、发送 调用uart_init(115200,115200);初始化串口,波特率设置为115200.前面一个是设置uart0的波特率、后面一个是设置、uart的波特率 然后就可以使用uart0_tx_buffer(uint8 *buf, ui
c# 串口接收 发送程序
只需要能在textbox1上显示接收数据 按button可以把textbox2上的发送出去 C#的 能在vs2013上直接运行 满足以上条件的最简答程序(新手求理解上最简单,长一些也无所谓)
很好的发送串口接收程序
串口接收程序很好的啊 费 是否 ,啊沙发了可收到发货速度快了见附件三方的
VC 串口控制程序 接收 发送
基本的串口操作,完整工程源代码。有一定的注释。
相关热词 c# 线程顺序 c#昨天当前时间 c# 多进程 锁 c#mysql图片存取 c# ocx 委托事件 c# 读取类的属性和值 c# out 使用限制 c#获取url的id c#怎么进行分页查询 c# update 集合