m_hSer, &dwReadError," />
主題:串口通信 共有50346人關(guān)注過(guò)本帖 |
---|
xxq2012 |
1樓 |
串口通信 Post By:2012-5-17 9:41:00 [只看該作者]
ClearCommError( lpSerial->m_hSer, &dwReadError, &cmStat );
nWillLen = cmStat.cbInQue; 為什么當(dāng)串口有數(shù)據(jù)主動(dòng)上送時(shí),串口接收線程收到的字節(jié)數(shù)是128的,而不是8個(gè)字節(jié)觸發(fā)的 |
|
單帖管理 | 引用 | 回復(fù) |
lqk |
2樓 信息 | 搜索 | 郵箱 |
加好友 發(fā)短信 |
Post By:2012-5-17 13:14:00 [只看該作者]
不太清楚你講的問(wèn)題,請(qǐng)描述具體一點(diǎn)。
|
單帖管理 | 引用 | 回復(fù) |
xxq2012 |
3樓 |
Post By:2012-5-17 13:31:00 [只看該作者]
EM9360 串口接收下面終端上送的數(shù)據(jù),數(shù)據(jù)很多,我斷點(diǎn)設(shè)在nWillLen = cmStat.cbInQue;語(yǔ)句的下一條,監(jiān)測(cè)收到的數(shù)據(jù)長(zhǎng)度,每次收到的nWillLen  =0x00000080,就是數(shù)據(jù)長(zhǎng)度達(dá)到了128個(gè)字節(jié)了,而不是8個(gè)字節(jié)
|
|
單帖管理 | 引用 | 回復(fù) |
x10 |
4樓 |
Post By:2012-5-17 14:20:00 [只看該作者]
EM9360板上的串口是DMA驅(qū)動(dòng)的,其buffer長(zhǎng)度為128字節(jié),所以當(dāng)連續(xù)接收的數(shù)據(jù)超過(guò)128個(gè)字節(jié),就會(huì)在128字節(jié)是產(chǎn)生中斷(DMA buffer切換),若發(fā)送的字節(jié)小于128字節(jié),接收在3個(gè)字節(jié)長(zhǎng)度的時(shí)間沒(méi)有進(jìn)一步的數(shù)據(jù)時(shí),會(huì)產(chǎn)生超時(shí)中斷,這時(shí)應(yīng)用程序就會(huì)收到不是128字節(jié)的數(shù)據(jù)的。
|
|
單帖管理 | 引用 | 回復(fù) |
xxq2012 |
5樓 |
Post By:2012-5-17 14:26:00 [只看該作者]
去年我調(diào)試的時(shí)候是收到8個(gè)字節(jié)就觸發(fā)了nWillLen =0x00000008,現(xiàn)在是板子改了?
|
|
單帖管理 | 引用 | 回復(fù) |
x10 |
6樓 |
Post By:2012-5-17 14:44:00 [只看該作者]
是修改了buffer長(zhǎng)度,這樣可提高效率,適應(yīng)更高波特率的應(yīng)用。這個(gè)對(duì)你有什么不利的影響嗎?
|
|
單帖管理 | 引用 | 回復(fù) |
xxq2012 |
7樓 |
Post By:2012-5-17 14:48:00 [只看該作者]
呵呵,我原來(lái)接收數(shù)據(jù)部分的代碼得修改了
|
|
單帖管理 | 引用 | 回復(fù) |
admin |
8樓 |
Post By:2012-5-18 14:50:00 [只看該作者]
串口驅(qū)動(dòng)程序提供的數(shù)據(jù)是一種流式的數(shù)據(jù),應(yīng)用程序的接收線程需要對(duì)原始數(shù)據(jù)進(jìn)行格式分析,才能提取出符合應(yīng)用需要的應(yīng)用數(shù)據(jù)包供上層使用。比方應(yīng)用數(shù)據(jù)包有n個(gè)字節(jié),格式為0x55,0xaa, {真正的數(shù)據(jù)},chksum。這時(shí)接收線程需要識(shí)別整個(gè)數(shù)據(jù)結(jié)構(gòu),并做校驗(yàn)和,這樣才能得到可靠的應(yīng)用數(shù)據(jù)包。如果用收到n個(gè)字節(jié)就作為應(yīng)用數(shù)據(jù)包,可以但肯定不可靠。因?yàn)橐坏﹤魉瓦^(guò)程出點(diǎn)錯(cuò),那就會(huì)連續(xù)好幾幀數(shù)據(jù)的丟失。
|
|
單帖管理 | 引用 | 回復(fù) |
xxq2012 |
9樓 |
Post By:2012-5-30 16:14:00 [只看該作者]
下面設(shè)備不停的發(fā)送數(shù)據(jù)上來(lái),完整的數(shù)據(jù)幀是以3個(gè)EB 90為同步字頭,幀內(nèi)包括數(shù)據(jù)長(zhǎng)度字節(jié),數(shù)據(jù)的提取,處理你們有相關(guān)的代碼和例程嗎,能發(fā)給我一份作參考嗎,請(qǐng)發(fā)送到414595534@QQ.com,謝謝!
|
|
單帖管理 | 引用 | 回復(fù) |
x10 |
10樓 |
Post By:2012-5-31 8:28:00 [只看該作者]
我們沒(méi)有統(tǒng)一的數(shù)據(jù)幀提取方法,原則是把接收線程做成一個(gè)狀態(tài)機(jī),根據(jù)具體的幀結(jié)構(gòu)會(huì)有發(fā)現(xiàn)相應(yīng)的簡(jiǎn)化算法。
|
|
單帖管理 | 引用 | 回復(fù) |
xxq2012 |
11樓 |
Post By:2012-6-1 15:09:00 [只看該作者]
那恢復(fù)成原來(lái)8個(gè)字節(jié)觸發(fā)的方式行嗎?通過(guò)燒寫(xiě)內(nèi)核,發(fā)個(gè)老版本的內(nèi)核給我,謝謝
|
|
單帖管理 | 引用 | 回復(fù) |
x10 |
12樓 |
Post By:2012-6-2 19:43:00 [只看該作者]
寫(xiě)解析應(yīng)當(dāng)很容易的。就是
switch(state) { case 0:    if(buf[i] == 0xEB)       state = 1:    break; .... } 類(lèi)似上面的流程。對(duì)串口數(shù)據(jù)通訊的程序,應(yīng)用數(shù)據(jù)包的提取應(yīng)當(dāng)是最基本的。否則通訊過(guò)程肯定是不穩(wěn)定的,這與8字節(jié)buffer還是128字節(jié)buffer沒(méi)關(guān)系。 如果一定希望要收8個(gè),自然成組,建議發(fā)送8個(gè)字節(jié)后,停4個(gè)字節(jié)的時(shí)間,再發(fā)。這樣你肯定就能收到8個(gè)字節(jié)了。 |
|
單帖管理 | 引用 | 回復(fù) |