wince串列埠工具的編寫心得

2021-05-23 00:48:11 字數 3016 閱讀 5086

必須設定vertical scrollbar = true

必須設定multiline = true

必須設定horizontal scrollbar = false

必須設定auto hscroll = false

可選設定want return = false  

可選設定auto vscroll = true

方法一:(當edit對映到一cstring時)

m_string = m_string + snewstring + "/r/n" //自動換行

updatedata(false);

此法只能做到自動換行,不會自動滾屏到最後一行。

方法二:(當edit對映到一edit時)

m_edit.setsel(-1, -1); //自動滾屏

m_edit.replacesel(snewstring+"/r/n"); //自動換行

updatedata(true);

此法可以做到自動換行,並自動滾屏到最後一行。

以上,m_string、m_edit.分別為給編輯框新增的成員變數;snewstring 為要顯示的字串

注意二法中updatadata引數的區別。

每次讀完乙個位元組,接收下乙個位元組的時候,會對一下,對比hjb的串列埠工具,發現他的接收很快,哪怕調到1ms自動傳送,而我的調到1ms自動傳送,我的 接收視窗就不顯示了。另外乙個有趣的發現是只要執行一下hjb的串列埠工具,再執行我的就ok,接收也很快,分析認為是有的地方我沒有初始化,

最後終於發現,是

commtimeouts:commtimeouts的關係:

介紹如下:

commtimeouts:commtimeouts主要用於串列埠超時引數設定。commtimeouts結構如下:

typedef struct _commtimeouts commtimeouts,*lpcommtimeouts;

readintervaltimeout

:兩字元之間最大的延時,當讀取串列埠資料時,一旦兩個字元傳輸的時間差超過該時間,讀取函式將返回現有的資料。設定為0表示該引數不起作用。指定時間最大值(毫秒),充許接收的2個位元組間有時間差。也就    是說,剛接收了乙個位元組後,等了readintervaltimeout

時間後還沒有新的位元組到達,就 認為本次讀串列埠操作結束(後面的位元組等下一次讀取操作來處理)。即使你想讀8個位元組,但讀第2個位元組後,過了readintervaltimeout

時間後,第3個位元組還沒到。實際上就唯讀了2個位元組。   

readtotaltimeoutmultiplier:指定比例因子(毫秒),實際上是設定讀取乙個位元組和等待下乙個位元組所需的時間,這樣總的超時時間為讀取的位元組數乘以該值,同樣一次讀取操作到達這個時間後,也認為本次讀操作己經結束。   

readtotaltimeoutconstant:一次讀取串列埠資料的固定超時。所以在一次讀取串列埠的操作中,其超時為readtotaltimeoutmultiplier乘以讀取的位元組數再加上 readtotaltimeoutconstant。將readintervaltimeout設 置為maxdword,並將readtotaltimeoutmultiplier 和readtotaltimeoutconstant設定為0,表示讀取操作將立即返回存放在輸入緩衝區的字元。可以理解為乙個修正時間,實際上就是按 readtotaltimeoutmultiplier計算出的超時時間再加上該時間才作為整個超時時間。   

writetotaltimeoutmultiplier:寫入每字元間的超時。

writetotaltimeoutconstant:一次寫入串列埠資料的固定超時。所以在一次寫入串列埠的操作中,其超時為 writetotaltimeoutmultiplier乘以寫入的位元組數再加上 writetotaltimeoutconstant。

一般都會做以下設定:

timeouts.readintervaltimeout=maxdword;

// 把間隔超時設為最大,把總超時設為0將導致readfile立即返回並完成操作

timeouts.readtotaltimeoutmultiplier=0;

//讀時間係數

timeouts.readtotaltimeoutconstant=0;

//讀時間常量

timeouts.writetotaltimeoutmultiplier=50;

//總超時=時間係數*要求讀/寫的字元數+時間常量

timeouts.writetotaltimeoutconstant=2000;

//設定寫超時以指定writecomm成員函式中的

總結: 我起初沒有設定這個超時引數,導致使用過了乙個預設的超時引數,1000ms,目前配置的方式如下:

commtimeouts commtimeouts;

getcommtimeouts (hcom, &commtimeouts);

//不使用這個逾時功能,readfile直到所有字元接收完才會返回

commtimeouts.readintervaltimeout = 10;//如果此值為0表示不使用功能,如果為10,則表示在10ms內沒有接收到下乙個位元組,則認為超時,表示本次讀串列埠操作結束

commtimeouts.readtotaltimeoutmultiplier = 0;

commtimeouts.readtotaltimeoutconstant = 0;

if (!setcommtimeouts(hcom,&commtimeouts) )

設定commtimeouts.readintervaltimeout =10ms

分析出錯的原因: 我在每次等到串列埠事件的時候我要讀1024個位元組,並且我沒有設定超時參 數,預設的是1秒的話,因此問題來了,假設我在1秒內傳送了很多個位元組,這時只要不大於1024個他就不會返回,也就是說不會顯示,如果我在1秒內只傳送 了1個位元組,那麼它需要等待1秒確認沒有下乙個位元組要接收的時候,才會返回本次的讀串列埠操作,所以會覺得比hjb的慢,最後改引數為10ms就ok了,

還是技術上掌握的不夠全面不夠深入。

WinCE串列埠藍芽的實現

此篇文章用於說明如何在wince系統上實現串列埠藍芽,希望給想在ce上實現這個功能的 新手 朋友乙個幫助。先說一下我的硬體環境 csr bc4 rom藍芽晶元,s3c6410,wince6.0系統。硬體連線 把藍芽的rx,tx,cts,rts和板子上的相應口連線,注意是交叉連線,我這裡連線的是uar...

WinCE串列埠藍芽的實現

此篇文章用於說明如何在wince系統上實現串列埠藍芽,希望給想在ce上實現這個功能的 新手 朋友乙個幫助。先說一下我的硬體環境 csr bc4 rom藍芽晶元,s3c6410,wince6.0系統。硬體連線 把藍芽的rx,tx,cts,rts和板子上的相應口連線,注意是交叉連線,我這裡連線的是uar...

C 串列埠連線的讀取與傳送(附串列埠工具的編寫原始碼)

一 串列埠連線的開啟與關閉 串列埠,即com口,在.net中使用serialport類進行操作。串列埠開啟與關閉,是涉及慢速硬體的io操作,頻繁開啟或關閉會影響整體處理速度,甚至導致開啟或關閉串列埠失敗。非特殊情況,串列埠一次性開啟後,在退出程式時關閉串列埠即可。在開啟串列埠前,可以設定一些常用的引...