日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

串口通信模块2:串口通信编程基础(打开、配置)

發布時間:2025/3/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 串口通信模块2:串口通信编程基础(打开、配置) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

有兩種方式可以操作串口:同步操作方式和異步操作方式(即重疊操作方式)。同步操作時,API函數會阻塞直到操作完成以后才能返回(在多線程方式中,雖然不會阻塞主線程,但是仍然會阻塞監聽線程);而異步操作方式,API函數會立即返回,操作在后臺進行,避免進程阻塞。異步操作方式還允許讀、寫操作能同時進行(即重疊操作),在實際科研項目中非常有用。但是無論哪種操作方式,一般都通過下面的四個步驟來完成:

1.打開串口;

2.配置串口

3.讀寫串口

4.關閉串口

1. 打開串口

在很多系統中(包括Windows系統)把文件的概念進行了拓展。無論是文件、通信設備、命名管道、郵件槽、磁盤、還是控制臺,都是用API函數CreateFile()來打開或創建的。該函數的原型是: <span style="font-size:18px;">HANDLE CreateFile( LPCTSTR lpFileName, //將要打開的串口邏輯名 DWORD dwDesiredAccess, //指定串口訪問的類型 DWORD dwShareMode, //指定共享屬性 LPSECURITY_ATTRIBUTES lpSecurityAttributes, //引用安全型屬性結構 DWORD dwCreationDistribution, //創建標志 DWORD dwFlagsAndAttributes, //屬性描述 HANDLE hTemplateFile //對串口而言該參數必須置為NULL );</span>同步I/O方式打開串口的示例代碼如下: <span style="font-size:18px;">HANDLE OpenCom() { HANDLE hCom; <span style="font-family: Arial, Helvetica, sans-serif;">//串口句柄</span> hCom = CreateFile("COM1", //打開COM1串口 GENERIC_READ|GENERIC_WRITE, //允許串口讀寫 0, //獨占方式,即串行 NULL, OPEN_EXISTING, //打開已存在的文件 0, //同步方式打開 NULL); if(hCom == (HANDLE)-1) //打開失敗 { AfxMessageBox("打開串口失敗!"); return NULL; } return hCom; }</span>與同步I/O方式打開的過程與步驟相同,只是參數有點變化,異步I/O打開串口的代碼示例如下: <span style="font-size:18px;">HANDLE OpenCom() { HANDLE hCom; hCom = CreateFile("COM1", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, //打開已經存在的文件 FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //重疊方式 NULL); if(hCom == (HANDLE)-1) { AfxMessageBox("打開串口失敗!"); return NULL; } return hCom; }</span>

2. 配置串口

再打開通信設備句柄后,常常需要對串口進行一些初始化配置工作。配置串口的一些屬性,如串口通信參數、通信超時設置、緩沖區申請及緩沖區清空操作等。 2.1 設置串口參數 設置串口參數需要通過一個DCB結構來進行。DCB結構包含了諸如波特率、數據位數、奇偶校驗和停止位數等信息。在查詢或配置串口的屬性時,都要通過一個DCB結構的緩沖區 一般情況下,我們在采用CreateFile打開串口后,可以調用GetCommonState()函數來獲取串口的初始配置。要修改串口的配置,應該先修改DCB結構,然后調用SetCommonState()函數設置串口。DCB結構包含了串口的各項參數設置,下面給出了DCB結構中常用的5個成員變量: BaudRate:波特率,DWORD型變量,指定通信設備的傳輸速率。這個成員可以是實際波特率值或者是下表的常量值之一。
fParity:指定奇偶校驗使能,DWORD型變量,若此成員為1,則允許奇偶校驗檢查。 ByteSize:通信字節位數,4-8,BYTE型變量。 Parity:指定奇偶校驗方法,BYTE型變量。此成員的取值如下表所示。 奇偶校驗常見常量
winbase.h中的定義說明
NOPARITY#define NOPARITY 0采用無校驗方式
ODDPARITY#define ODDPARITY 1采用奇校驗方式
EVENPARITY#define EVENPARITY 2采用偶校驗方式
MARKPARITY#define MARKPARITY 3
采用標記校驗方式

StopBits:指定停止位的位數,BYTE型變量。此成員取值如下表所示。 停止位常見變量
winbase.h中的定義說明
ONESTOPBIT#define ONESTOPBIT 01位停止位
ONE5STOPBITS#define ONE5STOPBITS 11.5位停止位
TWOSTOPBITS#define TWOSTOPBITS 22位停止位
通過GetCommState()函數可以獲得COM口的設備控制塊,從而獲得DCB中相關的參數。函數原型如下: <span style="font-size:18px;">BOOL GetCommState(HANDLE hFile, //標識通信端口的句柄LPDCB lpDCB //指向一個設備控制塊(DCB結構)的指針);</span>而通過SetCommState()函數則可以設置COM口的設備控制塊,函數原型如下: <span style="font-size:18px;">BOOL SetCommState(HANDLE hFile, //標識通信端口的句柄</span>LPDCB lpDCB //指向一個設備控制塊(DCB結構)的指針</span>);</span>2.2 串口通信超時設置
再用ReadFile和WriteFile讀寫串行口時,必須要考慮超時問題。超時的作用是在指定的時間內沒有讀入或發送指定數量的字符,ReadFile或WriteFile的操作仍然會結束
要查詢當前的超時設置,用調用GetCommTimeouts()函數,該函數會填充一個COMMTIMEOUTS結構。調用SetCommTimeouts()函數可以用某一個COMMTIMEOUTS結構的內容來設置超時。 讀寫串口的超時有兩種:間隔超時和總超時。間隔超時是指在接收時兩個字符之間的最大延時。總超時是指讀寫操作總共花費的最大時間。寫操作只支持總延時,而讀操作都支持。COMMTIMEOUTS結構可以規定讀寫操作的延時COMMTIMEOUTS結構的定義如下: Typedef struct_COMMTIMEOUTS { ? DWORD ReadIntervalTimeout; ?//讀間隔超時 ??DWORD ReadTotalTimeoutMultiplier; ?//讀時間系數 ??DWORD ReadTotalTimeoutConstant; ?//讀時間常量 ??DWORD WriteTotalTimeoutMultiplier; ?//寫時間系數 ??DWORD WriteTotalTimeoutConstant; ?//寫時間常量 }?COMMTIMEOUTS,*PLCOMMTIMEOUTS;

?COMMTIMEOUTS結構的成員都是以毫秒為單位,總超時的計算公式:
總超時=時間系數*要求讀/寫的字符數+時間常量 例如,要讀入50個字符,那么讀操作的總超時的時間計算公式: ReadTotalTimeout = ReadTotalTimeoutMultiplier*50+ReadTotalTimeoutConstant 可以看出,間隔超時與總超時的設置是不相關的,這可以方便通信程序靈活地設置各種超時 2.3 申請串口通信緩沖區 除了在DCB中的設置外,程序一般還需要設置I/O緩沖區的大小和超時。Windows用I/O緩沖區來暫存串口的輸入和輸出數據。如果通信的速率較高,則應該設置較大的緩沖區。調用SetCommon()函數可以設置串行口的輸入和輸出緩沖區大小,函數原型如下: <span style="font-size:18px;">BOOL SetupCommon(HANDLE hFile; //通信設備的句柄DWORD dwInQueue; //輸入緩沖區的大小(字節數)DWORD dwOutQueue;//輸出緩沖區的大小 );</span>2.4 清空串口通信緩沖區
在讀寫串口之前,還要用PurgeCommon()函數清空緩沖區,該函數的原型如下:
<span style="font-size:18px;">BOOL PurgeCommon(HANDLE hFile; //串口句柄DWORD dwFlags );</span>參數dwFlags指定要完成的操作,應該選擇下面表中質的組合:
說明
PURGE_RXABORD中斷所有讀操作并立即返回,即使讀操作還沒有完成
PURGE_TXABORT中斷所有寫操作并立即返回,即使寫操作還沒有完成
PURGE_TXCLEAR清除輸出緩沖區
PURGE_RXCLEAR清除輸入緩沖區

最后,進行一個小結,給出了串口屬性的示例代碼,如下所示: <span style="font-size:18px;">SetComm(HANDLE hCom) {SetupComm( hCom, 1024,1024); //緩沖區大小COMMTIMEOUTS TimeOuts; //設定讀超時TimeOuts.ReadTntervalTimeout = 1000;TimeOuts.ReadTotalTimeoutMultiplier = 500;TimeOuts.ReadTotalTimeoutConstant = 5000; //設定寫超時TimeOuts.WriteTotalTimeoutMultiplier = 500;TimeOuts.WriteTotalTimeoutConstant = 2000; //設置超時SetCommTimeouts( hFile, &TimeOuts);DCB dcb;GetCommState( hCom, &dcb);dcb.BaudRate = CBR_115200; //波特率dcb.ByteSite = 8; //每個字節為8位dcb.Parity = NOPARITY; //無奇偶校驗位dcb.StopBits = TWOSTOPBITS; //兩個停止位SetCommState( hCom, &dcb);PurgeComm( hCom, PURGE_TXCEAR|PURGE_RXCLEAR); }</span> 與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的串口通信模块2:串口通信编程基础(打开、配置)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产ts系列 | 亚洲欧美日韩久久 | 亚洲第一网站 | 日韩激情成人 | 我想看毛片 | 波多野结衣一区二区三区四区 | 成人免费xxxxxx视频 | 一区二区高清视频 | 婷婷在线观看视频 | 秋霞免费av | 男女草逼网站 | 最新理伦片eeuss影院 | 国产最新在线视频 | 午夜影剧院| 日本极品丰满ⅹxxxhd | 善良的少妇伦理bd中字 | 亚洲看 | 精品久久免费视频 | 国产第2页 | 自拍偷拍视频在线观看 | 两口子交换真实刺激高潮 | 香蕉黄色片| 香蕉av一区| 久久久久久久久久久久97 | 国产人妻一区二区三区四区五区六 | 欧美午夜性生活 | 国产日韩欧美精品在线观看 | 中文字幕制服诱惑 | 高清国产在线观看 | 七仙女欲春2一级裸体片 | 久久4 | 欧美二级片 | 免费观看日批视频 | 免播放器在线视频 | 免费成人av片 | 国产在线精 | 日韩精品久久久久久免费 | 正在播放adn156松下纱荣子 | 久久中文娱乐网 | 欧美1区2区| 性做久久久久久久免费看 | 亚洲激情在线 | 欧美精品一区二区性色a+v | 天天爱天天草 | 欧美在线观看视频一区二区 | 亚洲精品一区二区三区四区乱码 | 尤物国产| av在线天堂 | 日本高清视频一区 | 性中国xxx极品hd | 日韩精品第一区 | 任我爽在线 | 亚洲AV综合色区无码国产播放 | 亚洲天堂欧美 | 好男人香蕉影院 | 二区三区av| 日婷婷| 人人艹人人爱 | 日韩不卡免费 | 少妇久久久久 | 国产在成人精品线拍偷自揄拍 | 日韩婷婷 | www.在线看| 午夜影院啊啊啊 | 久操不卡 | 国产肥熟 | 国产精品国产三级国产专播精品人 | 91在线免费网站 | 一区二区视频免费看 | 无码精品人妻一区二区三区漫画 | 亚洲理论视频 | 苏晴忘穿内裤坐公交车被揉到视频 | www久久久久 | 日韩中文久久 | 免费毛片一级 | 亚洲综合久久婷婷 | 寡妇av| 久久久资源 | www在线观看免费视频 | 涩涩视频在线免费看 | 久久亚洲一区 | 亚洲国产欧美精品 | 黄视频免费看在线 | 美女色av| 日韩免费一级片 | 欧美经典一区二区三区 | 免费a级黄色片 | 大片av | 亚洲免费婷婷 | www.在线观看视频 | 日韩有码在线观看 | 99热这里只有精品在线 | 欧美日韩中 | 国产精品久久久久毛片大屁完整版 | 亚洲视频一区二区三区四区 | 亚洲综合久久av一区二区三区 | 中文字幕首页 | 日本久久久久久久久久 | 99精品视频在线观看 |