s3c6410的板子,WINCE6.0下我从串口读取数据时总是发生接收的数据不准确现象,我调试的时候看每次串口缓冲没有满,应该没有溢出,但是根据接收的数据画出来的图形看,数据不准确现象是周期性的。
现在不知道什么原因,如何解决好.
恳请大家帮帮忙!
是不是串口设置的不正确
int open_com(int nPort, int nBaud)
{
if(m_bOpened==TRUE)//如果串口已被打开,则返回
{
RETAILMSG(1,(TEXT("the com2 is opened already...")));
return(TRUE);
}
char szPort[15];
DCB dcb;
// wsprintf(szPort,"COM%d",nPort);
CString tempstr;
tempstr.Format(_T("%d"),nPort);
CString str_port;
str_port=_T("COM")+tempstr;
memcpy(szPort,str_port,str_port.GetLength()*2);
for(int i=0;i
{
if(i%2==0)
szPort[i/2]=szPort;
}
// //打开串口,不支持重叠操作,所以倒数第二个参数要设置成0
// CreateFile ((LPCTSTR)("com2:"), GENERIC_READ | GENERIC_WRITE,0, NULL, OPEN_EXISTING,0, NULL);
// m_hComDev=CreateFile((LPCTSTR)szPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,
// FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
m_hComDev=CreateFile(TEXT("com1:"),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,
0, NULL);
// const WCHAR *g_szDrvRegPath = L"HKEY_LOCAL_MACHINE\\Drivers\\BuiltIn\\SER2410_com2";
// m_hComDev=ActivateDevice(g_szDrvRegPath,0);
if(m_hComDev==0 || m_hComDev==INVALID_HANDLE_VALUE ){
// CString str;
// str.Format(_T("com1 open. lasterror=%d"),GetLastError());
RETAILMSG(1,(TEXT("open error=%d\r\n"),GetLastError()));
RETAILMSG(1,(TEXT("the com1 opened fail\r\n")));
return (FALSE);
}
else
{
// CString str;
// str.Format(_T("com1 open. lasterror=%d"),GetLastError());
// RETAILMSG(1,(TEXT("the com1 opened ")));
}
memset(&m_OverlappedRead,0,sizeof(OVERLAPPED));
memset(&m_OverlappedWrite,0,sizeof(OVERLAPPED));
//串口超时参数设置
COMMTIMEOUTS CommTimeOuts;
CommTimeOuts.ReadIntervalTimeout = 10;
CommTimeOuts.ReadTotalTimeoutMultiplier = 10;
CommTimeOuts.ReadTotalTimeoutConstant = 50;
CommTimeOuts.WriteTotalTimeoutMultiplier = 1000;
CommTimeOuts.WriteTotalTimeoutConstant = 0;
if(!SetCommTimeouts(m_hComDev, &CommTimeOuts))
{
MessageBox(NULL,_T("can not setcommtimeout"),TEXT("Error"),MB_OK);
}
//hEvent读写事件,因为串口是异步通讯,操作可能被其他进程堵塞,程序可以通过检查该时间
//来得知是否读写完毕。事件将在读写完成后,自动设置为有效。
// m_OverlappedRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
// m_OverlappedWrite.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
//配置串行端口
//得到端口的默认设置信息
GetCommState (m_hComDev, &dcb);
//改变DCB结构设置
dcb.DCBlength = sizeof( DCB );
GetCommState( m_hComDev, &dcb );
dcb.BaudRate = nBaud;//设置串口的通讯速度
dcb.ByteSize = 8;//设置字节位数
dcb.StopBits = ONESTOPBIT; //每字节一位停止位
//初始化缓冲区中的信息 清除
PurgeComm(m_hComDev,PURGE_TXCLEAR|PURGE_RXCLEAR);
//SetupComm设置串口的读写缓冲区大小
if( !SetCommState( m_hComDev, &dcb ) ||
!SetupComm( m_hComDev, 10000, 10000 ) )//||
// m_OverlappedRead.hEvent == NULL ||
// m_OverlappedWrite.hEvent == NULL )
{
// if( m_OverlappedRead.hEvent != NULL )
// CloseHandle( m_OverlappedRead.hEvent );
// if( m_OverlappedWrite.hEvent != NULL )
// CloseHandle( m_OverlappedWrite.hEvent );
CString str;
str.Format(_T("SetupComm error. lasterror=%d"),GetLastError());
MessageBox(NULL,str,TEXT(" Error"),MB_OK);
CloseHandle( m_hComDev );
return FALSE;
}
//设置端口上指定信号的状态
// SETDTR: 发送DTR (data-terminal-ready)信号
// SETRTS: 发送RTS (request-to-send)信号
// EscapeCommFunction (m_hComDev, SETDTR);
// EscapeCommFunction (m_hComDev, SETRTS);
m_bOpened = TRUE;
return m_bOpened;
}
如果串口的Fifo没有溢出,那么有可能是你定义的存放数据的Buffer溢出了。
可以先不画图形,让6410跟PC机通信,保证你的6410串口是好的,一步步测试
dcb.BaudRate = nBaud;//设置串口的通讯速度
波特率匹配否?
我也在为接收数据丢失问题烦恼.看了上面的代码,自己设置的也没什么问题,就是大批量数据到达时收不全.请高手一起指点一下.
读串口那边SLEEP一下,跟SLEEP时间长度有关系
非常感谢各位的帮忙!
波特率是对的。我采用的就是异步接收的方式。是我的接受缓冲中的数据溢出了!
还有能不能给我把InterruptDone函数的源文件发一份,我的email; xixi319322@yahoo.com.cn
非常感谢