在线观看免费黄色网址,一区二区视频,亚洲国产综合网,欧美VA免费高清在线观看

深入淺出Win32多線程程序設計之綜合實例

來源:網絡

點擊:1822

A+ A-

所屬頻道:新聞中心

關鍵詞: Win32,多線程程序設計,多線程

    本章我們將以工業控制和嵌入式系統中運用極為廣泛的串口通信為例講述多線程的典型應用。

    而網絡通信也是多線程應用最廣泛的領域之一,所以本章的最后一節也將對多線程網絡通信進行簡短的描述。

    1.串口通信

    在工業控制系統中,工控機(一般都基于PC Windows平臺)經常需要與單片機通過串口進行通信。因此,操作和使用PC的串口成為大多數單片機、嵌入式系統領域工程師必須具備的能力。

    串口的使用需要通過三個步驟來完成的:

    (1) 打開通信端口;

    (2) 初始化串口,設置波特率、數據位、停止位、奇偶校驗等參數。為了給讀者一個直觀的印象,下圖從Windows的"控制面板->系統->設備管理器->通信端口(COM1)"打開COM的設置窗口:

     



    (3) 讀寫串口。

    在WIN32平臺下,對通信端口進行操作跟基本的文件操作一樣。

    創建/打開COM資源

    下列函數如果調用成功,則返回一個標識通信端口的句柄,否則返回-1:
     

    HADLE CreateFile(PCTSTR lpFileName, //通信端口名,如"COM1"
               WORD dwDesiredAccess, //對資源的訪問類型
               WORD dwShareMode, //指定共享模式,COM不能共享,該參數為0
               PSECURITY_ATTRIBUTES lpSecurityAttributes,
               //安全描述符指針,可為NULL
               WORD dwCreationDisposition, //創建方式
               WORD dwFlagsAndAttributes, //文件屬性,可為NULL
               HANDLE hTemplateFile //模板文件句柄,置為NULL
               );


    獲得/設置COM屬性

    下列函數可以獲得COM口的設備控制塊,從而獲得相關參數:
     

    BOOL WINAPI GetCommState(
               HANDLE hFile, //標識通信端口的句柄
               LPDCB lpDCB //指向一個設備控制塊(DCB結構)的指針
               );


    如果要調整通信端口的參數,則需要重新配置設備控制塊,再用WIN32 API SetCommState()函數進行設置:
     

    BOOL SetCommState(
               HANDLE hFile, //標識通信端口的句柄
               LPDCB lpDCB //指向一個設備控制塊(DCB結構)的指針
               );


    DCB結構包含了串口的各項參數設置,如下:
     

    typedef struct _DCB
               {
               // dcb
               DWORD DCBlength; // sizeof(DCB)
               DWORD BaudRate; // current baud rate
               DWORD fBinary: 1; // binary mode, no EOF check
               DWORD fParity: 1; // enable parity checking
               DWORD fOutxCtsFlow: 1; // CTS output flow control
               DWORD fOutxDsrFlow: 1; // DSR output flow control
               DWORD fDtrControl: 2; // DTR flow control type
               DWORD fDsrSensitivity: 1; // DSR sensitivity
               DWORD fTXContinueOnXoff: 1; // XOFF continues Tx
               DWORD fOutX: 1; // XON/XOFF out flow control
               DWORD fInX: 1; // XON/XOFF in flow control
               DWORD fErrorChar: 1; // enable error replacement
               DWORD fNull: 1; // enable null stripping
               DWORD fRtsControl: 2; // RTS flow control
               DWORD fAbortOnError: 1; // abort reads/writes on error
               DWORD fDummy2: 17; // reserved
               WORD wReserved; // not currently used
               WORD XonLim; // transmit XON threshold
               WORD XoffLim; // transmit XOFF threshold
               BYTE ByteSize; // number of bits/byte, 4-8
               BYTE Parity; // 0-4=no,odd,even,mark,space
               BYTE StopBits; // 0,1,2 = 1, 1.5, 2
               char XonChar; // Tx and Rx XON character
               char XoffChar; // Tx and Rx XOFF character
               char ErrorChar; // error replacement character
               char EofChar; // end of input character
               char EvtChar; // received event character
               WORD wReserved1; // reserved; do not use
               } DCB;

    讀寫串口

    在讀寫串口之前,還要用PurgeComm()函數清空緩沖區,并用SetCommMask ()函數設置事件掩模來監視指定通信端口上的事件,其原型為:
     

    BOOL SetCommMask(
               HANDLE hFile, //標識通信端口的句柄
               DWORD dwEvtMask //能夠使能的通信事件
               );


    串口上可能發生的事件如下表所示:

    事件描述
    EV_BREAKA break was detected on input.
    EV_CTSThe CTS (clear-to-send) signal changed state.
    EV_DSRThe DSR(data-set-ready) signal changed state.
    EV_ERRA line-status error occurred. Line-status errors are CE_FRAME, CE_OVERRUN, and CE_RXPARITY.
    EV_RINGA ring indicator was detected.
    EV_RLSDThe RLSD (receive-line-signal-detect) signal changed state.
    EV_RXCHARA character was received and placed in the input buffer.
    EV_RXFLAGThe event character was received and placed in the input buffer. The event character is specified in the device''''s DCB structure, which is applied to a serial port by using the SetCommState function.
    EV_TXEMPTYThe last character in the output buffer was sent.


    在設置好事件掩模后,我們就可以利用WaitCommEvent()函數來等待串口上發生事件,其函數原型為:

    BOOL WaitCommEvent(
               HANDLE hFile, //標識通信端口的句柄
               LPDWORD lpEvtMask, //指向存放事件標識變量的指針
               LPOVERLAPPED lpOverlapped, // 指向overlapped結構
               );


    我們可以在發生事件后,根據相應的事件類型,進行串口的讀寫操作:

    BOOL ReadFile(HANDLE hFile, //標識通信端口的句柄
               LPVOID lpBuffer, //輸入數據Buffer指針
               DWORD nNumberOfBytesToRead, // 需要讀取的字節數
               LPDWORD lpNumberOfBytesRead, //實際讀取的字節數指針
               LPOVERLAPPED lpOverlapped //指向overlapped結構
               );
               BOOL WriteFile(HANDLE hFile, //標識通信端口的句柄
               LPCVOID lpBuffer, //輸出數據Buffer指針
               DWORD nNumberOfBytesToWrite, //需要寫的字節數
               LPDWORD lpNumberOfBytesWritten, //實際寫入的字節數指針
               LPOVERLAPPED lpOverlapped //指向overlapped結構
               );

     

     

     

    (審核編輯: 智匯小新)

    聲明:除特別說明之外,新聞內容及圖片均來自網絡及各大主流媒體。版權歸原作者所有。如認為內容侵權,請聯系我們刪除。

    4人入室抢婴案妈妈索赔600多万| 入室抢婴贩卖案受害家庭要求判死刑| 张檬称月子要坐满100天| 金秀贤一边哭一边喝水| 大克重金饰销量随金价上涨下滑| 男子发现打工养了7年的女儿非亲生| 女装啥时候能回归正常审美| 横店变竖店了| 韩国庄仕洋| 李现又去公园打鸟了| 乘风2025四公帮唱组队征集| BLACKPINK未公开的物料| 甲亢哥成都行直播| 李现的微博逐渐奇怪| 国家标准住宅项目规范发布| 朴成训 来财| 如何让企业更有获得感| 王艳发了赤脚鬼| 李昀锐好标准的体育生下楼梯| 雷军摄影夜校迎来首批毕业生 | 苹果演唱会模式| 张家界回应因台词又在韩国爆火 | 马龙说全运会后还想参加比赛河南一枯井发现近百名烈士遗骸 | 心理师锐评赵露思新综艺| BLACKPINK未公开的物料| 时代少年团 录播| 封神2将从影院下映| 男子肝癌晚期只打一针获新生| 清明档预售前三名| 王艳发了赤脚鬼| 日本对中国人民负有严重历史罪责 | 张檬称月子要坐满100天| 白敬亭 宋轶| 云南福贡山体滑坡致5人遇难当地发布矿区作业人员紧急撤离通知 | 甲亢哥成都行直播| 甲亢哥吃皮蛋| 苹果演唱会模式| 乡村行看振兴江西铜鼓万亩春茶采摘忙助农增收促振兴 | 大阪世博会吉祥物的捷克亲兄弟| 泰高空走廊被震断男子奋力跳向对面 | 慎买带有QS标志产品|