This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28069:μ µC 和 Windows 10 64位之间的 USB 通信-读取访问违规

Guru**** 2542530 points
Other Parts Discussed in Thread: C2000WARE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1199205/tms320f28069-usb-communication-between-c-and-windows-10-64-bit---read-access-violation

器件型号:TMS320F28069
主题中讨论的其他器件:C2000WARE

您好!

我们正在64位 Windows 上开发一个 GUI 应用程序、该应用程序应使用 Visual Studio 2022中的 C++通过 USB 2.0与微控制器进行通信。 我们之前曾请求寻求有关提供64位版本的 tiusbdll 功能的帮助。 我们当前正在使用以下帖子中标记为答案的回复中共享的文件:

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1175659/tms320f28069-usb-communication-between-c-and-windows-10-64-bit---64-bit-driver-needed/4430883#4430883 

为了初始化通信、我们大致按照 在 utilities/tools/f2838x/usb_bulk_example.c  的 C2000Ware 版本3.02.00.00中通过调用 InitializeDevice ()设置 TIUSB_handle husb 并使用它通过适当的函数参数调用 WriteUSBPacket ()的顺序进行操作。 在本例中、这只是发送2个字节。根据我们使用 Wireshark 监视 PC 端 USB 端口的情况、这些字节会被发送、并根据监视微控制器中缓冲区的调试模式到达。

但是,  在微控制器发送任何响应之前,调用 ReadUSBPacket()以读取返回的数据会导致在 winusb.dll 调用读取操作期间出现意外的访问违规异常。winusb.dll 又被 tiusbdll.dll 调用。  

由于我们确实有一个基于前一个工程用 C 语言写入的32位 tiusbdll 的有效通信协议、因此我们可以确认微控制器在接到32位协议的指示时可以发回所请求的数据、也可以在 Wireshark 中看到这一点。 ReadUSBPacket()的函数调用与我们尝试在64位版本中实现的函数调用相同,包括所有函数参数。  

重新编译64位 dll-file 时发生的变化是否可能会导致读取操作无法像以前一样正常工作? 如果您需要进一步说明、请随时询问。  

提前感谢您、此致。

编辑02/23/2023:我们已经进一步测试并考虑了可能需要在64位中以不同于32位的方式声明或初始化函数调用中使用的某些变量(例如关于缓冲区大小、地址类型等)。 是否可能需要更改任何类似更改才能将开关容纳 到64位?

此外,对于32位协议,安装在 Windows/system32/文件夹中的驱动程序文件 ucrtbased.dll 或 vcruntime140d.dll 是否可能必须更改或安装到其他地方?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    调用 ReadUSBPacket 时、您是否获得访问违规的任何异常代码? -它可能有助于找出是什么导致了这个问题。

    我 对 Win USB API 没有深入的了解。 我们将研究该问题、并为该问题提出解决方案。

    此致

    Siddharth

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Siddharth:

    只要发生访问冲突、异常代码和描述通常类似于"0xC0000005: 位置0x000000000000000000000000处的读取访问冲突"、尽管末尾的地址有多次不同。  

    此外、在我们最终进行了多次测试后、读取操作不会引发上述异常、但通过 Wireshark 监控的 USB 也会显示两个器件之间没有通信。 从返回的 DWORD dwError 读取生成的错误消息、g_pcErrorString 显示"错误的参数"和"无效的句柄"作为未完成读取操作的原因。 但是、我们在写入函数调用和读取函数调用之间根本不会更改 husb 句柄。

    感谢您在这方面的帮助。

    此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Andreas、您好!  

    我仔细检查了 DLL 的代码、ReadUSBPacket 调用 WinUsb_ReadPipe 函数来读取数据。 这采用了相同的参数的 USB 句柄,因此不知道为什么它投诉错误的参数。  我无法在 WinsUSB API 中找到任何要针对64位执行的操作。  您能否尝试将其发布在 Microsoft 论坛上、看看他们是否可以提供任何指导来处理此问题?

    此致

    Siddharth  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Siddharth:

    感谢您最终深入探究此问题 至少这样,我们就可以消除一个可能的原因,把我们的努力集中在其他方向上。

    此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Andreas、您好!  

    我目前没有其他建议。 我们会不断寻找解决方案、如果我想找出什么、就告诉您。

    此致

    Siddharth