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

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

英創(chuàng)信息技術(shù)工控主板USB通信方案介紹

英創(chuàng)信息技術(shù) ? 來源:英創(chuàng)信息技術(shù) ? 作者:英創(chuàng)信息技術(shù) ? 2020-01-15 14:44 ? 次閱讀

英創(chuàng)AMR9系列工控主板可以使用USB與PC連接并進(jìn)行通信。在主板上,我們將USB引到了COM1,使得我們可以通過操作串口的方式來操作USB口的連接與收發(fā)。在PC端,我們提供一個(gè)使用WDK提供的驅(qū)動(dòng),來進(jìn)行USB通信的解決方案。

驅(qū)動(dòng)的安裝及說明請(qǐng)參考文章《英創(chuàng)工控主板USB驅(qū)動(dòng)安裝說明》。

工控主板端USB收發(fā)程序說明

英創(chuàng)AMR9系列工控主板已將USB引導(dǎo)COM1,這里使用開發(fā)光盤中的串口例程SPT_HEX做USB收發(fā)調(diào)試?yán)獭?/p>

代碼中需要注意的地方:

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

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

波特率,停止位,數(shù)據(jù)位,校驗(yàn)參數(shù)不產(chǎn)生實(shí)際作用,這里可以使用默認(rèn)值。

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

在函數(shù)OpenPort中,調(diào)用SetCommTimeouts設(shè)置超時(shí)函數(shù)時(shí)最好設(shè)置有寫超時(shí),否則在發(fā)數(shù)據(jù)時(shí),在PC端接收完數(shù)據(jù)前,WriteFile函數(shù)會(huì)一直阻塞。

PC端USB收發(fā)程序說明

在WDK提供的驅(qū)動(dòng)中,創(chuàng)建了2個(gè)pipe來進(jìn)行USB的收發(fā),通過對(duì)這兩個(gè)pipe的ReadFile和WriteFile操作進(jìn)行USB通信。

1、檢測(cè)設(shè)備

USB設(shè)備支持即插即用,當(dāng)設(shè)備連接或斷開時(shí),都可以收到系統(tǒng)將發(fā)出的消息。

使用該消息需要先引用系統(tǒng)頭文件

#include 'dbt.h'

并在在MESSAGEMAP宏中添加設(shè)備檢測(cè)消息WM_DEVICECHANGE

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

ON_WM_DEVICECHANGE()
END_MESSAGE_MAP()

在對(duì)話框頭文件中添加該消息的響應(yīng)函數(shù)

afx_msg BOOL OnDeviceChange(UINT nEventType,DWORD_PTR dwData);

當(dāng)設(shè)備發(fā)生變化(USB接上或斷開)時(shí),OnDeviceChange函數(shù)會(huì)得到響應(yīng)。
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讀寫管道路徑

首先,獲取設(shè)備路徑需要使用到setupapi.lib庫中的相關(guān)函數(shù),所以需要在工程中添加setupapi.lib庫

添加setupapi.lib庫的頭文件

#include

添加驅(qū)動(dòng)代碼的public.h頭文件,該頭文件定義了USB設(shè)備的GUID

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

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

添加一個(gè)GetUsbDeviceFileName函數(shù)通過GUID獲取設(shè)備地址

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;
}
}

該函數(shù)大致流程:

1.通過SetupDiGetClassDevs函數(shù)根據(jù)GUID獲得設(shè)備頂級(jí)窗口句柄。

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

3.當(dāng)找到符合條件的設(shè)備后,使用SetupDiGetDeviceInterfaceDetail函數(shù)獲取設(shè)備路徑。

根據(jù)設(shè)備路徑獲得輸入管道和輸出管道的路徑。

// 獲得USB設(shè)備路徑 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'設(shè)備未連接');
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;
}

驅(qū)動(dòng)代碼設(shè)定,輸入管道路徑為設(shè)備路徑加上\PIPE00,輸出管道路徑為設(shè)備路徑加上\PIPE01

2、USB口通信

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

注意,在讀取USB口數(shù)據(jù)時(shí),ReadFile函數(shù)會(huì)阻塞。所以需要用非阻塞的方式讀,在打開PIPE時(shí)使用FILE_FLAG_OVERLAPPED標(biāo)記。

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);
// 因?yàn)槭莖verlapped操作,ReadFile會(huì)將讀文件請(qǐng)求放入讀隊(duì)列之后立即返回(false),而不會(huì)等到文件讀完才返回(true)
if (!success)
{
if (GetLastError() == ERROR_IO_PENDING)
{
dwRes = WAIT_TIMEOUT;
while(dwRes != WAIT_OBJECT_0)
{
dwRes = WaitForSingleObject(pDlg->hRead, 1000);
// 獲取讀的的長(zhǎng)度
success = GetOverlappedResult(pDlg->hRead, &overlap, &len, FALSE);
// 上面二條語句完成的功能與下面一條語句的功能等價(jià):
// 一直阻塞等到得到數(shù)據(jù)才繼續(xù)下面。
// GetOverlappedResult(pDlg->hRead, &overlap, &len, TRUE);
if (pDlg->killThread)
{
// 關(guān)閉線程,直接關(guān)閉
return 0;
}
}
}
else
{
// 出錯(cuò)!
return -1;
}
}

傳輸速度測(cè)試

編寫程序,測(cè)試工控主板端向PC端的數(shù)據(jù)傳輸速度。

EM9170上傳速度最高可達(dá)3.6MB/秒。

EM9160上傳速度最高可達(dá)500kb/秒。

其他說明

驅(qū)動(dòng)中默認(rèn)的管道BUFFER大小為256字節(jié),在讀寫操作時(shí),不宜超過管道BUFFER大小,否則會(huì)返回失敗。例程中提供一個(gè)修改后的驅(qū)動(dòng),只是簡(jiǎn)單將BUFFER擴(kuò)大到64K,原驅(qū)動(dòng)保留為usbsamp_bak.sys。

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

    關(guān)注

    7

    文章

    6086

    瀏覽量

    35486
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    工控主板在數(shù)控機(jī)床設(shè)備中的應(yīng)用

    工控主板作為數(shù)控機(jī)床的核心組件之一,發(fā)揮著至關(guān)重要的作用。以下是工控主板在數(shù)控機(jī)床設(shè)備中應(yīng)用的詳細(xì)介紹
    的頭像 發(fā)表于 01-09 15:33 ?63次閱讀

    中科曙光南京研究院方案入選江蘇省信息技術(shù)創(chuàng)新優(yōu)秀解決方案

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

    ?什么是國產(chǎn)工控主板,國產(chǎn)工控主板的特點(diǎn)有哪些?

    什么是國產(chǎn)工控主板呢?國產(chǎn)工控主板是工業(yè)計(jì)算機(jī)的主板,是一種計(jì)算機(jī)系統(tǒng)的硬件設(shè)備,是專門為工業(yè)控制場(chǎng)景設(shè)計(jì)和生產(chǎn)的電路板。它在國內(nèi)的研發(fā)和制
    的頭像 發(fā)表于 11-07 10:29 ?237次閱讀

    國產(chǎn)工控主板,信創(chuàng)產(chǎn)業(yè)發(fā)展新引擎

    在當(dāng)今科技飛速發(fā)展的時(shí)代,信創(chuàng)產(chǎn)業(yè)正成為國家戰(zhàn)略的重要支撐。而我們的國產(chǎn)工控主板,以其卓越的性能和可靠的品質(zhì),為信創(chuàng)產(chǎn)業(yè)的發(fā)展注入強(qiáng)大動(dòng)力。國產(chǎn)工控
    的頭像 發(fā)表于 11-06 10:29 ?285次閱讀

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

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

    工控機(jī)重裝系統(tǒng)的方法介紹

    ? 工控機(jī)怎么重裝系統(tǒng),工控機(jī)重裝系統(tǒng)的方法介紹攻略 ? 首先看下自己購買的什么工控機(jī),是工業(yè)平板電腦還是常規(guī)的工控主機(jī),我們此篇
    的頭像 發(fā)表于 10-23 17:11 ?392次閱讀

    工控主板有哪些特點(diǎn)?

    ?工控主板是用于工業(yè)控制領(lǐng)域的專用主板,具有以下特點(diǎn): 穩(wěn)定性:工控主板通常經(jīng)過嚴(yán)格的測(cè)試和優(yōu)化,具有較高的穩(wěn)定性和可靠性,能夠在惡劣的工業(yè)
    的頭像 發(fā)表于 10-10 08:55 ?358次閱讀

    創(chuàng)國產(chǎn)化背景下的工控主板發(fā)展現(xiàn)狀

    創(chuàng),是信息技術(shù)應(yīng)用創(chuàng)新產(chǎn)業(yè)的簡(jiǎn)稱,于2016年“信創(chuàng)工委會(huì)”(信息技術(shù)應(yīng)用創(chuàng)新工作委員會(huì))提出,目的就是要推動(dòng)我們國內(nèi)軟硬件關(guān)鍵技術(shù)的研發(fā)
    的頭像 發(fā)表于 09-21 16:15 ?455次閱讀

    梯度科技入選2023年信息技術(shù)應(yīng)用創(chuàng)新解決方案名單

    日前,工業(yè)和信息化部網(wǎng)絡(luò)安全產(chǎn)業(yè)發(fā)展中心(工業(yè)和信息化部信息中心)在天津舉辦2024信息技術(shù)應(yīng)用創(chuàng)新發(fā)展大會(huì)暨解決方案應(yīng)用推廣大會(huì)。會(huì)上正式
    的頭像 發(fā)表于 09-09 16:29 ?459次閱讀

    使用工控主板時(shí)該注意哪些事項(xiàng)?

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

    工控主板容易出現(xiàn)故障的原因有哪些?

    最近大家都在頻繁問一個(gè)問題就是工控主板在什么人為情況下容易出現(xiàn)故障,從而造成工控主板的損壞,那今天小編就來講講,我們?cè)谑褂?b class='flag-5'>工控
    的頭像 發(fā)表于 05-17 10:57 ?416次閱讀

    工控主板的性能指標(biāo)有哪些?

    工控主板是工業(yè)控制領(lǐng)域中的關(guān)鍵組成部分,它承載著工控系統(tǒng)的核心功能。因此,工控主板的性能指標(biāo)是評(píng)估其質(zhì)量和性能的重要標(biāo)準(zhǔn)。本文將
    的頭像 發(fā)表于 05-10 16:27 ?947次閱讀
    <b class='flag-5'>工控</b><b class='flag-5'>主板</b>的性能指標(biāo)有哪些?

    翼輝信息入選2023年信息技術(shù)應(yīng)用創(chuàng)新解決方案名單

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

    工控主板和普通主板的區(qū)別有哪些

    工控主板和普通主板是兩種在計(jì)算機(jī)硬件領(lǐng)域中常見的主板類型,它們?cè)谠O(shè)計(jì)、功能和用途上有著明顯的區(qū)別。工控
    的頭像 發(fā)表于 04-25 16:54 ?1368次閱讀
    <b class='flag-5'>工控</b><b class='flag-5'>主板</b>和普通<b class='flag-5'>主板</b>的區(qū)別有哪些

    龍芯中科三項(xiàng)信創(chuàng)方案入圍工信部2023年信息技術(shù)應(yīng)用創(chuàng)新應(yīng)用示范案例名單

    近日,工業(yè)和信息化部通報(bào)了2023年信息技術(shù)應(yīng)用創(chuàng)新解決方案征集遴選結(jié)果,本次共評(píng)選出典型解決方案173個(gè)、應(yīng)用示范案例83個(gè)、單項(xiàng)創(chuàng)新案例64個(gè)。
    的頭像 發(fā)表于 03-07 16:45 ?976次閱讀
    龍芯中科三項(xiàng)信<b class='flag-5'>創(chuàng)</b><b class='flag-5'>方案</b>入圍工信部2023年<b class='flag-5'>信息技術(shù)</b>應(yīng)用創(chuàng)新應(yīng)用示范案例名單
    主站蜘蛛池模板: 精品久久久久久午夜| 天堂资源地址在线| 免费一级毛片视频| 亚洲第一视频在线观看| 国产精品久久精品牛牛影视| 国产黄色精品| 亚洲 欧美 校园| 欧美 ed2k| 亚洲午夜久久影院| 夜间免费视频| 美女被日出白浆| 在线黄网| 男女交黄| 天堂网中文字幕| 日韩毛片高清免费| 精品一级毛片| 免费黄色福利视频| 国产精品久久久久aaaa| 天天综合天天做| free性日韩| 国产在线精品一区二区夜色| 婷婷丁香在线| 精品一区二区视频| 午夜影吧| 天天夜夜久久| 国产亚洲精品aa在线看| 黄网免费观看| 一本到卡二卡三卡福利| 亚洲精品亚洲人成人网| 日本在线不卡免| 午夜精品久久久久久| 亚洲四虎在线| 能看的黄色网址| 真实一级一级一片免费视频| 在线免费色视频| 久操青青| 欧美性猛交xxxx免费看久久| 久久久久国产一级毛片高清板| 色噜噜狠狠狠狠色综合久| 全部免费a级毛片| 国产精品一区二区综合|