- 论坛徽章:
- 0
|
我在开发板TQ2440运行QT编写的串口程序,但是每次只能接收到8个字符,有时还会少于8个字符。数据发送端是每隔1S发送一次。
以下是串口的设置函数与串口的读取函数。
bool SerialDialog::SetSerialAttr(int m_serial,int baudrate,int databits,int parity,int stopbits,int flowcontrol)
{
//get serial attribute
struct termios options;
if ( tcgetattr( m_serial,&options) != 0)
{
//#ifdef DEBUG
//qDebug("Get serial attribute error");
//#endif
return false;
}
//set baud rate
int i;
for ( i= 0; i < sizeof(speedArr) / sizeof(int); i++)
{
if (baudrate == nameArr)
{
//tcflush(m_serial, TCIOFLUSH);
cfsetispeed(&options, speedArr);
cfsetospeed(&options, speedArr);
break;
}
}
//set databits
switch (databits)
{
case 7:
options.c_cflag |= CS7;
break;
case 8:
options.c_cflag |= CS8;
break;
default:
#ifdef DEBUG
qDebug("Unsupported data size,%d",databits);
#endif
return false;
}
//set parity
switch (parity)
{
case 0: //none
options.c_cflag &= ~PARENB;
options.c_iflag &= ~INPCK;
break;
case 1: //odd
options.c_cflag |= (PARODD | PARENB);
options.c_iflag |= INPCK;
break;
case 2: //even
options.c_cflag |= PARENB;
options.c_cflag &= ~PARODD;
options.c_iflag |= INPCK;
break;
case 3: //
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
break;
default:
#ifdef DEBUG
qDebug("Unsupported parity %d",parity);
#endif
return false;
}
//set stopbits
switch (stopbits)
{
case 1:
options.c_cflag &= ~CSTOPB;
break;
case 2:
options.c_cflag |= CSTOPB;
break;
default:
#ifdef DEBUG
qDebug("Unsupported stop bits %d",stopbits);
#endif
return false;
}
switch(flowcontrol)
{
case 0: //no flow control
options.c_cflag &= ~CRTSCTS;
options.c_iflag &= ~(IXON | IXOFF | IXANY);
break;
case 1: //hardware flow contorl
options.c_cflag |= CRTSCTS;
options.c_iflag &= ~(IXON | IXOFF | IXANY);
break;
case 2: //software flow contorl
options.c_iflag |= (IXON | IXOFF | IXANY);
options.c_cflag &= ~CRTSCTS;
break;
}
options.c_iflag &= ~(INLCR | IGNCR | ICRNL);
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // select raw input已采用了非标准的模式。
options.c_oflag &= ~ OPOST;
//choose raw output
//clear c_cflag
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~CSIZE;
tcflush(m_serial,TCIOFLUSH);
options.c_cc[VTIME] = 60;
options.c_cc[VMIN] = 60;
if (tcsetattr(m_serial,TCSANOW,&options) != 0)
{
//#ifdef DEBUG
//qDebug("SetupSerial");
//#endif
//return false;
}
return true;
}
以下是一个线程的run函数,主要负责串口的数据读取
void ReadThread::run()
{
struct timeval timeout;
int fd_num;
int usedLen;
size_t bufLen;
tcflush(m_serial,TCIOFLUSH);
while(1)
{
qDebug()<<"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$";
FD_ZERO(&m_readSet);
FD_SET(m_serial,&m_readSet);
timeout.tv_sec = 0;
timeout.tv_usec = 300*000;
//sleep(1);
fd_num = select(m_serial + 1, &m_readSet, NULL, NULL, &timeout);
if(fd_num>0)
{
if(ioctl(m_serial, FIONREAD, &m_aviLen) < 0)
{
#ifdef DEBUG
qDebug("Error %s\n",strerror(errno));
#endif
}
if(m_aviLen>0)
{
msleep(800);
qDebug()<<m_aviLen<<"iiiii";
usedLen = read(m_serial,m_recvBuf,m_aviLen);
qDebug()<<"usedLen2024"<<usedLen;
qDebug()<<"m_recvBuf2024"<<m_recvBuf;
bufLen=strlen(m_recvBuf);
if(m_data !=NULL)
delete[] m_data;
m_data=new char[bufLen];
memcpy(m_data,m_recvBuf,bufLen);
//qDebug()<<"xxxxx"<<m_data<<bufLen;
QByteArray array(m_data,bufLen);
QString result(array);
//qDebug()<<result<<"zzzzzz"<<result.at(0);
if(result.at(0) == QChar('$'))
{
qDebug()<<"wwwwww";
}
else
{
//::tcflush(m_serial,TCIOFLUSH);
}
//tcflush(m_serial,TCIOFLUSH);
bufLen=0;
bzero(m_recvBuf,1024);
}
}
}
exec();
} |
|