免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
串口通信CSerialPort類WriteToPort不能連續(xù)發(fā)送的問(wèn)題
RS232串口通信原理詳解見:hi.baidu.com/gilbertjuly/blog/item/902a3f11d4b42b0b203f2e39.html

Gilbert在串口通信中使用CSerialPort時(shí),發(fā)現(xiàn)連續(xù)發(fā)送有問(wèn)題,比如,連續(xù)發(fā)了三個(gè)數(shù)組:

m_serial.WriteToPort(chSend1);
m_serial.WriteToPort(chSend2);
m_serial.WriteToPort(chSend2);
//chSend1,chSend2,chSend3是數(shù)組首地址.

只有最后一個(gè)數(shù)組發(fā)送成功,開始以為這個(gè)類不能連續(xù)發(fā)送數(shù)據(jù),但是后來(lái)發(fā)現(xiàn)如果寫成這個(gè)樣子:

m_serial.WriteToPort(chSend1);
AfxMessageBox("");
m_serial.WriteToPort(chSend2);
AfxMessageBox("");
m_serial.WriteToPort(chSend3);
AfxMessageBox("");

三個(gè)數(shù)組的數(shù)據(jù)就都能發(fā)出去,這是為什么呢?

=========================================
這個(gè)要看CSerialPort是怎么做出來(lái)的,也就是從Windows的串口編程說(shuō)起。在Win32下,可以使用兩種編程方式實(shí)現(xiàn)串口通信,其一是使用ActiveX控件,這種方法程序簡(jiǎn)單,但是控件只能在對(duì)話框中使用。其二是調(diào)用Windows的API函數(shù),這種方法可以清楚地掌握串口通信的機(jī)制,并且自由靈活。CSerialPort類就是對(duì)串口的API函數(shù)封裝。

與以往DOS下串行通信程序不同的是,Windows不提倡應(yīng)用程序直接控制硬件,而是通過(guò)Windows操作系統(tǒng)提供的設(shè)備驅(qū)動(dòng)程序來(lái)進(jìn)行數(shù)據(jù)傳遞。串行口在Win 32中是作為文件來(lái)進(jìn)行處理的,而不是直接對(duì)端口進(jìn)行操作,對(duì)于串行通信,Win 32 提供了相應(yīng)的文件I/O函數(shù)與通信函數(shù),通過(guò)了解這些函數(shù)的使用,可以編制出符合不同需要的通信程序。

由于是作為文件來(lái)處理,我們看看windows API中打開串口的函數(shù):
HANDLE CreateFile( LPCTSTR lpFileName, //將要打開的串口邏輯名,如“COM1”;
DWORD dwDesiredAccess, //指定串口訪問(wèn)的類型,可以是讀取、寫入或二者并列;
DWORD dwShareMode, //指定共享屬性,由于串口不能共享,該參數(shù)必須置為0;
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //引用安全性屬性結(jié)構(gòu),缺省值為NULL;
DWORD dwCreationDistribution, //創(chuàng)建標(biāo)志,對(duì)串口操作該參數(shù)必須置為OPEN_EXISTING;
DWORD dwFlagsAndAttributes, //屬性描述,用于指定該串口進(jìn)行異步或同步操作;
HANDLE hTemplateFile); //對(duì)串口而言該參數(shù)必須置為NULL;

=========================================
請(qǐng)務(wù)必注意倒數(shù)第二個(gè)參數(shù)dwFlagsAndAttributes,它指示了串口進(jìn)行異步或同步操作。還請(qǐng)注意這里的同步和異步不是指的數(shù)據(jù)通信里時(shí)鐘的同步和異步。這里的同步和異步指的是:

同步操作時(shí),API函數(shù)會(huì)阻塞直到操作完成以后才能返回(在多線程方式中,雖然不會(huì)阻塞主線程,但是仍然會(huì)阻塞監(jiān)聽線程);而異步(重疊)操作方式,API函數(shù)會(huì)立即返回,操作在后臺(tái)進(jìn)行,避免線程的阻塞。

dwFlagsAndAttributes該值為FILE_FLAG_OVERLAPPED,表示使用異步的I/O;該值為0,表示同步I/O操作。

既然CSerialPort類是對(duì)API函數(shù)的封裝,我們有理由相信在它的實(shí)現(xiàn)里面必定有CreateFile函數(shù),打開它的cpp來(lái)看,果然可以搜索的到,再看看它是怎么設(shè)置的:

m_hComm = CreateFile(szPort,       // communication port string (COMX)
GENERIC_READ | GENERIC_WRITE,    // read/write types
0,                                // comm devices must be opened with exclusive access
NULL,                            // no security attributes
OPEN_EXISTING,                    // comm devices must use OPEN_EXISTING
FILE_FLAG_OVERLAPPED,      // Async I/O
0);                            // template must be 0 for comm devices

可以看到倒數(shù)第二個(gè)參數(shù)設(shè)為FILE_FLAG_OVERLAPPED,即異步發(fā)送。

=========================================
其實(shí)問(wèn)題就在這里,異步發(fā)送的話就造成文章一開始說(shuō)的兩個(gè)現(xiàn)象。

先說(shuō)第一個(gè)現(xiàn)象:為什么三個(gè)數(shù)組中只發(fā)送了最后一個(gè)數(shù)組?
因?yàn)椴捎昧水惒讲僮?,在?zhí)行到m_serial.WriteToPort(chSend1); 時(shí),并不馬上發(fā)送串口數(shù)據(jù),而是要等進(jìn)入CSerialPort的線程之后再發(fā)送(如果是同步操作,則程序停在那里等發(fā)送完成)。
你可以跟蹤一下程序,看是什么時(shí)候進(jìn)入它的線程的,三句WriteToPort都會(huì)進(jìn)入這一個(gè)線程,而不是三個(gè)線程,在這個(gè)線程中只發(fā)送一次數(shù)據(jù),數(shù)據(jù)的來(lái)源就是形參最后的更新,所以就是第三個(gè)數(shù)組了。

第二個(gè)現(xiàn)象:為什么加了AfxMessageBox(""); 就都可以發(fā)送?
因?yàn)锳fxMessageBox(""); 使程序的進(jìn)程被掛起,這樣CSerialPort的線程就得以運(yùn)行,所以就發(fā)送了。

=========================================
看到這里你可能會(huì)想:那能不能將dwFlagsAndAttributes改成0設(shè)為同步發(fā)送?
答案是好像不可以,可能還需要改其他地方,光這里改成同步的話,串口什么數(shù)據(jù)也發(fā)不了。
如果你發(fā)現(xiàn)能簡(jiǎn)易的將這個(gè)類改成同步的方法,歡迎聯(lián)系我gilbertjuly@gmail.com。

=========================================
那我們要同步發(fā)送怎么辦?
1.將chSend1,chSend2,chSend3放在一起組建成一個(gè)更大的數(shù)組一次發(fā)送
這樣如果接收端處理串口數(shù)據(jù)較慢的話,可能要在每個(gè)數(shù)組當(dāng)中插入些無(wú)用的數(shù)據(jù)。
2.使用其他具有同步操作功能的類,如:
blog.chinaunix.net/u/32550/showart_365425.html
3.學(xué)習(xí)windows api的同學(xué)們還可以自己寫串口編程的程序,可以參考:
http://www.vckbase.com/document/viewdoc/?id=1734#%E8%AF%BB%E5%86%99%E4%B8%B2%E5%8F%A3

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
CSerialPort類解析
C++串口編程實(shí)例
深入淺出Win32多線程程序設(shè)計(jì)之綜合實(shí)例
[轉(zhuǎn)載]使用CSerialPort類編寫串口通信程序的問(wèn)題
簡(jiǎn)單而強(qiáng)大的多線程串口編程工具CserialPort類(附VC基于MFC單文檔協(xié)議通訊源程...
MSComm控件與Win32 API操作串口有何區(qū)別?
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服