modscan36--my milestone
生活随笔
收集整理的這篇文章主要介紹了
modscan36--my milestone
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://download.csdn.net/detail/luck_good/3798729
經過幾天的努力終于實現了我的modscan36,幾點筆記,
1.
使用api讀寫串口(網上下載的已經封裝過的串口類CComControl)。
2.
按照modscan32的邏輯應該是所有new出來的childframe組是共享一個串口對象的。即一個app只開一個串口,所以將串口對象定義成全局的了,CComControl* m_Com;???
并在InitInstance函數中創建對象 m_Com = new CComControl(pMainFrame->m_hWnd)(還有crc = new Crc(16,0X8005,1,0XFFFF,0);)
3.
3個view分別是
class CMdi_modbus1View : public CFormView
class CMyDataView : public CView
class CMyCurveView : public CView
上面的視modbus1View 用于用戶交互,繼承于CFormView,本來要和modscan32那樣不用formview的,但動態new和create各個控件和排列控件還需要花時間去算,不如formview直接拖的省事。
左邊的視CMyDataView 用于顯示數據,繼承于cview,打印數據。將發送數據緩沖區(從doc中get,是doc的成員變量,是CMdi_modbus1View傳遞給doc的buff指針)的值和接受數據緩沖區(全局)的值textout。
右邊的CMyCurveView 用于繪圖,將接受數據緩沖區(全局)的值畫出來。
4.
接收數據:構造m_Com對象時,指定了了接收消息的HWND窗口句柄是pMainFrame->m_hWnd,因為想不到其他是什么窗口可以接收這個消息,所以就用這個了(用view去接收肯定不行的,應為這里即使打開一個childframe也會有3個view,并且在打開多個childframe時,有眾多的view,他們大部分都需要串口接收到的數據以繪圖,那么此時指定哪個view呢?所以不要用view)。這樣的話,在mainframe的WindowProc虛函數里就要處理消息并分揀數據以傳遞給打開過的不同的doc(childframe組)的成員變量,然后附屬于該doc的view就可以用 (CMdi_modbus1Doc*)GetDocument()獲取到該doc的數據成員。從圖中可明顯看出3個view對應1個doc,,他們共同構成1個childframe。是3面1體。
有點麻煩的就是分揀了,那個childfram里的view(CMdi_modbus1View)發得請求,就把對應該請求的從機的回復分配到他的doc里。--當然如果僅打開一個childframe就不需要
分揀了,直接傳遞過去就行了。我這里就是這么搞的---O(∩_∩)O~。但比這個更隨意一點,接收buff使用的是全局變量,傳也沒傳,在view中直接使用全局變量buff繪圖的,沒拐到doc里要數據。--所以這個程序在打開多個childframe的時候response_times下的接收到數據就會紊亂。--恩,開一個childframe沒問題的。
5
.發送數據:本來打算每打開一個childframe就添加一個線程用于定時發送數據。后來觀察modscan32發現不管打開多少childframe都是4個線程,想了想,在線程函數中讀取
view的數據也不太好辦(新手),就按照每打開一個childframe就添加一個定時器去定時0.5s發送好了,使用主線程,不過沒怎么影響界面操作。
發送數據緩沖區沒必要用全局變量了,使用的是view中的一個局部變量yxdata,通過界面上控件獲取各個信息以構造modbus幀的發送buff即yxdata,是static。然后調用m_Com發送,然后將yxdata首地址賦給給doc里的對應指針。這里yxdata需要使用static,因為是局部變量yxdata在每次函數執行完畢都會清掉,然后在下一次執行時,分的內存位置就不一定時上次的那個,這樣傳遞到doc中,再被其他view訪問的時候,可能這個內存區域已經是別的東東了,所以就有可能(或者說一定)出錯。所以要用static修飾一下。
6.
view的重繪
在CMdi_modbus1View 的定時器函數中調用,? ??? ???
this->GetDocument()->UpdateAllViews(NULL);//更新所有view,發出消息
在CMyDataView 和CMyCurveView的??OnUpdate函數中調用??? CWnd::Invalidate();以使本view調用OnDraw函數進行重繪
7.
CMyDataView和CMyCurveView中實現重繪功能即OnDraw函數,doc里沒有實現保存功能即Serialize函數。沒有modbus-tcp,沒有modbus-ascii。O(∩_∩)O不是本業,要求不高。
但更重要的是默認是9600 even 8 1,而沒將它開放出來,想使用就改源碼吧
經過幾天的努力終于實現了我的modscan36,幾點筆記,
1.
使用api讀寫串口(網上下載的已經封裝過的串口類CComControl)。
2.
按照modscan32的邏輯應該是所有new出來的childframe組是共享一個串口對象的。即一個app只開一個串口,所以將串口對象定義成全局的了,CComControl* m_Com;???
并在InitInstance函數中創建對象 m_Com = new CComControl(pMainFrame->m_hWnd)(還有crc = new Crc(16,0X8005,1,0XFFFF,0);)
3.
3個view分別是
class CMdi_modbus1View : public CFormView
class CMyDataView : public CView
class CMyCurveView : public CView
上面的視modbus1View 用于用戶交互,繼承于CFormView,本來要和modscan32那樣不用formview的,但動態new和create各個控件和排列控件還需要花時間去算,不如formview直接拖的省事。
左邊的視CMyDataView 用于顯示數據,繼承于cview,打印數據。將發送數據緩沖區(從doc中get,是doc的成員變量,是CMdi_modbus1View傳遞給doc的buff指針)的值和接受數據緩沖區(全局)的值textout。
右邊的CMyCurveView 用于繪圖,將接受數據緩沖區(全局)的值畫出來。
4.
接收數據:構造m_Com對象時,指定了了接收消息的HWND窗口句柄是pMainFrame->m_hWnd,因為想不到其他是什么窗口可以接收這個消息,所以就用這個了(用view去接收肯定不行的,應為這里即使打開一個childframe也會有3個view,并且在打開多個childframe時,有眾多的view,他們大部分都需要串口接收到的數據以繪圖,那么此時指定哪個view呢?所以不要用view)。這樣的話,在mainframe的WindowProc虛函數里就要處理消息并分揀數據以傳遞給打開過的不同的doc(childframe組)的成員變量,然后附屬于該doc的view就可以用 (CMdi_modbus1Doc*)GetDocument()獲取到該doc的數據成員。從圖中可明顯看出3個view對應1個doc,,他們共同構成1個childframe。是3面1體。
有點麻煩的就是分揀了,那個childfram里的view(CMdi_modbus1View)發得請求,就把對應該請求的從機的回復分配到他的doc里。--當然如果僅打開一個childframe就不需要
分揀了,直接傳遞過去就行了。我這里就是這么搞的---O(∩_∩)O~。但比這個更隨意一點,接收buff使用的是全局變量,傳也沒傳,在view中直接使用全局變量buff繪圖的,沒拐到doc里要數據。--所以這個程序在打開多個childframe的時候response_times下的接收到數據就會紊亂。--恩,開一個childframe沒問題的。
5
.發送數據:本來打算每打開一個childframe就添加一個線程用于定時發送數據。后來觀察modscan32發現不管打開多少childframe都是4個線程,想了想,在線程函數中讀取
view的數據也不太好辦(新手),就按照每打開一個childframe就添加一個定時器去定時0.5s發送好了,使用主線程,不過沒怎么影響界面操作。
發送數據緩沖區沒必要用全局變量了,使用的是view中的一個局部變量yxdata,通過界面上控件獲取各個信息以構造modbus幀的發送buff即yxdata,是static。然后調用m_Com發送,然后將yxdata首地址賦給給doc里的對應指針。這里yxdata需要使用static,因為是局部變量yxdata在每次函數執行完畢都會清掉,然后在下一次執行時,分的內存位置就不一定時上次的那個,這樣傳遞到doc中,再被其他view訪問的時候,可能這個內存區域已經是別的東東了,所以就有可能(或者說一定)出錯。所以要用static修飾一下。
6.
view的重繪
在CMdi_modbus1View 的定時器函數中調用,? ??? ???
this->GetDocument()->UpdateAllViews(NULL);//更新所有view,發出消息
在CMyDataView 和CMyCurveView的??OnUpdate函數中調用??? CWnd::Invalidate();以使本view調用OnDraw函數進行重繪
7.
CMyDataView和CMyCurveView中實現重繪功能即OnDraw函數,doc里沒有實現保存功能即Serialize函數。沒有modbus-tcp,沒有modbus-ascii。O(∩_∩)O不是本業,要求不高。
但更重要的是默認是9600 even 8 1,而沒將它開放出來,想使用就改源碼吧
總結
以上是生活随笔為你收集整理的modscan36--my milestone的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是eager loading
- 下一篇: 一些应该记住的东西(持续更新?再也不会更