Windows下的串列埠類及功能實現

2021-07-10 13:20:06 字數 4075 閱讀 9601

今兒看了幾篇碩士**,又看到了有人在用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終端的串列埠通訊過程中的顯示步驟...