主題:請幫忙分析一下 共有45876人關注過本帖 |
---|
linman |
1樓 |
請幫忙分析一下 Post By:2009-9-3 15:38:00 [只看該作者]
c#程序中設置了兩個線程,一個是CAN接收線程,一個是數據解析線程,它們公用一個buffer,接收線程等待數據進來就放入buffer,解析線程以5ms為周期從buffer中讀數進行解析;當以5ms為周期或更快速度發送數據時,從解析線程中讀這個buffer中的數據就不對了,比如連續發了id為0 、1、2的CAN數據,解析線程讀到的ID有可能是0、1、1,為什么會發生這種現象?兩個線程優先級都是abovenormal。
|
|
單帖管理 | 引用 | 回復 |
lqk |
2樓 信息 | 搜索 | 郵箱 |
加好友 發短信 |
Post By:2009-9-3 16:04:00 [只看該作者]
當以5ms為周期或更快速度發送數據時,CAN接收線程將以5ms或更快的速度刷新你的buffer,而你的數據解析線程以5ms為周期工作,這樣有數據就會丟失或出錯
建議在CAN接收線程中用一環形buffer緩存收到的數據。 |
單帖管理 | 引用 | 回復 |
linman |
3樓 |
Post By:2009-9-3 16:26:00 [只看該作者]
可是如果解析的線程不讀走buffer中的數據,buffer不會被清阿?難道向buffer中添加新的數據會把以前的沖掉嗎?為什么環形buffer能解決問題呢?
|
|
單帖管理 | 引用 | 回復 |
lqk |
4樓 信息 | 搜索 | 郵箱 |
加好友 發短信 |
Post By:2009-9-3 17:10:00 [只看該作者]
在接收線程中,只要收到一幀數據就放入環形buffer中
在解析線程中解析環形buffer中的數據,一直將buffer中的數據讀空為止,對環buf操作時要注意線程同步. |
單帖管理 | 引用 | 回復 |
linman |
5樓 |
Post By:2009-9-3 18:12:00 [只看該作者]
我用的buffer是個ArrayList,接收線程只要收到數據就添加到ArrayList中,解析線程每次獲得ArrayList中的所有元素進行解析,然后清空,在對ArrayList進行添加和遍歷時用Mutex進行同步,這樣有問題嗎?
|
|
單帖管理 | 引用 | 回復 |
lqk |
6樓 信息 | 搜索 | 郵箱 |
加好友 發短信 |
Post By:2009-9-4 9:22:00 [只看該作者]
你的同步是不是在解析線程解析數據時,接收線程就不能向ArrayList添加數據了.我覺得這是根你兩個線程的配合有關系。
|
單帖管理 | 引用 | 回復 |
linman |
7樓 |
Post By:2009-9-4 9:49:00 [只看該作者]
對,解析時不能添加,添加時解析也不能訪問,就是兩個線程在使用buffer時都先waitone(),使用后再ReleaseMutex(),請教應該怎么配合呢
|
|
單帖管理 | 引用 | 回復 |
lqk |
8樓 信息 | 搜索 | 郵箱 |
加好友 發短信 |
Post By:2009-9-4 10:49:00 [只看該作者]
數據接收線程: bResult = CAN_GetNextReceivedFrame( ceCAN->m_hCAN, &ceCAN->RxMFrame ); if( bResult ) {     memcpy( ceCAN->ReceiveBuf[ceCAN->m_bufPutIdx], &ceCAN->RxMFrame, 13 );     ceCAN->m_bufPutIdx = ( ceCAN->m_bufPutIdx+1 )% BUF_MAX; } 數據解析線程:     while( m_bufGetIdx != m_bufPutIdx )     {         memcpy( buf, ReceiveBuf[m_bufGetIdx], i );         //數據解析         m_bufGetIdx = (m_bufGetIdx+1) % BUF_MAX;     } 兩線程不需要同步 |
單帖管理 | 引用 | 回復 |
linman |
9樓 |
Post By:2009-9-4 13:24:00 [只看該作者]
謝謝您的回復 ,主要我不明白為什么會發生這種現象?用環形為什么就能解決?另外,C#的話我要怎么構造呢?
|
|
單帖管理 | 引用 | 回復 |
linman |
10樓 |
Post By:2009-9-4 13:43:00 [只看該作者]
是否需要一個標志用于同步兩個線程,是因為沒有做這個同步處理才導致發生這種現象嗎?
|
|
單帖管理 | 引用 | 回復 |
qjh2008 |
11樓 |
Post By:2009-9-8 14:54:00 [只看該作者]
使用serialport控件很好用的
|
|
單帖管理 | 引用 | 回復 |
zhl |
12樓 |
Post By:2009-9-8 16:48:00 [只看該作者]
兩個不同的線程使用了一個數據區,應用程序中是需要加以保護的。
|
|
單帖管理 | 引用 | 回復 |