0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

英創(chuàng)信息技術串口通訊中數(shù)據(jù)發(fā)送的有關問題分析

英創(chuàng)信息技術 ? 來源:英創(chuàng)信息技術 ? 作者:英創(chuàng)信息技術 ? 2020-02-04 11:27 ? 次閱讀

異步串口(UART)通訊是嵌入式設備中最常見的通訊方式之一。本文主要針對預裝Windows CE操作系統(tǒng)的英創(chuàng)主板,分析用戶層程序在使用UART進行發(fā)送時的幾個有關問題,供客戶在設計應用程序時參考。

問題1:數(shù)據(jù)是否發(fā)送出去了?

WriteFile函數(shù)是發(fā)送串口數(shù)據(jù)的基本API,具體函數(shù)形式及參數(shù)定義如下:

BOOLWriteFile(

HANDLE hFile,//CreateFile返回函數(shù)Handle

LPCVOID lpBuffer,//裝載發(fā)送數(shù)據(jù)的Buffer指針

DWORD nNumberOfBytesToWrite,//待發(fā)送數(shù)據(jù)的字節(jié)長度

LPDWORD lpNumberOfBytesWritten,//返回的實際發(fā)送的字節(jié)數(shù)

LPOVERLAPPED lpOverlapped// = NULL,CE未使用該參數(shù)

);

WriteFile的返回值為TRUE并不代表發(fā)送Buffer中的數(shù)據(jù)已全部發(fā)送出去了,需要檢查返回的實際字節(jié)長度lpNumberOfBytesWritten。所以推薦的調用方法為

// 發(fā)送緩沖區(qū)pTxBuff, 發(fā)送長度dwLen

DWORD dwNumberOfBytesWritten = 0;

BOOL bRet = WrietFile(hFile, pTxBuf, dwLen, &dwNumberOfBytesWritten, NULL);

if(bRet && (dwLen == dwNumberOfBytesWritten))

{

//發(fā)送緩沖區(qū)中的數(shù)據(jù)已成功送入UART硬件的發(fā)送端口,大多數(shù)情況數(shù)據(jù)已從

//物理端口發(fā)送出去,但此時可能還有若干字節(jié)還在UART的硬件TX FIFO中,等

//待硬件控制器順序發(fā)送。

//… 發(fā)送成功 …

}

else

{

//發(fā)送出錯處理。。。。

}

問題2:WriteFile函數(shù)的阻塞問題

CE串口驅動的執(zhí)行數(shù)據(jù)發(fā)送時,為了保持代碼的高效率,沒有在驅動程序中層另外分配Buffer,把應用層需發(fā)送的數(shù)據(jù)先Copy到內部再發(fā)送,而是直接利用用戶層的pTxBuf。因此原則上說,當數(shù)據(jù)沒有發(fā)送完前,WriteFile函數(shù)是不會返回,處于阻塞掛起狀態(tài)的。進一步,可能存在某種原因,數(shù)據(jù)始終沒有發(fā)送完畢,則WriteFile將永遠阻塞而不會返回。不少應用程序并不希望這樣的永遠阻塞,而是希望WriteFile能在一定時間內返回,即使出錯,也讓應用程序有機會進行出錯處理。CE驅動為此專門設置了超時機制,其數(shù)據(jù)結構如下:

typedefstruct_COMMTIMEOUTS {

DWORD ReadIntervalTimeout; //與接收有關,本文不討論

DWORD ReadTotalTimeoutMultiplier; //與接收有關,本文不討論

DWORD ReadTotalTimeoutConstant; //與接收有關,本文不討論

DWORD WriteTotalTimeoutMultiplier; //發(fā)送超時倍數(shù)因子

DWORD WriteTotalTimeoutConstant; //發(fā)送超時固定常數(shù)值

} COMMTIMEOUTS,*LPCOMMTIMEOUTS;

實際在驅動中,發(fā)送超時的計算及使用方法如下:

DWORD dwTimeout =

CommTimeouts.WriteTotalTimeoutMultiplier*dwLen +

CommTimeouts.WriteTotalTimeoutConstant;

if( !dwTimeout )

dwTimeout = INFINITE;

//等待來自發(fā)送中斷線程的發(fā)送結束事件

ULONG WaitReturn = WaitForSingleObject(hTransmitEvent, dwTimeout);

上面的代碼中dwTimeout的單位為ms,在第一次打開串口驅動”COM#”時,超時數(shù)據(jù)結構中的WriteTotalTimeoutMultiplier和WriteTotalTimeoutConstant均為0,所以就有發(fā)送超時無窮的問題。為了讓dwTimeout為有限值,需要設置超時參數(shù)如下:

COMMTIMEOUTS CommTimeouts; //定義局部變量

GetCommTimeouts(hFile, &CommTimeouts); //讀取串口的超時參數(shù)

//假設應用程序設置的串口波特率為baud

CommTimeouts. WriteTotalTimeoutConstant = baud / BR9600 + 1;

CommTimeouts. WriteTotalTimeoutMultiplier =

CommTimeouts.WriteTotalTimeoutConstant * 2;

SetCommTimeouts(hFile, &CommTimeouts); //重新設置串口超時參數(shù)

上述代碼大致設置了一個2倍發(fā)送時間長度的超時時間,其中選取BR9600為單位時間,是因為9600bps波特率基本對應一個字節(jié)的發(fā)送時間為1ms。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • WINDOWS
    +關注

    關注

    3

    文章

    3521

    瀏覽量

    88320
  • 嵌入式主板
    +關注

    關注

    7

    文章

    6084

    瀏覽量

    35154
收藏 人收藏

    評論

    相關推薦

    中科創(chuàng)達榮獲2024年軟件和信息技術服務優(yōu)秀企業(yè)

    及前百家企業(yè)”名單。中科創(chuàng)達憑借非凡的技術實力與持續(xù)的創(chuàng)新能力,成功入選“2024年度軟件和信息技術服務競爭力百強企業(yè)”以及“2024年軟件和信息技術服務優(yōu)秀企業(yè)”。
    的頭像 發(fā)表于 10-30 11:44 ?328次閱讀

    加速鯤鵬落地!拓維信息創(chuàng)遷移工具榮獲鯤鵬原生開發(fā)技術認證

    認證。圖/拓維·數(shù)據(jù)庫適配中間件取得鯤鵬原生開發(fā)N認證在數(shù)字化時代的大潮,信創(chuàng)戰(zhàn)略作為國家推動信息技術應用創(chuàng)新、保障信息安全與自主可控的關
    的頭像 發(fā)表于 09-10 08:03 ?365次閱讀
    加速鯤鵬落地!拓維<b class='flag-5'>信息</b>信<b class='flag-5'>創(chuàng)</b>遷移工具榮獲鯤鵬原生開發(fā)<b class='flag-5'>技術</b>認證

    軟國際信創(chuàng)服務助力大連信創(chuàng)產業(yè)發(fā)展

    為進一步激發(fā)大連本地信創(chuàng)產業(yè)生態(tài)的活力與潛力,搭建一個高效、開放的交流平臺。由大連軟件行業(yè)協(xié)會攜手大連市信息技術應用創(chuàng)新綜合服務中心主辦,軟國際協(xié)辦的,2024年大連市信息技術應用創(chuàng)
    的頭像 發(fā)表于 08-27 16:49 ?779次閱讀

    LABVIEW串口通訊

    labview實現(xiàn)串口通訊
    發(fā)表于 08-19 14:37 ?5次下載

    ESP32串口接收和發(fā)送數(shù)據(jù),會有延遲是怎么回事?

    測試環(huán)境:串口波特率600bps,串口接收256字節(jié)數(shù)據(jù)。 在調試串口時,發(fā)現(xiàn)發(fā)送多于120字節(jié)時,串口
    發(fā)表于 06-26 08:07

    BIG WALNUT大核桃全面響應國家“信創(chuàng)”號召,傾力“智”造國產芯片+國產加密安全系統(tǒng)通訊產品

    信息化高速發(fā)展的今天,信息技術的自主可控和信息安全已經(jīng)成為國家發(fā)展的重要基石。國家信創(chuàng)戰(zhàn)略的提出,旨在推動國產信息產業(yè)的崛起,實現(xiàn)
    的頭像 發(fā)表于 06-18 17:42 ?470次閱讀

    使用STM8S103系列單片機的串口通訊,發(fā)現(xiàn)串口發(fā)送數(shù)據(jù)后一直進入接收中斷為什么?

    使用STM8S103系列單片機的串口通訊,發(fā)現(xiàn)串口發(fā)送數(shù)據(jù)后一直進入接收中斷??是什么原因所致的???
    發(fā)表于 04-30 07:25

    中興通訊中標2023年中移動信息IT云系統(tǒng)框架采購項目

    近日,移(動)信息技術有限公司(以下簡稱中移動信息)公布2023年IT云資源池SDN系統(tǒng)框架采購項目招標結果,中興通訊以第一名50%份額中標。
    的頭像 發(fā)表于 03-15 10:20 ?398次閱讀

    創(chuàng)股份今日登陸科創(chuàng)

    山東創(chuàng)軟件商用中間件股份有限公司(以下簡稱“創(chuàng)股份”)近日在上海證券交易所科創(chuàng)板成功上市,標志著這家國內知名的民營軟件和
    的頭像 發(fā)表于 03-13 14:19 ?479次閱讀

    創(chuàng)股份在上交所科創(chuàng)板上市

    山東創(chuàng)軟件商用中間件股份有限公司(以下簡稱“創(chuàng)股份”)近日在上海證券交易所科創(chuàng)板成功上市,標志著這家國內知名的民營軟件和
    的頭像 發(fā)表于 03-13 14:02 ?474次閱讀

    串口通訊時的數(shù)據(jù)幀格式和通訊協(xié)議有什么區(qū)別?

    串口通訊時的數(shù)據(jù)幀格式和通訊協(xié)議是兩個不同的概念,它們在串口通訊
    的頭像 發(fā)表于 01-30 09:21 ?1804次閱讀

    dma和串口直接發(fā)送的區(qū)別

    ,我們先來介紹一下DMA和串口直接發(fā)送的原理和工作方式。 DMA是一種高速數(shù)據(jù)傳輸技術,它允許外設直接與內存進行數(shù)據(jù)交換,而不需要CPU的介
    的頭像 發(fā)表于 01-07 17:43 ?2598次閱讀

    USB虛擬串口串口1可以同時發(fā)送

    可以同時發(fā)送,USB虛擬串口和物理串口1都可以作為數(shù)據(jù)傳輸?shù)耐ǖ?,可以同時操作和發(fā)送數(shù)據(jù)。 US
    的頭像 發(fā)表于 01-04 11:26 ?1446次閱讀

    AWTK 串口屏開發(fā)(3) - 告警信息

    告警信息是一個常用的功能。在AWTK開源串口,內置告警信息模型,只需設計用戶界面即可實現(xiàn)告警信息的顯示和管理。1.功能告警
    的頭像 發(fā)表于 12-23 08:24 ?405次閱讀
    AWTK <b class='flag-5'>串口</b>屏開發(fā)(3) - 告警<b class='flag-5'>信息</b>

    單片機串口通信的接收與發(fā)送

    單片機串口通信是一種常見的通信方式,它可以實現(xiàn)單片機與外部設備的數(shù)據(jù)交換。在實際應用,單片機串口通信常用于與電腦、傳感器、LCD顯示屏等外設進行數(shù)
    的頭像 發(fā)表于 12-20 14:03 ?3400次閱讀