星期日, 12月 24, 2006
Program Win32 program, Read data from COM port buffer.
{
DCB dcb;
DWORD dwReadStatId;
HANDLE hRead;
開啟COM port, Overlapped屬性准許檔案同時被讀/寫
// Step I.
ComDev = CreateFile( "COM7",
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
0 );
if(ComDev == INVALID_HANDLE_VALUE)
{
GetDlgItem(IDC_MYTEXT)->
SetWindowText("Error! When open COM-PORT.");
}
else
{
設定 COM port 讀/寫 Buffer. 如果沒有設定 Buffer 大小,COM port 會使用先前所設定的。
// Step II.
if( !SetupComm(ComDev, MAX_READ_BUFFER, MAX_WRITE_BUFFER) )
{
GetDlgItem(IDC_MYTEXT)->
SetWindowText("Setup COMM error!");
return;
}
設定讀/寫 Timing
// Step III.
COMMTIMEOUTS time_out = {0, 0, 0, 0, 0};
time_out.ReadIntervalTimeout = MAXDWORD;
//time_out.ReadTotalTimeoutMultiplier = MAXDWORD;
//time_out.ReadTotalTimeoutConstant = 50;
// 5s time_out.WriteTotalTimeoutConstant = 5000;
// 50ms //time_out.WriteTotalTimeoutMultiplier = 5;
if( !SetCommTimeouts(ComDev, &time_out) )
{
GetDlgItem(IDC_MYTEXT)->
SetWindowText("Set COMM timeout error!");
return;
}
設定 COM port 屬性
// Step IV.
GetCommState(ComDev, &dcb);
dcb.BaudRate = CBR_57600;
dcb.ByteSize = 8; dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
if( !SetCommState(ComDev, &dcb) )
GetDlgItem(IDC_MYTEXT)->
SetWindowText("Set COMM State ERROR!");
產生一 Thread 執行讀取工作
hRead = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)ReadProc, (LPVOID)this, 0, &dwReadStatId ); if(hRead == NULL)
GetDlgItem(IDC_MYTEXT)->
SetWindowText("Error! CreateThread(Read)");
GetDlgItem(IDC_MYTEXT)->
SetWindowText("Open COM-PORT Successfully!");
}
}
DWORD WINAPI ReadProc(LPVOID lpV)
{
DWORD dwRes, dwErr, dwLen;
CRMSDlg *p = (CRMSDlg*)lpV;
CString str; COMSTAT comstat;
osRead.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if( osRead.hEvent == NULL) {
// Error.
}
while(1)
{
ClearCommError(ComDev, &dwErr, &comstat);
dwLen = comstat.cbInQue;
if(!dwLen) {
Sleep(200);
continue;
}
if( !ReadFile(ComDev, lpBuf, dwLen, &dwLen, &osRead) )
{
if( GetLastError() != ERROR_IO_PENDING) {
p->
GetDlgItem(IDC_MYTEXT)->
SetWindowText("Error");
}
else {
switch( WaitForSingleObject(osRead.hEvent, 1000) )
{
case WAIT_OBJECT_0:
if( GetOverlappedResult(ComDev, &osRead, &dwLen, FALSE) ) p->
GetDlgItem(IDC_MYTEXT)->
SetWindowText(lpBuf);
else
// Error. p->
GetDlgItem(IDC_MYTEXT)->
SetWindowText("Error"); break;
case WAIT_TIMEOUT:
// Error. p->
GetDlgItem(IDC_MYTEXT)->
SetWindowText("Error");
break;
default: // Error. p->
GetDlgItem(IDC_MYTEXT)->
SetWindowText("Error");
} // switch
}
}
else
p->GetDlgItem(IDC_MYTEXT)->
SetWindowText(lpBuf);
}
}
星期日, 10月 15, 2006
MFC 訊息分類
MFC,把訊息分為三大類:
1. 命令訊息( WM_COMMAND )
舉凡由UI產生的訊息都是這種命令訊息,可能來自選單、加速鍵或工具按鈕都是以WM_COMMAND呈現。
什麼樣的類別有資格接受命令訊息?衍生自CCmdTarget之類皆有資格。
2. 標準訊息
除了WM_COMMAND外,任何以WM_開頭的都算這一類,任何衍生自 CWnd之類別均可接收此訊息。
3. Control Notification
由控制元件產生,為的是向父視窗通知某種情況。例如;你在ListBox上選擇某一項目,ListBox 就會產生LBN_SELCHANGE給父視窗。這類訊息也是以WM_COMMAND的形式呈現。wParam 記錄著此訊息來自那一個選單。只要是CWnd的是衍生類別就可以攔下任何Windows訊息。
與視窗無關的MFC類別(例如:CDocument & CWinApp )如果也想處理訊息,必須衍生自CCmdTarge並且只能接收WM_COMMAND的訊息。
星期三, 10月 11, 2006
PreTranslateMessage
CWnd::PreTranslateMessage(), 為虛擬函數,所有CWnd的衍生類別均可修改之,Windows 在執行Dispatch Message前,會呼叫該函數。假設衍生類別需要預先intercept (攔截)特定的訊息時可修改其內容。
Window 訊息流向:子視窗 --> 父視窗
例如:
控制項(Edit)在Dialog B中,而Dialog A為Dialog B的父視窗,假設視窗的Focus在控制項Edit上,使用者按下鍵盤後是由誰先處理Message?
是由控制項(Edit)先接收到該Message。
假設PreTranslateMessage被改寫了,該函數的回傳值所代表的意義
False: 告知父視窗Message需要再處理
True: 告知父視窗Message不需要再處理
星期五, 10月 06, 2006
星期五, 9月 22, 2006
初使用MFC寫Application, 不知道如何在Dialog中攔截Enter & Escape鍵!
為什麼要攔截這兩個鍵? 目的是希望使用者按下這個鍵時而關閉Dialog.
星期四, 9月 21, 2006
Simple type has a permanently open list box and you are able to type in Edit control.
Dropdown type has a 'closed' list box which can be opened by clicking on the 'drop down' button. The Edit control WILL accept input.
Drop List type has a 'closed' list box which can be opened by clicking on the 'drop down' button. The Edit control will NOT accept any input.
星期一, 9月 18, 2006
To run an *.exe command in windows forms when designing a Gui.
| Hiw to run an *.exe command in windows forms when designing a Gui
|
| Replies: 1 Pages: 1 | ||
|---|---|---|
| Unread | Author | Topic: Hiw to run an *.exe command in windows forms when designing a Gui |
| | Guest | posted 9/15/2006 02:01 PM EDT reply Hi I am designing a gui that makes it easier for the user to run a few commands from the command window. the user enters the 2 inputs to the windows form and press a button. I am coding in C++, How can i run an exe file that uses the 2 inputs from the user from windows form? |
| | Guest | posted 9/15/2006 05:47 PM EDT reply A lot of ways you can use: 1)ShellExecuteEx(); 2) ShellExecute(); 3) spawnl(); 4) CreateProcess(); |
星期一, 8月 21, 2006
Note
用Open Source工具開發軟體
新軟體開發關念
黃 郁熙
Copyright © 2001 by 黃郁熙
Content:
編輯器的介紹, emacs & vi
CVS 版本控制系統
GNU Compiler Collection, ELF-file
Makefile 撰寫
----------------------------------------------------
inetd是等在電腦內的背景程序(daemon)。他看到有telnet要求, 就去叫 telnetd來服務,有CVS要求就去叫cvs來服務,有的系統用xinetd, 請自行修改/etc/xinetd.conf
星期日, 8月 20, 2006
proftp, Debian
Reference:
Setting up an FTP server on Debian
# apt-cache search ftp-server
# apt-get install proftpd
Stop deamon:
# /etc/init.d/proftpd stop
International Marathon
~~時間 & 地點~~
{1}
報到地點:花蓮火車站出口右側,旅遊服務中心
報到時間:2006/11/3 Fri 13:00 ~ 20:00
{2}
專車時間:
專車地點:
{3}
集合地點:東西橫貫公路牌樓
集合時間:2006/11/4 Sat A.M. 06:50
{4}
比賽時間:2006/11/4 Sat A.M. 7:00
Notes:
衣物保管:需專用保管帶, 05:00 ~ 13:00
住宿:花蓮英雄館-忠孝街分館, http://home.kimo.com.tw/wei58885/
領取餐盒:依據號碼布
已報名參加者,若在11月1日為未收到報到通知單請進與大會聯絡。(02-2585-5659)
待辦事項:
1. 借衣物保管帶
2. 訂房
3. 詢問專車時間 & 地點
星期六, 8月 19, 2006
pppoe, Debian
# apt-get remove pppoe
# apt-get install pppoe
# pppoeconf
# cat /etc/ppp/peers/dsl-provider 會看到前面幾個動作後修改的結果
在執行完 pppoeconf 後如果設定正確,便會同時建立起連線。
P.S.
# pon 啟動 pppoe 連線
# poff 關閉 pppoe 連線
Samba setting
# 修改 smb.conf ,修改[homes]下的參數writable=yes.
# 使用testparm 檢查, man samba查詢一些不錯的utilites, 像是 smbstatus..
# 重新啟動 smb deamon, 發現只有 stop smbd 並沒有 stop smbd,
所以直接 kill nmbd, smbd process,
# /etc/init.d/samba start
星期一, 8月 14, 2006
星期六, 6月 17, 2006
星期六, 5月 06, 2006
星期日, 3月 12, 2006
星期二, 1月 10, 2006
FreeRTOS Memory operation
FreeRTOS的kernel主要有3個檔案。 1. Tasks.c
2. Queue.c
3. List.c
三種記憶體操作方式
Scheme1. (heap_1.c)
當memory被allocated之後就不允許被free了。
非常試適合小系統使用,Ex: PIC, 8051。
某些條件下的system是可以使用這種memory的配置模式。
永遠不會執行function, vTaskDelete(), vQueueDelete,
也就是scheduler()開始之後不會有task劊造或刪除。 Scheme2.(heap_2.c)
用在一般的嵌入系統,可以動態的產生新的task, queue
相對也可以deletes task, queue. Scheme3.(heap_3.c)
只是把標準malloc(), free()包裝起來而已。
星期二, 1月 03, 2006
Semaphore的使用
可以把semaphore包裝(Encapsulate semaphore)在驅動printer的函數中,
Task-1呼叫該函數時並不會知道是否存取了semaphore.
Task-2也同時呼叫該函數時因為semaphore的已被Pend,
必須等待一段時間才能存取semaphore.
Pseudo code:
void Driver(char *string)
{
Acquire port's semaphore.
Send command to device.
if(GetSemaphore() != True)
{
Wait a while.
if(GetSemaphore() != True)
{
Release semaphore.
return (error code).
}
Release semaphore.
}
else
{
Release semaphore.
}
# Synchronization, I--> Unilateral rendezous.
II-> Bilateral rendezous.




















