工具/软件:TI C/C++编译器
大家好、我正在尝试使用 AT+CMGR=1命令从手机读取短信。 我正在使用 UART1接收消息。 但 Tiva UART 最多只能保存16个字节、实际数据出现在30到35个字节之间。 如何通过 UART 读取所有数据?
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.
工具/软件:TI C/C++编译器
大家好、我正在尝试使用 AT+CMGR=1命令从手机读取短信。 我正在使用 UART1接收消息。 但 Tiva UART 最多只能保存16个字节、实际数据出现在30到35个字节之间。 如何通过 UART 读取所有数据?
您好 Ralph,我没有使用任何 ISR 来处理 UART。 我只是使用 UARTCharGetNonBlocking (UART3_base) 将数据输入缓冲区。
while (UARTCharsAvail (UART3_base))
{
Buffer_cmgr [k++]=UARTCharGetNonBlocking (UART3_base);
}
我正在正确获取前16个字节、但在这之后、我得到了\xff。 我的实际数据出现在30到35字节之间。
关于 AT 命令、AT+CMGR=1用于从电话读取传入的文本消息。
在这里、我正在尝试读取从电话发送的传入消息。
您好 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个字节。
[引用 user="Indrajeet Hujare "]字符 buffer_cmgr[50];
[引用用户="Indrajeet Hujare ">+CMGL:1、"REC Read"、"+85291234567"、"07/02/18、00:05:10+32"
注意到以下情况-可能会证明您感兴趣:
现在、供应商的 Ralph 报告发送成功 、"通过 UART_0发送大于16字节"。 然而,这种方法有两个缺点:
很好地阅读 MCU 手册和 PDL 用户手册-无法(清晰/完全)揭示 UART 的接收 FIFO 的行为-当数据到达时、接收 FIFO 已满。 (即16字节容量。) 下面是说明-通过 UART 寄存器、'UARTDR'…… 位11 (OE)... '当 FIFO 满时、接收到新数据、导致数据丢失。'
人们一定要问,这种数据(真的)是否清楚和完整? 此 UART 接收 FIFO 区域(很可能)-保证有更多(即部分)改进和详细-供应商描述工作...
感谢您-您之前报告过收到"额外字节"-超出这些初始字节(正确-前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 方法。