wince 6.0下串口接收数据有误

leonliao 2009-10-30 11:28:51
s3c6410的板子,WINCE6.0下我从串口读取数据时总是发生接收的数据不准确现象,我调试的时候看每次串口缓冲没有满,应该没有溢出,但是根据接收的数据画出来的图形看,数据不准确现象是周期性的。

现在不知道什么原因,如何解决好.

恳请大家帮帮忙!
...全文
221 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
powerDesire 2010-10-21
  • 打赏
  • 举报
回复
还是没有搞懂是怎么解决的 哎
sibling520 2009-12-18
  • 打赏
  • 举报
回复
多谢了,受到
leonliao 2009-12-10
  • 打赏
  • 举报
回复
给你回复了!
sibling520 2009-12-09
  • 打赏
  • 举报
回复
还有能不能给我把InterruptDone函数的源文件发一份,我的email; xixi319322@yahoo.com.cn
非常感谢
sibling520 2009-12-09
  • 打赏
  • 举报
回复
lz你是怎么解决的,我也遇上了这个拦路虎,
leonliao 2009-11-06
  • 打赏
  • 举报
回复
非常感谢各位的帮忙!
波特率是对的。我采用的就是异步接收的方式。是我的接受缓冲中的数据溢出了!
ProgrammerNO1 2009-11-05
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zhangwenlang 的回复:]
引用 3 楼 programmerno1 的回复:
跟异步通信有啥关系
请问CE6.0里串口能用异步通信了吗?
[/Quote]
仅供参考。。
zhangwenlang 2009-11-05
  • 打赏
  • 举报
回复
读串口那边SLEEP一下,跟SLEEP时间长度有关系
zhangwenlang 2009-11-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 programmerno1 的回复:]
跟异步通信有啥关系
[/Quote]请问CE6.0里串口能用异步通信了吗?
arm9linuxpp 2009-11-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 heyme 的回复:]
如果串口的Fifo没有溢出,那么有可能是你定义的存放数据的Buffer溢出了。
[/Quote]
我觉得这个应该是重点
han_qj 2009-11-04
  • 打赏
  • 举报
回复
我也在为接收数据丢失问题烦恼.看了上面的代码,自己设置的也没什么问题,就是大批量数据到达时收不全.请高手一起指点一下.
xqhrs232 2009-11-02
  • 打赏
  • 举报
回复
也为通信数据丢问题困扰.
烂番 2009-11-02
  • 打赏
  • 举报
回复
dcb.BaudRate = nBaud;//设置串口的通讯速度

波特率匹配否?
HeyMe 2009-10-31
  • 打赏
  • 举报
回复
如果串口的Fifo没有溢出,那么有可能是你定义的存放数据的Buffer溢出了。
宇帆 2009-10-31
  • 打赏
  • 举报
回复
可以先不画图形,让6410跟PC机通信,保证你的6410串口是好的,一步步测试
leonliao 2009-10-30
  • 打赏
  • 举报
回复
怎么没人帮忙啊!?
youyou6115 2009-10-30
  • 打赏
  • 举报
回复
是不是串口设置的不正确
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<str_port.GetLength()*2;i++)
{
if(i%2==0)
szPort[i/2]=szPort[i];
}

// //打开串口,不支持重叠操作,所以倒数第二个参数要设置成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;
}
ProgrammerNO1 2009-10-30
  • 打赏
  • 举报
回复
跟异步通信有啥关系
zhangwenlang 2009-10-30
  • 打赏
  • 举报
回复
不能用异步通信吧,你读串口线程时间要设置一下

19,524

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧