串口通信中遇到的问题

luckyboy26 2009-10-28 03:29:43
CPU是STM32F103CB,无操作系统。
通过UART1接受GPRS发来的数据,在中断函数中 USART1_IRQHandler 中进行处理

unsigned char a_GPRSData[500];
unsigned int g_DataLength;

void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
a_GPRSData[g_DataLength] = USART_ReceiveData(USART1);
g_DataLength++;

USART_ClearITPendingBit(USART1, USART_IT_RXNE);

}
}

UART1设置如下:
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_Init(USART1, &USART_InitStructure);


现在的问题是:
每次当接收的GPRS一包数据长度超过128字节,从a_GPRSData[127]开始到a_GPRSData[499],取得的数据便是错误的,而且是百分之百从a_GPRSData[127]开始的,从a_GPRSData[0]到a_GPRSData[126]的数据都没有问题,而且从UART1发送数据超过128字节也没有问题。请问高手这是怎么回事?
是不是由于串口存在什么所谓的硬件接收缓冲只有128字节,这点从芯片手册上没有看到啊。
还是这是不是和串口的设置有什么关系?
或者是其他什么问题,如何解决?
...全文
193 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
mxm1986 2009-11-02
  • 打赏
  • 举报
回复
对了,使用dma方式的时候,需要将内存设置为no cache模式!!!
xiaoyur347 2009-10-31
  • 打赏
  • 举报
回复
感觉楼上说得有道理,127是signed char的最大值,请注意g_DataLength的数据类型。
zjf0000 2009-10-29
  • 打赏
  • 举报
回复
根据以往经验你的unsigned int g_DataLength; 一定是在别的地方又定义为char g_DataLength;
DISINHUI 2009-10-29
  • 打赏
  • 举报
回复
不建议中断服务函数代码超过10行。在主函数中处理数据。中断函数只处理状态标志位。
贝隆 2009-10-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lixun00 的回复:]
窜口缓冲溢出了。
stm32据我所知没有所谓的硬件fifo.
不过可以DMA
[/Quote]
lixun00 2009-10-28
  • 打赏
  • 举报
回复
窜口缓冲溢出了。
stm32据我所知没有所谓的硬件fifo.
不过可以DMA

27,511

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧