• 8468阅读
  • 10回复

用int QByteArray::size () const来记串口接收到二进制数个数的问题(已解决) [复制链接]

上一主题 下一主题
离线lyb1900
 
只看楼主 正序阅读 楼主  发表于: 2010-05-06
//读串口函数如下
void com::readEasyCom()     {
int i;
QByteArray temp= easyCom->readAll();
i=temp.size();
QString num=QString::number(i);
//读取串口缓冲区的所有数据给临时变量temp
ui->receiveNumEdit->setText(num);
ui->textBrowser->insertPlainText(temp.toHex());
//将串口的数据显示在窗口的文本浏览器中

}
程序能正常收到串口数据,并在textBrowser中显示,但是receiveNumEdit总是显示0
[ 此帖被lyb1900在2010-05-23 19:04重新编辑 ]
离线lyb1900
只看该作者 10楼 发表于: 2010-05-23
进入多次原因可能是读时串口忙,
离线lyb1900
只看该作者 9楼 发表于: 2010-05-07
我调试时发现一个奇怪的问题,如果我发送一个字符的话,就算没有加if (!i)return程序也能显示1.但是一次发送字符数超过1个,程序就显示0了。调试时知道每当单次发送字符数超过1个时,会执行readEasyCom()两次,第一次i会得到一个正确的值并显示。但是在第二次执行时temp中的值不见了,i=temp.size()当然变为0.这时如果按dbzhang800说的加上if (!i)return。那么就会马上退出。下面的ui->receiveNumEdit->setText(num);没有执行。值没有更新还是第一次执行readEasyCom()时得到的正确的值。
但是我不明白为什么当单次发送字符数超过1个时,会执行readEasyCom()两次??
离线lyb1900
只看该作者 8楼 发表于: 2010-05-07
dbzhang800 老师你好!我按你说的加了if (!i)return;这时有显示个数了。我用串口虚拟工具来发送,比如发文本格式 的11,显示的个数是4(我以为是2?)。但是if(!i)return 功能只是当i=0时才返回吗,怎么使原本不正常的程序正常工作了。(试过删除你加的这句,程序又显示0了!?)
离线dbzhang800

只看该作者 7楼 发表于: 2010-05-07
引用楼主lyb1900于2010-05-06 09:34发表的 用int QByteArray::size () const来记串口接收到二进制数个数的问题 :
//读串口函数如下
void com::readEasyCom()     {
int i;
QByteArray temp= easyCom->readAll();
i=temp.size();
if (!i)return;
QString num=QString::number(i);
// 读取串口缓冲区的所有数据给临时变量temp
ui->receiveNumEdit->setText(num);
ui->textBrowser->insertPlainText(temp.toHex());
// 将串口的数据显示在窗口的文本浏览器中
.......


简单加一句试试
离线lyb1900
只看该作者 6楼 发表于: 2010-05-07
QT信号槽部分  
connect(easyCom,SIGNAL(readyRead()),this,SLOT(readEasyCom()));

单片机部分
#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "nRF2401.h"

#define uchar unsigned char
#define uint unsigned int
#define F_CPU 7372800UL
unsigned char RxBuf[1]={0};                                    // 接收缓冲,保存接收到的数据
unsigned char RxBuf1[30]={0};
unsigned char Address[5] = {0x00,0x00,0x00,0x00,0x01};    
uchar TxBuf[30];
uchar TxPos=0;
uchar TxLen=0;
uchar RxPos=0;
uchar RxLen=0;


ISR(USART_RXC_vect)
{
    uchar c=UDR;

    if(RxLen>0)
    {
        RxBuf1[RxPos++]=c;
         RxLen--;
        
    }
    
}
/*    
ISR(USART_RXC_vect)
{
    uchar c=UDR;
    if(RxLen>0)
    {
        RxBuf1[RxPos++]=c;
        RxLen--;
    }
}
ISR(USART_TXC_vect)
{
    if(--TxLen>0)
        UDR=TxBuf[++TxPos];
}

uchar IsRecvComplete(void)
{
    return RxLen==0;
}

void SendToUart(uchar size)
{
    TxPos=0;
    TxLen=size;
    UDR=TxBuf[0];
    while(TxLen>0);
}

void RecvFromUart(uchar size,uchar bwait)
{
    RxPos=0;
    RxLen=size;
    if(bwait)
        while(RxLen>0);
}

*/
void putc(unsigned char c)
{
    while( !(UCSRA & (1<<UDRE)) );
    UDR=c;
}

int  main(void)
{
    unsigned int i;
    i=0;
    wdt_disable();
    //uart 初始化
    UBRRH=0;
    UBRRL=47;//9600 baud 6MHz:38  4MHz:25
    UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
    sei();
    RxLen=8;


    putc(0x31);
    putc(0x32);
    putc(0x33);
    putc(0x34);
    putc(0x35);


}
离线dbzhang800

只看该作者 5楼 发表于: 2010-05-07
引用第4楼lyb1900于2010-05-07 11:00发表的  :
我刚学QT,小弟也不懂怎么调试。这个函数只有在收到串口数据时才有执行吧!而串口的数据是我自己用AVR单片机发出的,只有我按下键时才有数据送出,我认为textBrowser显示串口数据时,receiveNumEdit同时显示个数。我想不存在有100次问题,是每次时间是我用单片机控制的,间隔很长


贴代码证明你的观点
离线lyb1900
只看该作者 4楼 发表于: 2010-05-07
我刚学QT,小弟也不懂怎么调试。这个函数只有在收到串口数据时才有执行吧!而串口的数据是我自己用AVR单片机发出的,只有我按下键时才有数据送出,我认为textBrowser显示串口数据时,receiveNumEdit同时显示个数。我想不存在有100次问题,是每次时间是我用单片机控制的,间隔很长
Quote:引用楼主lyb1900于2010-05-06 09:34发表的 用int QByteArray::size () const来记串口接收到二进制数个数的问题 :
但是receiveNumEdit总是显示0
.......
这个你怎么判断的呢?眼睛看的?
如果100次中,有一次不是0,眼睛能看到么?
离线dbzhang800

只看该作者 3楼 发表于: 2010-05-07
引用楼主lyb1900于2010-05-06 09:34发表的 用int QByteArray::size () const来记串口接收到二进制数个数的问题 :
但是receiveNumEdit总是显示0
.......


这个你怎么判断的呢?眼睛看的?
如果100次中,有一次不是0,眼睛能看到么?
离线paranoid
只看该作者 2楼 发表于: 2010-05-06
为什么不自己调试看看呢?
离线lyb1900
只看该作者 1楼 发表于: 2010-05-06
有人知道不
快速回复
限100 字节
 
上一个 下一个