今兒看了幾篇碩士**,又看到了有人在用mscomm控制項編的串列埠。當時我就不太懂這玩意兒是怎麼用的,其實是因為在mfc(visual studio 2013環境)裡怎麼找也找不到這個控制項。。。好吧,偷懶不成只好自己編乙個串列埠類來實現功能了。
參考了很多文獻和csdn上的前輩的程式,最後編了乙個小玩意兒,雖然不大,但是設定、收發、等待和其他一些功能也是完備了。
直接上**吧,以供後來人參考,回報社會。
(p.s. 1. 串列埠使用非重疊模式(在**中標識為非同步模式,兩者是否嚴格等價有待考證),執行收發程式時不必等待操作完成;2. 串列埠名實際命名為\\\\.\\comx,x是串口號,這樣可以建立10以上的串列埠)
標頭檔案
#ifndef myserialport_h_
#define myserialport_h_
#include "stdafx.h"
#include "mymutex.h"
class cserialport
// 初始化串列埠屬性的基本操作
bool createport();
void baud_config(dword baud = 57600);
void queuesize_config(dword inqueuesize = 1024, dword outqueuesize = 1024);
void timeout_config(dword rt = 0, dword rm = 0, dword rc = 0, dword wm = 0, dword wc = 0);
// 獲取控制代碼
handle getserialhandle();
// close handle
bool releasehandle();
// 獲取錯誤碼
dword geterrorcode();
// 配置串列埠讀寫的操作
void initparamofrw(bool ifwaitread = true, bool ifwaitwrite = true);
// 串列埠讀寫函式
bool recvdata(char* bufferrecv);
bool senddata(char* m_szwritebuffer, uint num = null, bool default = true);
// 判斷讀寫超時
};#endif
原始檔
#include "stdafx.h"
#include "myserialport.h"
cserialport::cserialport(cstring name)
cserialport::cserialport(cserialport & obj_port)
cserialport & cserialport::operator = (const cstring name)
cserialport::~cserialport()
}bool cserialport::createport()
isclose = false;
// set specific serial port event
setcommmask(m_hcomm,
ev_break | ev_cts | ev_dsr | ev_err | ev_rxchar | ev_txempty);
issetbaud = baudexeu();
issetqueue = queueexeu();
issettimeout = timeoutexeu();
initparamofrw(false, true);
iscreate = true;
return true;
}inline bool cserialport::baudexeu()
//set dcb to configure the serialport
dcb.dcblength = sizeof(dcb);
//serial port config
dcb.baudrate = m_baud;
dcb.parity = noparity;
dcb.fparity = 0;
dcb.stopbits = onestopbit;
dcb.bytesize = 8;
dcb.foutxctsflow = 0;
dcb.foutxdsrflow = 0;
dcb.fdtrcontrol = dtr_control_disable;
dcb.fdsrsensitivity = 0;
dcb.frtscontrol = rts_control_disable;
dcb.foutx = 0;
dcb.finx = 0;
//misc parameters
dcb.ferrorchar = 0;
dcb.fbinary = 1;
dcb.fnull = 0;
dcb.fabortonerror = 0;
dcb.wreserved = 0;
dcb.xonlim = 2;
dcb.xofflim = 4;
dcb.xonchar = 0x13;
dcb.xoffchar = 0x19;
dcb.evtchar = 0;
//set dcb
if (!setcommstate(m_hcomm, &dcb))
return true;
}inline bool cserialport::queueexeu()
return true;
}inline bool cserialport::timeoutexeu()
return true;
}void cserialport::baud_config(dword baud)
void cserialport::queuesize_config(dword inqueuesize, dword outqueuesize)
void cserialport::timeout_config(dword rt, dword rm, dword rc, dword wm, dword wc)
handle cserialport::getserialhandle()
bool cserialport::releasehandle()
purgecomm(m_hcomm,
purge_txclear | purge_rxclear | purge_txabort | purge_rxabort);
if (!closehandle(m_hcomm))
m_dwerror = getlasterror();
m_hcomm = null;
iscreate = false;
isclose = true;
return true;
}dword cserialport::geterrorcode()
void cserialport::initparamofrw(bool ifwaitread, bool ifwaitwrite)
bool cserialport::recvdata(char* bufferrecv)
*/ if (!readfile(m_hcomm,//handle to comm port
bufferrecv,//rxbuffer pointer
m_comstat.cbinque, //read m_comstat.cbinque bytes
&m_bytesread,//stores number of bytes read
&m_ovread))//pointer to the m_ov structure
return false;
} return true;
} return true;
}bool cserialport::senddata(char* m_szwritebuffer, uint num, bool default)
return false;
} return true;
} return true;
}
Windows 下串列埠程式設計
經常需要用到windows下的串列埠工具。某些時候,現有的工具不能滿足需求,於是需要自己開發寫個串列埠小工具,來完成某些操作。windows下串列埠工具的源 很多,有用cserial類的,有用mfc串列埠控制項的。個人感覺,都不是很好用。甚至有時候只要要個命令列下的串列埠工具,不需要介面,敲入不同的...
Windows下串列埠程式設計
造冰箱的大熊貓 cnblogs 2019 1 27 將windows下串列埠程式設計相關資訊進行下簡單小結,以備後用。1 開啟串列埠 開啟串列埠使用createfile 函式。以開啟com6為例 handle hcomm hcomm createfile text com6 generic read...
Windows下SecureCRT串列埠終端顯示
在學習 朱有鵬老師嵌入式linux核心課程 的 1.16.arm裸機第十六部分 shell原理和問答機制引入 的 1.16.3.shell實戰2 將簡易shell移植到開發板中 的部分的時候,通過看對應的 3.shell x210 的程式 總結出下面securecrt終端的串列埠通訊過程中的顯示步驟...