Arm,Linux串口数据丢失的问题
AhChi 2010-03-22 02:21:29 我的程序是这样的
while(1)
{
do job:use about 1/30 second;
m_pCom->Read(pBuffer,iSize,uMilliSescond);
}
程序运行的情况是,当数据在do job时过来,则丢掉了;去掉do job,只是不断读端口的话就不会丢数据。
为了保持FPS,读取串口时间不能设得太大,但读取时间设置的越小则丢包越严重,设为0则几乎全丢了,但在windows下用overlap读写串口则没有丢数据。我想知道linux有没有把串口来的数据buffer起来供异步读取,这个buffer大小,时间的保存有没有的设置,除了开线程外有没有办法解决?谢谢。
我的数据量很小,速率也很低,下面是我初始化和读取的代码:
int CSerialPort::Read( void* pBuffer, uint32 uBufferLength, uint32 uWaitTime /*= 0*/ )
{
fd_set fs_read;
struct timeval tv_timeout;
int retval = 0;
FD_ZERO (&fs_read);
FD_SET (m_iFD, &fs_read);
tv_timeout.tv_sec = uWaitTime / 1000;
tv_timeout.tv_usec = (uWaitTime % 1000) * 1000;
retval = select (m_iFD + 1, &fs_read, NULL, NULL, &tv_timeout);
if (retval)
return (read (m_iFD, pBuffer, uBufferLength));
else
return (-1);
}
bool CSerialPort::Open( int ComPort, int baudrate, int databit, const char *stopbit, char parity )
{
。。。。。。
fd = open (pComPort, O_RDWR | O_NOCTTY | O_NONBLOCK);
tcgetattr (fd, m_termios_old); /* save old termios value */
retval = SetPortAttr (fd, baudrate, databit, stopbit, parity);
m_iFD = fd;
return true;
}
int CSerialPort::SetPortAttr (int fd, int baudrate, int databit, const char *stopbit, char parity)
{
bzero (m_termios_new, sizeof (m_termios_new));
cfmakeraw (m_termios_new);
SetBaudrate (baudrate);
m_termios_new->c_cflag |= CLOCAL | CREAD; /* | CRTSCTS */
SetDataBit (databit);
SetParityCheck (parity);
SetStopBit (stopbit);
m_termios_new->c_oflag = 0;
m_termios_new->c_lflag |= 0;
m_termios_new->c_oflag &= ~OPOST;
m_termios_new->c_cc[VTIME] = 1; /* unit: 1/10 second. */
m_termios_new->c_cc[VMIN] = 1; /* minimal characters for reading */
tcflush (fd, TCIFLUSH);
return (tcsetattr (fd, TCSANOW, m_termios_new));
}