串列埠通訊簡單例項

2021-06-16 06:47:10 字數 3009 閱讀 1298

前幾天製作了乙個基於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...