在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

英創信息技術工控主板USB通信方案介紹

英創信息技術 ? 來源:英創信息技術 ? 作者:英創信息技術 ? 2020-01-15 14:44 ? 次閱讀

英創AMR9系列工控主板可以使用USB與PC連接并進行通信。在主板上,我們將USB引到了COM1,使得我們可以通過操作串口的方式來操作USB口的連接與收發。在PC端,我們提供一個使用WDK提供的驅動,來進行USB通信的解決方案。

驅動的安裝及說明請參考文章《英創工控主板USB驅動安裝說明》。

工控主板端USB收發程序說明

英創AMR9系列工控主板已將USB引導COM1,這里使用開發光盤中的串口例程SPT_HEX做USB收發調試例程。

代碼中需要注意的地方:

BOOL ret = OpenPort(portName, baud, databit, stopbit, parity); /* 打開串口*/

在界面中選擇COM1打開,調用函數OpenPort,參數portName值為_T('COM1:')。

波特率,停止位,數據位,校驗參數不產生實際作用,這里可以使用默認值。

GetCommTimeouts(m_hComm, &CommTimeOuts);
CommTimeOuts.ReadIntervalTimeout = 100; /* 接收字符間最大時間間隔*/
CommTimeOuts.ReadTotalTimeoutMultiplier = 1;
CommTimeOuts.ReadTotalTimeoutConstant = 0; /* 讀數據總超時常量*/
CommTimeOuts.WriteTotalTimeoutMultiplier = 1; /* 設置寫超時,避免阻塞*/
CommTimeOuts.WriteTotalTimeoutConstant = 2; /* 設置寫超時,避免阻塞*/
SetCommTimeouts(m_hComm, &CommTimeOuts) ;

在函數OpenPort中,調用SetCommTimeouts設置超時函數時最好設置有寫超時,否則在發數據時,在PC端接收完數據前,WriteFile函數會一直阻塞。

PC端USB收發程序說明

在WDK提供的驅動中,創建了2個pipe來進行USB的收發,通過對這兩個pipe的ReadFile和WriteFile操作進行USB通信。

1、檢測設備

USB設備支持即插即用,當設備連接或斷開時,都可以收到系統將發出的消息。

使用該消息需要先引用系統頭文件

#include 'dbt.h'

并在在MESSAGEMAP宏中添加設備檢測消息WM_DEVICECHANGE

BEGIN_MESSAGE_MAP(Cusb_connDlg, CDialog)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP

ON_WM_DEVICECHANGE()
END_MESSAGE_MAP()

在對話框頭文件中添加該消息的響應函數

afx_msg BOOL OnDeviceChange(UINT nEventType,DWORD_PTR dwData);

當設備發生變化(USB接上或斷開)時,OnDeviceChange函數會得到響應。
BOOL Cusb_connDlg::OnDeviceChange( UINT nEventType, DWORD_PTR dwData )
{
switch(nEventType)
{
case DBT_DEVICEARRIVAL:
// UpdateUsbDeviceList();
break;
case DBT_DEVICEREMOVECOMPLETE:
//UpdateUsbDeviceList();
//UpdateWindow();
break;
}
return TRUE;
}

獲取USB讀寫管道路徑

首先,獲取設備路徑需要使用到setupapi.lib庫中的相關函數,所以需要在工程中添加setupapi.lib庫

添加setupapi.lib庫的頭文件

#include

添加驅動代碼的public.h頭文件,該頭文件定義了USB設備的GUID

// {6068EB61-98E7-4c98-9E20-1F068295909A}

DEFINE_GUID(GUID_CLASS_USBSAMP_USB,
0x873fdf, 0x61a8, 0x11d1, 0xaa, 0x5e, 0x0, 0xc0, 0x4f, 0xb1, 0x72, 0x8b);

添加一個GetUsbDeviceFileName函數通過GUID獲取設備地址

BOOL Cusb_connDlg::GetUsbDeviceFileName(LPGUID pGuid, LPWSTR devName)
{
ULONG NumberDevices;
HDEVINFO hardwareDeviceInfo;
SP_DEVICE_INTERFACE_DATA deviceInfoData;
ULONG i;
BOOLEAN done;
PSP_DEVICE_INTERFACE_DETAIL_DATA functionClassDeviceData = NULL;
ULONG predictedLength = 0;
ULONG requiredLength = 0;
hardwareDeviceInfo =
SetupDiGetClassDevs ( pGuid,
NULL, // Define no enumerator (global)
NULL, // Define no
(DIGCF_PRESENT | // Only Devices present
DIGCF_DEVICEINTERFACE)); // Function class devices.
if (hardwareDeviceInfo == INVALID_HANDLE_VALUE) {
return FALSE ;
}
NumberDevices = 4;
done = FALSE;
deviceInfoData.cbSize = sizeof (SP_DEVICE_INTERFACE_DATA);
i=0;
while (!done)
{
NumberDevices *= 2;
for (; i < NumberDevices; i++)
{
if (SetupDiEnumDeviceInterfaces (hardwareDeviceInfo,
0, // We don't care about specific PDOs
pGuid,
i,
&deviceInfoData))
{
SetupDiGetDeviceInterfaceDetail (
hardwareDeviceInfo,
&deviceInfoData,
NULL, // probing so no output buffer yet
0, // probing so output buffer length of zero
&requiredLength,
NULL); // not interested in the specific dev-node
predictedLength = requiredLength;
// sizeof (SP_FNCLASS_DEVICE_DATA) + 512;
functionClassDeviceData = (PSP_DEVICE_INTERFACE_DETAIL_DATA) malloc (predictedLength);
if(NULL == functionClassDeviceData)
{
break;
}
functionClassDeviceData->cbSize = sizeof (SP_DEVICE_INTERFACE_DETAIL_DATA);
if (! SetupDiGetDeviceInterfaceDetail (
hardwareDeviceInfo,
&deviceInfoData,
functionClassDeviceData,
predictedLength,
&requiredLength,
NULL))
{
free( functionClassDeviceData );
break;;
}

StringCchCopy(devName, MAX_LENGTH, functionClassDeviceData->DevicePath) ;
free( functionClassDeviceData );
done = TRUE;
break;
}
else
{
if (ERROR_NO_MORE_ITEMS == GetLastError())
{
done = TRUE;
i = -1;
break;
}
}
}
}
NumberDevices = i;
SetupDiDestroyDeviceInfoList (hardwareDeviceInfo);
if (i >= 0)
{
return TRUE;
}
else
{
return FALSE;
}
}

該函數大致流程:

1.通過SetupDiGetClassDevs函數根據GUID獲得設備頂級窗口句柄。

2.然后通過這個句柄,使用SetupDiEnumDeviceInterfaces函數枚舉USB設備,直到找到符合條件的USB設備或枚舉完所有設備為止。

3.當找到符合條件的設備后,使用SetupDiGetDeviceInterfaceDetail函數獲取設備路徑。

根據設備路徑獲得輸入管道和輸出管道的路徑。

// 獲得USB設備路徑 deviceName '\\?\usb#vid_045e&pid_00ce#00000000-0000-0000-0427-980002d9f4b1#{00873fdf-61a8-11d1-aa5e-00c04fb1728b}'
if(!GetUsbDeviceFileName((LPGUID)&GUID_CLASS_USBSAMP_USB, deviceName))
{
MessageBox(L'設備未連接');
return;
}
// hRead讀管道路徑 inPipe '\\?\usb#vid_045e&pid_00ce#00000000-0000-0000-0427-980002d9f4b1#{00873fdf-61a8-11d1-aa5e-00c04fb1728b}\PIPE00'
StringCchCopy(inPipe , MAX_LENGTH, deviceName);
StringCchCat(inPipe, MAX_LENGTH, L'\\' );
if(FAILED(StringCchCat (inPipe, MAX_LENGTH, L'PIPE00'))) {
return;
}
// hWrite寫管道路徑 outPipe '\\?\usb#vid_045e&pid_00ce#00000000-0000-0000-0427-980002d9f4b1#{00873fdf-61a8-11d1-aa5e-00c04fb1728b}\PIPE01'
StringCchCopy(outPipe , MAX_LENGTH, deviceName);
StringCchCat(outPipe, MAX_LENGTH, L'\\' );
if(FAILED(StringCchCat (outPipe, MAX_LENGTH, L'PIPE01'))) {
return;
}

驅動代碼設定,輸入管道路徑為設備路徑加上\PIPE00,輸出管道路徑為設備路徑加上\PIPE01

2、USB口通信

通過CreateFile打開管道,使用WriteFile和ReadFile就可以進行USB口的輸入輸出了。

注意,在讀取USB口數據時,ReadFile函數會阻塞。所以需要用非阻塞的方式讀,在打開PIPE時使用FILE_FLAG_OVERLAPPED標記。

hRead = CreateFile(inPipe,
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_WRITE | FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);
if(hRead == INVALID_HANDLE_VALUE)
{
MessageBox(L'輸入通道打開失敗');
return;
}

在讀線程中使用異步方式讀。

success = ReadFile(pDlg->hRead, pDlg->inBuf, 65536, &len, &overlap);
// 因為是overlapped操作,ReadFile會將讀文件請求放入讀隊列之后立即返回(false),而不會等到文件讀完才返回(true)
if (!success)
{
if (GetLastError() == ERROR_IO_PENDING)
{
dwRes = WAIT_TIMEOUT;
while(dwRes != WAIT_OBJECT_0)
{
dwRes = WaitForSingleObject(pDlg->hRead, 1000);
// 獲取讀的的長度
success = GetOverlappedResult(pDlg->hRead, &overlap, &len, FALSE);
// 上面二條語句完成的功能與下面一條語句的功能等價:
// 一直阻塞等到得到數據才繼續下面。
// GetOverlappedResult(pDlg->hRead, &overlap, &len, TRUE);
if (pDlg->killThread)
{
// 關閉線程,直接關閉
return 0;
}
}
}
else
{
// 出錯!
return -1;
}
}

傳輸速度測試

編寫程序,測試工控主板端向PC端的數據傳輸速度。

EM9170上傳速度最高可達3.6MB/秒。

EM9160上傳速度最高可達500kb/秒。

其他說明

驅動中默認的管道BUFFER大小為256字節,在讀寫操作時,不宜超過管道BUFFER大小,否則會返回失敗。例程中提供一個修改后的驅動,只是簡單將BUFFER擴大到64K,原驅動保留為usbsamp_bak.sys。

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

    關注

    7

    文章

    6094

    瀏覽量

    36067
收藏 人收藏

    評論

    相關推薦

    工控主板特點與應用場景介紹

    工控主板(IndustrialMotherboard)是專為工業環境設計的計算機主板,用于控制、監測和管理工業設備及自動化系統。與普通消費級主板相比,
    的頭像 發表于 03-06 14:39 ?358次閱讀
    <b class='flag-5'>工控</b><b class='flag-5'>主板</b>特點與應用場景<b class='flag-5'>介紹</b>

    工控主板在數控機床設備中的應用

    工控主板作為數控機床的核心組件之一,發揮著至關重要的作用。以下是工控主板在數控機床設備中應用的詳細介紹
    的頭像 發表于 01-09 15:33 ?351次閱讀

    中科曙光南京研究院方案入選江蘇省信息技術創新優秀解決方案

    近日,中科曙光南京研究院傳來喜訊,其精心申報的《高端計算與分布式存儲一體化解決方案》(以下簡稱“方案”)成功脫穎而出,榮耀入選“2024年江蘇省信息技術應用創新優秀解決方案”名單。 這
    的頭像 發表于 01-08 15:41 ?470次閱讀

    國產工控主板有什么優勢、特點?

    隨著國產工控主板的發展,國內企業也在不斷開發新的工控主板,為了滿足國內企業的發展需求,一些國產工控主板
    的頭像 發表于 11-15 10:11 ?344次閱讀

    ?什么是國產工控主板,國產工控主板的特點有哪些?

    什么是國產工控主板呢?國產工控主板是工業計算機的主板,是一種計算機系統的硬件設備,是專門為工業控制場景設計和生產的電路板。它在國內的研發和制
    的頭像 發表于 11-07 10:29 ?502次閱讀

    國產工控主板,信產業發展新引擎

    在當今科技飛速發展的時代,信產業正成為國家戰略的重要支撐。而我們的國產工控主板,以其卓越的性能和可靠的品質,為信產業的發展注入強大動力。國產工控
    的頭像 發表于 11-06 10:29 ?506次閱讀

    中科達榮獲2024年軟件和信息技術服務優秀企業

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

    工控機重裝系統的方法介紹

    ? 工控機怎么重裝系統,工控機重裝系統的方法介紹攻略 ? 首先看下自己購買的什么工控機,是工業平板電腦還是常規的工控主機,我們此篇
    的頭像 發表于 10-23 17:11 ?919次閱讀

    工控主板有哪些特點?

    ?工控主板是用于工業控制領域的專用主板,具有以下特點: 穩定性:工控主板通常經過嚴格的測試和優化,具有較高的穩定性和可靠性,能夠在惡劣的工業
    的頭像 發表于 10-10 08:55 ?579次閱讀

    國產化背景下的工控主板發展現狀

    ,是信息技術應用創新產業的簡稱,于2016年“信工委會”(信息技術應用創新工作委員會)提出,目的就是要推動我們國內軟硬件關鍵技術的研發
    的頭像 發表于 09-21 16:15 ?698次閱讀

    梯度科技入選2023年信息技術應用創新解決方案名單

    日前,工業和信息化部網絡安全產業發展中心(工業和信息化部信息中心)在天津舉辦2024信息技術應用創新發展大會暨解決方案應用推廣大會。會上正式
    的頭像 發表于 09-09 16:29 ?613次閱讀

    使用工控主板時該注意哪些事項?

    最近大家都在頻繁問一個問題就是工控主板在什么人為情況下容易出現故障,從而造成工控主板的損壞,那今天小編就來講講,我們在使用工控
    的頭像 發表于 06-05 16:01 ?627次閱讀
    使用<b class='flag-5'>工控</b><b class='flag-5'>主板</b>時該注意哪些事項?

    工控主板的性能指標有哪些?

    工控主板是工業控制領域中的關鍵組成部分,它承載著工控系統的核心功能。因此,工控主板的性能指標是評估其質量和性能的重要標準。本文將
    的頭像 發表于 05-10 16:27 ?1231次閱讀
    <b class='flag-5'>工控</b><b class='flag-5'>主板</b>的性能指標有哪些?

    翼輝信息入選2023年信息技術應用創新解決方案名單

    近日,2023 年(第五屆)信息技術應用創新解決方案公布遴選名單,歷經資格初審、技術中評、區域評議、終評預審,翼輝以“面向工業領域嵌入式操作系統 SylixOS 解決方案”,成功在全國
    的頭像 發表于 04-28 11:37 ?793次閱讀
    翼輝<b class='flag-5'>信息</b>入選2023年<b class='flag-5'>信息技術</b>應用創新解決<b class='flag-5'>方案</b>名單

    工控主板和普通主板的區別有哪些

    工控主板和普通主板是兩種在計算機硬件領域中常見的主板類型,它們在設計、功能和用途上有著明顯的區別。工控
    的頭像 發表于 04-25 16:54 ?1678次閱讀
    <b class='flag-5'>工控</b><b class='flag-5'>主板</b>和普通<b class='flag-5'>主板</b>的區別有哪些
    主站蜘蛛池模板: 日本日b视频 | 华人永久免费视频 | 天天躁日日2018躁狠狠躁 | 天天射天 | 国产精品伦理久久久久 | 天天射天天干天天色 | 天天操天天射天天 | 69性xxxxfreexxxx| 日韩一级欧美一级一级国产 | 日本不卡在线观看 | 亚洲不卡视频在线 | 一级做a爰片久久毛片美女图片 | 全黄h全肉边做边吃奶在线观看 | 天天伊人 | 在线精品视频成人网 | 国产精品免费久久久免费 | 亚洲第一视频网 | 美女扒开尿口给男人看的让 | 成年视频在线观看 | 国产未成女年一区二区 | 特污兔午夜影院 | 在线观看免费国产 | 激情婷婷 | 狠狠色丁香婷婷综合久久来 | 色老成人精品视频在线观看 | 一区二区三区视频观看 | 在线观看精品国产福利片100 | 两人性世界 | 亚洲大色 | 久久三级网站 | 久久天天操 | 亚洲精品视频在线 | 成人亚洲视频 | 色综合激情丁香七月色综合 | 四虎影院美女 | 久操免费视频 | 日韩三级免费观看 | 精品综合久久久久久98 | 美女丝袜长腿喷水gif动态图 | 久久香蕉综合色一综合色88 | 天堂在线资源网 |