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.

[参考译文] TM4C USB 器件-向主机读取和写入数据

Guru**** 2455360 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/627846/tm4c-usb-device---read-and-write-data-to-host

您好!  

我修改了 USB_DEV_BULK 示例 A 位、可以读取来自主机(PC)的数据、但无法发回我的"状态代码"。 只有第一个字母"1"会返回到主机。

静态 uint32_t
EchoNewDataToHost (tUSBDBulkDevice * psDevice、uint8_t * pui8Data、
uint32_t ui32NumBytes)
{
uint32_t ui32Loop、ui32Space、ui32Count;
uint32_t ui32ReadIndex;
uint32_t ui32WriteIndex;
uint32_t valueL;
uint32_t 值计算器;
uint32_t valuec;
tUSBRingBufObject sTxRing;

//
//获取当前缓冲区信息,以便我们直接写入
//发送缓冲区(我们已经从中获得了足够的信息
//直接访问接收缓冲区的参数)。
//
USBBufferInfoGet (&g_sTxBuffer、&sTxRing);

//
//传输缓冲区中有多少空间?
//
ui32Space = USBBufferSpaceAvailable (&g_sTxBuffer);

//
//我们可以处理这一整段时间的字符数?
//
ui32Loop =(ui32Space < ui32NumBytes)? ui32Space:ui32NumBytes;
ui32Count = ui32Loop;

//
//更新接收计数器。
//
G_ui32RxCount += ui32NumBytes;

//
//转储调试消息。
//
debug_print ("接收到的%d 字节\n"、ui32NumBytes);

//
//设置为通过直接访问 USB 缓冲区来处理字符。
//
ui32ReadIndex =(uint32_t)(pui8Data - g_pui8USBRxBuffer);
ui32WriteIndex = sTxRing.ui32WriteIndex;

while (ui32Loop)
{
UARTprintf ("\n");

//
//左侧 USB MSG
//
if ((g_pui8USBRxBuffer[ui32ReadIndex]='L')
{
ui32ReadIndex++;
ui32ReadIndex =(ui32ReadIndex == bulk_buffer_size)?
0:ui32ReadIndex;
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_3、GPIO_PIN_3);
UARTprintf (“左”);
char buffer[3];
uint32_t i;
对于(i = 0;i<3;i++){
Buffer[i]= g_pui8USBRxBuffer[ui32ReadIndex];
ui32ReadIndex++;
ui32ReadIndex =(ui32ReadIndex == bulk_buffer_size)?
0:ui32ReadIndex;
}
valueL = atoi ((char *) buffer);
UARTprintf ("\n %I"、valueL);
sprintf (g_pui8USBTxBuffer、"100");



}

//
// RGITH 端 USB MSG
//
否则、if ((g_pui8USBRxBuffer[ui32ReadIndex]='R')
{
ui32ReadIndex++;
ui32ReadIndex =(ui32ReadIndex == bulk_buffer_size)?
0:ui32ReadIndex;
UARTprintf (" right ");
char buffer[3];
uint32_t i;
对于(i = 0;i<3;i++){
Buffer[i]= g_pui8USBRxBuffer[ui32ReadIndex];
ui32ReadIndex++;
ui32ReadIndex =(ui32ReadIndex == bulk_buffer_size)?
0:ui32ReadIndex;
}
valueer = atoi ((char *) buffer);
UARTprintf ("\n %I"、评估器);
sprintf (g_pui8USBTxBuffer、"100");

}



ui32loop--;
}


//
//我们已对数据进行处理,因此现在发送已处理的数据
//返回到主机。
//
USBBufferDataWritten (&g_sTxBuffer、sizeof (g_pui8USBTxBuffer[bulk_buffer_size]);

debug_print ("写入%d 个字节\n"、ui32Count);

//
//我们处理了尽可能多的直接来自接收缓冲区的数据
//我们需要返回允许较低层的字节数
//适当地更新其读取指针。
//
return (ui32Count);
} 

我可以告诉我什么是错误、这真的很好、我以前从未使用过 USB 通信、我一直使用过 UART。 因此、在下一步中、我想获得有关创建一个诸如"UARTPrintln"的函数的帮助、该函数可以使用一个简单的参数来调用、该参数将是消息本身。  

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

    您好、Zoltan、

    USBBufferDataWritten (&g_sTxBuffer、sizeof (g_pui8USBTxBuffer[bulk_buffer_size]); 

    这条线毫无意义... 您要求 API 进行 sizeof 评估 g_pui8USBTxBuffer[bulk_buffer_size]的大小-这将是数组位置 bulk_pbuffer_size 处的奇异数组结果。 那么、它将始终为1、不是吗? 这将解释为什么只有第一个值被发回?

    原始代码中 有一个原因是我们使用了 ui32Count 变量。 您需要跟踪计划发送的字节数。

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


    是的、我知道这毫无意义、但我非常不清楚。 原始代码逐个处理传入的字符。 因此、如果我在这里没有犯错。 问题是我只写入 g_pui8USBTxBuffer 的前3个字节。 因此、我第一次收到100个、但之后没有任何结果。 (dev_bulk_example.exe 显示我收到了4个字节、但它们是空的、因此仅显示""符号。

    在过去的20分钟里,我一直盯着原始 EchoNewDataToHost(),但我看不到树的森林。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Zoltan、

    API 需要知道要发送的字节数、因此、如果每次发送的字节数仅为3个字节、 然后、只需对3进行硬编码、即可查看您是否能获得积极结果(尽管将来使该值自适应可能是关键、具体取决于您的应用)。

    到目前为止、您所描述的问题是、您无法发回状态代码、而只能发送第一个字母-如果您每次仅发回1个字节、我会看到什么。

    原始示例是回波示例、对吧? 如果是这样、它需要用户按键、读取它并将其输出回。 在这种情况下、无需发送超过1个字节、因为人类无法在该特定应用中键入 MCU 的处理速度。 这就是回波示例的本质。

    对于您的应用程序、似乎您需要接收数据(可能超过1个字节)、然后发回数据(听起来非常类似于多个字节) 因此、如果您使用回显示例作为基础、则需要删除仅为 RX 1字节、TX 1字节的考量面、并用 RX x 字节和 TX x 字节替换它们、其中 x 是 RX 和 TX 的预期数据包大小 (这很可能需要动态)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Zoltan、

    我还在寻找类似的要求。

    我希望 TM4C 器件成为一款器件、并希望通过 USB 向我的主机 PIC32 MC 发送和接收数据。

    这将有助于我与这两者进行交流。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Ralph、

    很抱歉、您没有及时更新、但我不得不以另一种方式解决问题(我们在 USB 部件上暂时停止了工作)、但现在我又回到了正轨。

    那么、您能否更详细地解释一下这一点、请转到1个字节到 X 个字节?

    谢谢、

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

    您是否成功使其正常工作?

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

    您好、Zoltan、

    USBBufferDataWritten 要求第二个参数是发送的字节数。

    对于您的代码、您将列出以下内容:

    USBBufferDataWritten (&g_sTxBuffer、sizeof (g_pui8USBTxBuffer[bulk_buffer_size]); 

    但是、  

    sizeof (g_pui8USBTxBuffer[buld_buffer_size]) 

    这将始终返回值1。

    这是因为您不检查整个缓冲区的大小、而是检查缓冲区单个条目的大小。 因此、结果将始终等于1。

    相反、您应该拥有一个计数器来跟踪您加载到 g_pui8USBTxBuffer 中的字节数量、然后将计数器用于 USBBufferDataWritten API。

    但是、现在、如果您知道您将始终发送3个字节、则可以只发送与初始测试类似的硬代码、以确保解决您的问题:

    USBBufferDataWritten (&g_sTxBuffer、3); 

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

    亲爱的拉尔夫!

    我每次都设法获得返回的状态代码、但使用3位数字时、缓冲区大小存在问题。 几条消息后、由于256字节大小、我开始接收到"010"、这是一个问题。 所以我决定使用"1000"、因为它不会导致缓冲区出现任何问题。

    解决方案是:

    sprintf (g_pui8USBTxBuffer + strlen (g_pui8USBTxBuffer)、"1000");
    
    USBBufferDataWritten (&g_sTxBuffer、4);
    

    问题在于 CCS 标记 sprintf:

    此行有多个标记
    -"uint8_t *"类型的#169-D 参数与"const char *"类型的参数不兼容
    -"uint8_t *"类型的#169-D 参数与"char *"类型的参数不兼容
    -#1532-D (ULP 5.3)检测到 sprintf ()操作。 建议在运行时将其移动到 RAM 中
    或不使用、因为这些是处理/功耗密集型的
    - USB_dev_bulk.c、第309行($C$L19)[S/W BP]

    它可以正常工作、因此我不确定是否有解决方法来消除警告。

    但是、该应用程序已经开发了一些新的系统。

    成功接收到1200个字节后、它就会挂起。 无论数据输入的速度或速度有多快、它都只是挂起。 在调试模式下、我看不到任何问题、可能我看到了错误的数字?

    对此有什么想法吗?

    。  

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

    它所抱怨的问题似乎是其中使用了 char 参数、也许是因为 strlen 返回的方式-查看 strlen 函数是否返回为 char 类型、如果是、则只需将 typecast 返回 uint8_t 即可解决该问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    除非 strlen 不是标准的、否则它应该返回 size_t

    size_t 是特定于编译器的类型、但出于实际目的、在各个编译器之间保持一致。

    Robert