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.

[参考译文] 编译器/TM4C123GE6PM:Tiva c UART

Guru**** 2391275 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/699511/compiler-tm4c123ge6pm-tiva-c-uart

器件型号:TM4C123GE6PM

工具/软件:TI C/C++编译器

大家好、我正在尝试使用 AT+CMGR=1命令从手机读取短信。 我正在使用 UART1接收消息。 但 Tiva UART 最多只能保存16个字节、实际数据出现在30到35个字节之间。 如何通过 UART 读取所有数据?   

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

    我不熟悉该命令、但接收到只要固件设置正确、大小就不会出现问题。

    您是否使用 ISR 来处理 UART 接收或轮询?

    您要发送的命令是否包含任何类型的报头数据包以指示接收设备的数据包长度?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Indrajeet、

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

    不,我无法解决这个问题。 我尝试使用不同的缓冲器、但它仍然不起作用。 读取15个字节后、它将为我提供0xff。

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

    您能回答我在第一篇帖子中的问题吗? 在我获得这些详细信息之前、我不知道如何开始帮助您解决问题...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Ralph,我没有使用任何 ISR 来处理 UART。 我只是使用 UARTCharGetNonBlocking (UART3_base)  将数据输入缓冲区。

    while (UARTCharsAvail (UART3_base))

     Buffer_cmgr [k++]=UARTCharGetNonBlocking (UART3_base);

    我正在正确获取前16个字节、但在这之后、我得到了\xff。 我的实际数据出现在30到35字节之间。  

    关于 AT 命令、AT+CMGR=1用于从电话读取传入的文本消息。

    在这里、我正在尝试读取从电话发送的传入消息。

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

    好的、感谢您澄清这一点。 您尝试的方法是将 while 循环与 UARTCharsAvail API 结合使用。

    您能否共享完整的配置代码?

    在您的原始邮件中、您还说过"我正在使用 UART1接收邮件。 "但您在这里使用的是 UART3。 您是否更改了 UART 基址?

    您是否有方法检查 UART 线路以确保将您期望的数据发送到 TM4C 器件?

    您提到16个字节后获得0xFF、由于没有可用的 UART 数据、在循环停止之前、您再接收多少字节?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Ralph、感谢您的快速响应。 实际上我使用的是 UART3。

    代码-

    #include 
    #include 
    #include 
    include "inc/hw_gpio.h"
    #include "templib/hw_types.h"
    #include "inc/hw_memmap.h"
    #include "inc/hw_ints.h"
    #include "driverlib/fpu.h"
    #include "driverlib/driverlib#driverline.h"#include
    "driverlib#driver.h"
    #driverline"#driverline"#include "driverlib/driverline.m#include "#driverline"#driverline"#driverh/driverline"#driver.h"#include "#driverline"#driverline"#include "#driverline"#driverline"#driverline"#driverline"#driverline.h/driverline"
    
    
    
    
    
    
    
    
    
    #include "#driverline"#driverline.h/driverline"#include "#driverline.h/driver.h"#include "#driverline"#include "#driverline"#driverline"#driverline"#driverline"#driverline.h/driver.h"#
    
    
    
    
    
    
    
    
    char buffer_at[5];
    char buffer_cmgf[5];
    char buffer_cmgr[50];
    char buffer_cmgr1[25];
    int i=0;
    int j=0;
    int k=0;
    int l=5;
    字符数据;
    /******** 函数分解******** /
    void UARTSend (const uint8_t * pui8Buffer、uint32_t ui32Count);
    
    /********* 主函数********* /
    void main (void)
    {
    int Response_at;
    int count=0;
    int count1=0;
    for (count=0;count<=5;count++)
    SysCtlDelay (SysCtlClockGet ()/(4));// 1sec
    
    /****** UART 初始化代码 /
    SysCtlPeripheralEnable (SYSCTL_Periph_UART3);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOC);
    //HWREG (GPIO_PORTC_BASE + GPIO_LO_LOCK)= GPIO_LOCK_KEY;
    //HWREG (GPIO_PORTC_BASE + GPIO_O_OP_6)
    
    
    ;GPIO_PIN_7 (GPIO_UPTC_7);GPIOPT3_UPTIC_7 (GPIO_PIN_GPIO_UPTC_UPTIC_6);GPIO_PIN_GPIOP_7)
    UARTConfigSetExpClk (UART3_base、SysCtlClockGet ()、9600、(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |UART_CONFIG_PAR_NONE);SysCtlPeripheralEnable
    (SYSCTL_PERIPH_GPIOF);GPIOPIN_1|GPIO_PIN_PIN_1-|GPIOTPL-2_PIN_PIN_PIN_1-|GPIOTPL-
    
    
    清除 uart3的 rec 缓冲器--- */
    while (UARTCharsAvail (UART3_base))
    temp = UARTCharGetNonBlocking (UART3_base);
    
    /*-- 关闭回波--*/
    UARTSend ((uint8_t *)"ATE0"、4);
    SysCtlDelay (SysCtlClockGet ()/(8));//0.5sec
    UARTCharPutNonBlocking (UART3_base、0x0d);
    while (UARTCharsAvail (UART3_base))
    {
    temp1=UARTCharGetNonBlocking (UART3_base);
    }
    SysCtlDelay (SysCtlClockGet ()/(4)));// 1sec
    /*--- 向第一个移动电话号码发送信息------------------------------------------------------- //
    while (1)
    {
    UARTSend ((uint8_t *)"at"、2);
    SysCtlDelay (SysCtlClockGet ()/(8));
    UARTCharNonPutBlocking (UART3_base、0x0d);
    RESPONSE_AT = UARTCharGet (UART3_base);
    IF (RESPONSE_AT!= 69)
    {
    break;
    }
    break;
    }
    while (UARTCharsAvail (UART3_base))
    ){
    buffer_at[i++]=UARTCharGetNonBlocking (UART3_base);
    }
    
    
    /*--- 清除 uart3的 rec 缓冲器--- //
    while (UARTCharsAvail (UART3_base))
    temp = UARTCharGetNonBlocking (UART3_base);
    
    
    while (1)
    {
    UARTSend (((uint8_t *)"AT+CMGF=1)、9);
    SysCtlDelay (SysCtlClockGet ()/(8);
    UART0Pudt (UART3)、Nonlocking (UART0Pudt)
    RESPONSE_AT = UARTCharGet (UART3_base);
    IF (RESPONSE_AT!= 69)
    {
    break;
    }
    break;
    }
    while (UARTCharsAvail (UART3_base))
    ){
    buffer_cmgf[j+]=UARTCharGetNonBlocking (UART3_base);
    }
    
    
    /*--- 清除 uart3的 rec 缓冲器--- //
    while (UARTCharsAvail (UART3_base)) temp2
    = UARTCharGetNonBlocking (UART3_base);
    
    
    while (1)
    {
    UARTSend (((uint8_t *)"AT+CMGR=1"、9);
    SysCtlDelay (SysCtlClockGet ()/(8)
    );UART0Xud_Base;UART0Pudt
    RESPONSE_AT = UARTCharGet (UART3_base);
    IF (RESPONSE_AT!= 69)
    {
    break;
    }
    break;
    }
    
    while (UARTCharsAvail (UART3_base))
    ){
    buffer_cmgr[k]=UARTCharGetNonBlocking (UART3_base);
    k++;
    }
    
    
    /*--- 发送命令到 GSM 模块--- //
    空 UARTSend (const uint8_t * pui8Buffer、uint32_t ui32Count)
    {
    while (ui32Count--)
    {
    UARTCharPutNonBlocking (UART3_base、* pui8Buffer++);
    }
    

    我想读取以下字符串、

    +CMGL:1、" REC 读取"、"+85291234567"、"07/02/18、00:05:10+32"

    但我最多可以读取16个字节。 我最多可以读取16个字节 。我还希望读取剩余的字节。

    在此代码中、我正在读取 AT 命令的响应。 在最后一个 buffer_cmgr 中 、我希望读取超过16个字节。

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

    感谢您共享配置。 我在我的末尾使用 LaunchPad 和 UART0进行了测试(为了方便使用 LPAD 的 USB-UART 功能)、并且根据您的 UART 设置使用 UARTCharsAvail 的轮询环路时、传输大于16字节的内容没有任何问题、 因此您的方法应该能够正常工作。

    您能否对 UART 线路进行范围控制并观察线路上的数据传输? 我怀疑您尝试接收的全部数据可能不在 UART 线路上。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Ralph、您是否尝试过相同的 AT 命令。 如果我尝试使用 UART0、那么连接 GSM 模块会怎样。  

    谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Ralph、我试过很多次、但这个轮询方法不起作用。 在获得16个字节后、它会为我提供-1。 UART 中没有可用数据。 我的 UART 无法获得超过16字节的数据。 您能建议另一种方法。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Indrajeet Hujare "]字符 buffer_cmgr[50]

    [引用用户="Indrajeet Hujare ">+CMGL:1、"REC Read"、"+85291234567"、"07/02/18、00:05:10+32"

    注意到以下情况-可能会证明您感兴趣:

    • 3个接收缓冲区(buffer_at、buffer_cmgf、buffer_cmgr)中的任何一个都没有清除过其"缓冲区计数器"(I、j 或 k)(超出初始代码设置。)
    • 如果 '+CMGL'是'CMGL'字符串的(真正的)部分-则已超过 buffer_cmgr 的50字节限制。  (我计数了56个字节、总计)
    • 由于 UART 的接收 FIFO 包含(最多) 16个字节-而16个字节是哪个海报能够成功接收-这不是(可能的)接收 FIFO 问题吗?
    • 供应商建议的"失去 UART 数据到达-发布这些初始16字节"-出现、"并非真的如此"-海报报告接收0xFF -尽管(不)此类0xFF 传输的数量!

    现在、供应商的 Ralph 报告发送成功 、"通过 UART_0发送大于16字节"。    然而,这种方法有两个缺点:

    • 海报使用的是 UART_3 -它可能已更改限制
    • Ralph 可能会"随意输入"他的数据-而海报的设备会以更快的字符速率发送数据。  (不是波特率-这是不变的)  如果 Ralph 能够"第一次封装他的数据"-这样封装超过16字节-并且以一致的字符速率传输、则可能会产生更好的测试。   (即手动/键盘数据输入以外的数据输入-可疑。)

    很好地阅读 MCU 手册和 PDL 用户手册-无法(清晰/完全)揭示 UART 的接收 FIFO 的行为-当数据到达时、接收 FIFO 已满。  (即16字节容量。)   下面是说明-通过 UART 寄存器、'UARTDR'……  位11 (OE)...  '当 FIFO 满时、接收到新数据、导致数据丢失。'   

    人们一定要问,这种数据(真的)是否清楚和完整?   此 UART 接收 FIFO 区域(很可能)-保证有更多(即部分)改进和详细-供应商描述工作...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回答。 正如您所注意到的、我将缓冲区的大小增加到100字节。 在本例中,UART 最多可容纳16个字节。 16字节后,其显示的 UART 为空。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您-您之前报告过收到"额外字节"-超出这些初始字节(正确-前16个字节。)
    这种情况(仍然如此)吗?   和-这些字节中的每一个字节都是相同的值。  (您已报告0xFF -早期版本)
    您定期收到多少个"不正确"字节?   

    您的代码显示、  缓冲区被使用后、不清除任何缓冲区计数器。  (已加载)  因此-如果您再次调用这些缓冲区加载-所有此类计数器都从高值开始-这不是您想要的!    (所有此类"请求的数据" (此帖子) 将有助于您的解决方案...)

    请注意-我在一场表演中、慕尼黑的"Automatica (自动坐位)"和"展位值班"使我的反应(现在)持续了好几个小时...

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

    您好 Indrajeet、

    [引用 user="Indrajeet Hujare ">您是否使用相同的 AT 命令进行了尝试。  

    [/报价]

    我没有您正在使用的模块、因此很遗憾、我无法在最后尝试。 这就是为什么我要求您对线路进行范围划分、以确定模块是否正确地发送了您期望的数据包。

    [引用 user="Indrajeet Hujare ">如果我尝试使用 UART0、那么与 GSM 模块的连接会怎样。  

    [/报价]

    我没有建议您尝试 UART0、我只是想强调我在结束时是如何执行测试的 并回答另一个查询...

    [引用 USER="CB1_MOBIST]海报 使用的是 UART_3 -它可能已更改限制

    [/报价]

    在 DS 或勘误表中都没有表明对 UART3有任何限制、这就是我认为使用 UART0足够准确的原因。

    [引用 user="Indrajeet Hujare ">我尝试过很多次、但此轮询方法不起作用。 在获得16个字节后、它会为我提供-1。 UART 中没有可用数据。 我的 UART 无法获得超过16字节的数据。 您能建议另一种方法。

    [/报价]

    您当然可以尝试使用中断。 我们在 TivaWare 中的 UART_echo 示例就是这样做的、设置简单明了。 但是、您需要将多个 RX 缓冲区减少到单个 RX 缓冲区、并进行适当的数据处理、因为您需要确保 ISR 代码相当精简。

    [引用 USER="CB1_MOBILE]Ralph 可能会"随意输入"他的数据-而海报的设备以(更可能)更快的字符速率发送数据。   (不是波特率-这是不变的)   如果 Ralph 能够"第一次封装他的数据"-这样封装超过16字节-并且以一致的字符速率传输、则可能会产生更好的测试。   (即手动/键盘数据输入以外的数据输入-可疑。)

    [/报价]

    我使用 UART 终端发送大型数据包,因此当我使用键盘创建数据包时,它会以恒定数据流发送所有30多个字节,而不是以手指键入的速度发送:)

    [引用 USER="CB1_MOBIT">供应商建议"丢失 UART 数据到达-发布这些初始16字节"-出现"并非真的如此"-海报报告接收0xFF -尽管(不)此类0xFF 传输的数量!

    [/报价]

    嗯、我在前面问过:"你提到你在16个字节后得到0xFF、在循环停止之前、你再接收多少字节、因为没有可用的 UART 数据?"

    除了"但我最多可以读取16个字节之外、没有收到明确的答案。 我最多可以读取16个字节 。我还希望读取剩余的字节。"

    因此、我还不能真正理解、如果预期的剩余字节读错了、根本就不会到达、到达比预期的时间更长等 在这种情况下、我希望 UART 线范围能够清楚地显示数据是否以连续流的方式传输到 TM4C、而问题确实在于 UART RX 方法。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,感谢您的快速响应。 我将正确获取前16个字节。 16字节后、我在 UART 中没有可用的数据。 它提供-1的值、例如 UART 中无数据可用。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这与您之前收到'0xFF'的报告不同-不是吗? 发生了什么变化?

    请注意-您尚未调用'UARTFIFOEnable'-供应商的 Ralph 应知道是否需要这样做-以便'UARTCharsAvail ()'函数可以正常运行。

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

    由 UARTConfigSetExpClk 处理、UARTConfigSetExpClk 在执行结束时调用启用 FIFO 的 UARTEnable。

    与共享的示例代码相比、我没有执行任何其他设置。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我之前使用的是 char 缓冲区、我将其更改为 int32_t 缓冲区。 然后、它开始在16个字节后为我提供-1。
    我是否需要使用 UARTFIFOEnable 函数?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Indrajeet、

    几个想法...

    1) 1)使用 uint32_t、我认为如果为 int32_t 获取0xFF、它现在是有符号的、等于-1。

    2) 2)在启动循环之前清除计数器、然后放入一些代码、您可以在 while 循环之后设置断点、并使用该断点检查计数器的值。 这将告诉我们由于 UART 存在数据而执行的循环次数。

    您是否还可以检查缓冲区是否有0x00启动?

    最后、您是否知道缓冲区中有多少字节被0xFF 值填充?

    关于 UARTFIFOEnable、正如我在上一个帖子中所述、您无需执行此操作、因为 UARTConfigSetExpClk 将启用 FIFO。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ralph、我使用 了 UART 中断处理程序、现在我可以读取所有字节。 轮询方法仍然有问题、感谢您的帮助。

    此致  

    Indrajeet