你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
意法半导体官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
积分商城
每日签到
USART接受数据时丢包
[复制链接]
xufengjuan
提问时间:2011-9-23 11:02 /
我使用串口调试助手向STM32的USART发送数据时,当波特率时115200时接受正常,当波特率时4800时就会发生丢后面的数据,丢的数据并不是固定长度,这是怎么回事?
赞
0
收藏
0
评论
4
分享
发布时间:2011-9-23 11:02
举报
请先
登录
后回复
4个回答
废鱼
回答时间:2011-9-23 14:49:50
a0a.1 0b0c
RE:USART接受数据时丢包
能不能把代码贴出来看看。可能是程序读取数据时候的问题。
赞
0
评论
回复
支持
反对
xufengjuan
回答时间:2011-9-23 16:07:05
a0a.1 0b0c
回复:USART接受数据时丢包
串口接收GPS信号
串口的初始化,选用的是USART2
void wvGPS_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
USART_ClockInitTypeDef USART_InitClockStructure;
NVIC_InitStructure.NVIC_IRQChannel = EVAL_COM1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
RCC_AHB1PeriphClockCmd(EVAL_COM1_TX_GPIO_CLK|EVAL_COM1_RX_GPIO_CLK, ENABLE);
RCC_APB1PeriphClockCmd(EVAL_COM1_CLK, ENABLE);
GPIO_PinAFConfig(EVAL_COM1_TX_GPIO_PORT,EVAL_COM1_TX_SOURCE,EVAL_COM1_TX_AF);
GPIO_PinAFConfig(EVAL_COM1_RX_GPIO_PORT,EVAL_COM1_RX_SOURCE,EVAL_COM1_RX_AF);
//TX
GPIO_InitStructure.GPIO_Pin = EVAL_COM1_TX_PIN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_Init(EVAL_COM1_TX_GPIO_PORT, &GPIO_InitStructure);
//RX
GPIO_InitStructure.GPIO_Pin = EVAL_COM1_RX_PIN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_Init(EVAL_COM1_RX_GPIO_PORT, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 4800;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
USART_InitStructure.USART_HardwareFlowContro= USART_HardwareFlowControl_None;
USART_InitClockStructure.USART_CPOL = USART_CPOL_Low;
USART_InitClockStructure.USART_CPHA = USART_CPHA_2Edge;
USART_InitClockStructure.USART_LastBit = USART_LastBit_Disable;
USART_InitClockStructure.USART_Clock = USART_Clock_Disable;
USART_ClockInit(USART2, &USART_InitClockStructure);
USART_Init(EVAL_COM1, &USART_InitStructure);
USART_Cmd(EVAL_COM1, ENABLE); //enable USART2
USART_ITConfig(EVAL_COM1, USART_IT_RXNE, ENABLE); //开USART2的接收中断
}
接收数据程序
void wvGPS_usart(void)
{
char res1;
static int8u NEMA_count = 0; //接收GPS数据的条数
static int8u USART_RX_STA = 0; //接收状态标记
if (USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == SET)//接收到数据 RXNE 位,USART->SRZ中
{
res1 = USART_ReceiveData(USART2);
if ('$' == res1)
{
GPS_NEMA[NEMA_count].isupdated = 1; //将上面一条语句打上更新标志
NEMA_count++;
if(NEMA_count > (NEMA_NUM_MAX-1))
{
NEMA_count = 0;
}
GPS_NEMA[NEMA_count].isupdated = 0; //将本条语句打上未更新标志
GPS_NEMA[NEMA_count].buffer[0] = '$';
USART_RX_STA = 1;
}
else
{
if (USART_RX_STA < NEMA_CHAR_MAX)
{
GPS_NEMA[NEMA_count].buffer[USART_RX_STA++] = res1;
}
if (USART_RX_STA > NEMA_CHAR_MAX-1) //
USART_RX_STA=0;
}
}
}
中断程序
void USART2_IRQHandler(void)
{
wvGPS_usart();
}
有时会把字符“*”接收为“0x2A”有时候就是0,别的字符没发现错误
回复第 2 楼 于2011-09-23 06:49:50发表:
能不能把代码贴出来看看。可能是程序读取数据时候的问题。
赞
0
评论
回复
支持
反对
废鱼
回答时间:2011-9-23 16:59:40
a0a.1 0b0c
RE:USART接受数据时丢包
这个问题很可能是由于接收计数器小于缓冲区引起的。代码改成下面的:
if (USART_RX_STA < NEMA_CHAR_MAX)
{
GPS_NEMA[NEMA_count].buffer[USART_RX_STA++] = res1;
}
else
USART_RX_STA=0;
赞
0
评论
回复
支持
反对
xufengjuan
回答时间:2011-9-24 15:40:14
a0a.1 0b0c
回复:USART接受数据时丢包
回复第 4 楼 于2011-09-23 08:59:40发表:
这个问题很可能是由于接收计数器小于缓冲区引起的。代码改成下面的:
if (USART_RX_STA < NEMA_CHAR_MAX)
{
GPS_NEMA[NEMA_count].buffer[USART_RX_STA++] = res1;
}
else
USART_RX_STA=0;
谢谢,按照你说的问题解决了
赞
0
评论
回复
支持
反对
所属标签
相似问题
关于
意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
RE:USART接受数据时丢包
回复:USART接受数据时丢包
串口的初始化,选用的是USART2
void wvGPS_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
USART_ClockInitTypeDef USART_InitClockStructure;
NVIC_InitStructure.NVIC_IRQChannel = EVAL_COM1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
RCC_AHB1PeriphClockCmd(EVAL_COM1_TX_GPIO_CLK|EVAL_COM1_RX_GPIO_CLK, ENABLE);
RCC_APB1PeriphClockCmd(EVAL_COM1_CLK, ENABLE);
GPIO_PinAFConfig(EVAL_COM1_TX_GPIO_PORT,EVAL_COM1_TX_SOURCE,EVAL_COM1_TX_AF);
GPIO_PinAFConfig(EVAL_COM1_RX_GPIO_PORT,EVAL_COM1_RX_SOURCE,EVAL_COM1_RX_AF);
//TX
GPIO_InitStructure.GPIO_Pin = EVAL_COM1_TX_PIN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_Init(EVAL_COM1_TX_GPIO_PORT, &GPIO_InitStructure);
//RX
GPIO_InitStructure.GPIO_Pin = EVAL_COM1_RX_PIN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_Init(EVAL_COM1_RX_GPIO_PORT, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 4800;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
USART_InitStructure.USART_HardwareFlowContro= USART_HardwareFlowControl_None;
USART_InitClockStructure.USART_CPOL = USART_CPOL_Low;
USART_InitClockStructure.USART_CPHA = USART_CPHA_2Edge;
USART_InitClockStructure.USART_LastBit = USART_LastBit_Disable;
USART_InitClockStructure.USART_Clock = USART_Clock_Disable;
USART_ClockInit(USART2, &USART_InitClockStructure);
USART_Init(EVAL_COM1, &USART_InitStructure);
USART_Cmd(EVAL_COM1, ENABLE); //enable USART2
USART_ITConfig(EVAL_COM1, USART_IT_RXNE, ENABLE); //开USART2的接收中断
}
接收数据程序
void wvGPS_usart(void)
{
char res1;
static int8u NEMA_count = 0; //接收GPS数据的条数
static int8u USART_RX_STA = 0; //接收状态标记
if (USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == SET)//接收到数据 RXNE 位,USART->SRZ中
{
res1 = USART_ReceiveData(USART2);
if ('$' == res1)
{
GPS_NEMA[NEMA_count].isupdated = 1; //将上面一条语句打上更新标志
NEMA_count++;
if(NEMA_count > (NEMA_NUM_MAX-1))
{
NEMA_count = 0;
}
GPS_NEMA[NEMA_count].isupdated = 0; //将本条语句打上未更新标志
GPS_NEMA[NEMA_count].buffer[0] = '$';
USART_RX_STA = 1;
}
else
{
if (USART_RX_STA < NEMA_CHAR_MAX)
{
GPS_NEMA[NEMA_count].buffer[USART_RX_STA++] = res1;
}
if (USART_RX_STA > NEMA_CHAR_MAX-1) //
USART_RX_STA=0;
}
}
}
中断程序
void USART2_IRQHandler(void)
{
wvGPS_usart();
}
有时会把字符“*”接收为“0x2A”有时候就是0,别的字符没发现错误
回复第 2 楼 于2011-09-23 06:49:50发表:
能不能把代码贴出来看看。可能是程序读取数据时候的问题。
RE:USART接受数据时丢包
if (USART_RX_STA < NEMA_CHAR_MAX)
{
GPS_NEMA[NEMA_count].buffer[USART_RX_STA++] = res1;
}
else
USART_RX_STA=0;
回复:USART接受数据时丢包
这个问题很可能是由于接收计数器小于缓冲区引起的。代码改成下面的:
if (USART_RX_STA < NEMA_CHAR_MAX)
{
GPS_NEMA[NEMA_count].buffer[USART_RX_STA++] = res1;
}
else
USART_RX_STA=0;
谢谢,按照你说的问题解决了