前幾天製作了乙個基於win32控制台的串列埠通訊接收端的程式。 今天利用mfc製作了乙個類似超級終端的應用程式。包含了傳送端和接收端。
介面如下圖
關鍵**如下:
button connect響應函式, 開啟串列埠, 配置串列埠引數, 設定事件掩碼, 建立接收端執行緒。
void cmfc_commdlg::onbuttonconnect()
/*set comm info*/
if (!getcommstate(m_hcomm,&dcb))
dcb.baudrate = cbr_115200; // set the baud rate
dcb.bytesize = 8; // data size, xmit, and rcv
dcb.parity = noparity; // no parity bit
dcb.stopbits = onestopbit; // one stop bit
if (!setcommstate(m_hcomm, &dcb))
/*set comm mask*/
if(!setcommmask(m_hcomm,ev_rxchar|ev_rxflag))
messagebox("open and connect com6 with baudrate 115200 seccussfully!");
/*test getdlgitemtext function. yes it is the member function of class cmfc_commdlg*/
/* this->getdlgitemtext(idc_edit_recv,teststr);
teststr.format("%s","hello world!");
this->setdlgitemtext(idc_edit_recv,teststr);
*/ m_hreadthread=createthread(null,0,(lpthread_start_routine)readthreadfunc,this,0,null);
closehandle(m_hreadthread);
}
接收端執行緒, 利用重疊i\o waitcommevent 等待ev_rxchar和ev_rxflag事件產生。並利用waitforsingleobject等待event產生。
dword winapi readthreadfunc(
lpvoid lpparameter // thread data);
char str[2048]=;
lptstr tb;
cstring cstr;
dword res,factbyte;
comstat rst;
int ferror,commeverror;
dword dwevtmask,commresult,readresult;
bool bret;
bool fwaitingonstat=false; // indicate if wait comm event is pending.
oscomm.hevent = createevent(null,true,false,null);
if (oscomm.hevent == null)
afxmessagebox("create comm event failed!");
osreader.hevent = createevent(null, true, false, null);
if (osreader.hevent == null)
afxmessagebox("create reader event failed!\n");
handle m_hcomm=(handle)(((cmfc_commdlg *)lpparameter)->m_hcomm);
hwnd m_hwnd=(hwnd)(((cmfc_commdlg *)lpparameter)->m_hwnd);
cedit *m_editrecv=(cedit *)(&(((cmfc_commdlg *)lpparameter)->m_edit_recv));
while(1)
else
}/*wait for pending operations to complete*/
if(fwaitingonstat)
}else
break;
case wait_timeout:
//clearcommerror(m_hcommport,&res,&rst);
//setcommmask(m_hcommport,ev_rxchar|ev_rxflag);
break;
default:
//do nothing!
break;
}} }
return 0l;
}
button send的響應函式, 獲得字串, 建立傳送端線程。(其實不必建立該執行緒, 可以直接在send的響應函式中加while迴圈,只要writefile成功後, 就推出該迴圈, 也是可以的。)
void cmfc_commdlg::onbuttonsend()
傳送端線程,利用重疊i\o writefile, waitforsingleobject等待寫操作完成。
dword winapi writethreadfunc(
lpvoid lpparameter // thread data
) while(1)
else
}/*wait for write pending operations to complete*/
if(fwaitingforwrite)
}} return 0l;
}
本應用基本實現超級終端傳送端和接收端的功能,用手機測試正常執行。
但程式有點粗糙, 待以後有時間再將其完善。
串列埠通訊簡介
簡介 串列埠是一種泛稱,uart spi iic usb等介面都屬於串列埠。而嵌入式中所說的串列埠,一般是指uart口,即通用非同步收發器 universal asynchronous receiver transmitter 由於該介面傳輸速率低等原因,在普通的計算機中基本已經被取消,但作為一種簡...
Linux下TCP通訊簡單例項
基於tcp 面向連線 的socket程式設計,分為伺服器端和客戶端 伺服器端的流程如下 1 建立套接字 socket 2 將套接字繫結到乙個本地位址和埠上 bind 3 將套接字設為監聽模式,準備接收客戶端請求 listen 4 等待客戶請求到來 當請求到來後,接受連線請求,返回乙個新的對應於此次連...
WCF通訊簡單示例
今天寫了乙個wcf demo,給大家分享,說明如下 服務介面類庫wcfservice.dll 服務實現類庫wcfservicimp.dll 服務宿主專案wcfhost 客戶端呼叫專案 wcftest 客戶端呼叫服務的時候,要引用介面類庫 wcfservice.dll 伺服器端宿主 public pa...